显示最受欢迎的日志可以将网站的精华展示给访客,希望借此更好的吸引用户停留在自己的网站。最受欢迎的日志可以是浏览次数最多的日志、评论数最多的日志或者综合浏览次数和评论数考虑后评分最高的日志。根据浏览次数排序只要安装WP PostViews插件,借助插件提供的Widget就可以实现。

如何显示按照评论数排序的文章列表

从WordPress查询posts数据大致有四种方法:

  • query_posts()
  • get_posts()
  • WP_Query
  • 自定义SQL查询语句

四种方法各有优劣,但绝对不推荐使用的就是query_posts(),具体原因可以参考文章《WP_Query、query_posts() 和 get_posts()应该在什么时候使用》。

get_posts()是WordPress获取Post的一个非常方便的API,只需要传递和query_posts()相同的参数就能获取posts信息。

自定义SQL查询需要你有一定的SQL基础,至少得会写SQL语句,对WordPress的数据表有基本的了解,但这种方法是性能最好的,因为你只需要获取你需要的字段,其它get_posts()会返回你需要的和你不需要的。

用自定义查询方式获取

//获取最多10条结果
$posts_num = 10;
/*获取最近一个月评论数最多的前10篇文章
 修改date("m")-1为date("m")-2意思是获取最近两个月的文章
*/
$lastmonth = gmdate("Y-m-d H:i:s",gmmktime(date("H"), date("i"), date("s"), date("m")-1,date("d"),date("Y")));
 
//用$wpdb->get_results()执行自定义SQL语句,并返回查询结果
$posts = $wpdb->get_results("SELECT id, post_title,comment_count 
        FROM $wpdb->posts 
        WHERE post_type='post' 
        AND post_status= 'publish' 
        AND  post_date < '$now' 
        AND post_date > '$lastmonth' 
        AND comment_status = 'open' 
        ORDER BY comment_count DESC 
        LIMIT $posts_num"); 
 
if($posts){
    echo "<ul>";
	foreach($posts as $post){
		$post_title = stripslashes($post->post_title);
		$guid = get_permalink($post->id);
?>
		<li><a href="<?php echo $guid; ?>" title="<?php echo $post_title; ?>"><?php echo $post_title; ?></a></li>
<?php 
	}
   echo "</ul>";
}

代码中需要知道几个数据:

获取多长时间内的数据,这里获取最近一个月的数据,取决于$lastmonth的值

显示多少篇文章,也就是SQL语句中要给limit赋的值,返回太多文章会造成性能问题

排序字段,既然要按照评论数多少排序,排序字段就是comment_count,要知道有多少字段可用打开wp_posts表看一看。

需要用到的方法

$wpdb class,使用方法参考WordPress $wpdb Class文档

用get_posts()获取文章

get_posts()是专门用来获取文章的WordPress API,参数与query_posts相同,且不影响全局变量,只是不能选择返回哪些字段。用get_posts()实现根据根据文章评论数显示最受欢迎日志的代码如下

//获取10条记录
$posts_num = 10;
//当前月份
$current_month = date('m');
//当前年份
$current_year = date('Y');
//需要给get_posts()传递的参数
$args = array(
	'numberposts' => $posts_num, 
	'orderby' => 'comment_count',
	'year' => $current_year, 
	'monthnum' => $current_month,
	'post_type' => 'post');
        $posts = get_posts( $args );

从代码中可以看出这个方法和第一种查询的结果是有区别的,第一种查询的是一个时间段,限制的是多少天而不是某个月份,而第二种查询的是仅限于某年某月中最受欢迎的文章,自定义查询的自由度比较大。

在WordPress中显示

如何在WordPress中显示这些数据呢?

硬编码到某个位置,比如文章结尾(single.php主循环结束后),或侧边栏(sidebar.php),做成shortcode,也可以用易用性更强的方法,将这段代码做成Widget,这样只要有sidebar的地方就可以不断重用这段代码。

要创建一个Widget,可以从WordPress的Widget API文档提供的示例代码开始,这段代码概括了创建Widget的步骤

//创建Widget要从扩展WP_Widget类开始
class My_Widget extends WP_Widget {
        //初始化Widget,告知WordPress Widget的名字和ID等信息 
	public function __construct() {
		// widget actual processes
	}
        //创建Widget选项表单,小工具自带的选项或者说用户界面就是这个函数创建的
 	public function form( $instance ) {
		// outputs the options form on admin
	}
        //如果Widget需要保存一些选项,例如标题等,这个方法负责存储数据
	public function update( $new_instance, $old_instance ) {
		// processes widget options to be saved
	}
        //最后,需要定义我们的Widget在前台如何显示
	public function widget( $args, $instance ) {
		// outputs the content of the widget
	}
 
}
//向WordPress注册我们的自定义Widget
register_widget( 'My_Widget' );

通过理解上述代码,我要做的事情就很明显了

echo $before_widget;
/* 你需要输出的内容 */
echo $after_widget;
  • 将My_Widget替换成我自己的Widget名称,例如叫Month_Popular_Widget
  • 我要保存两个选项:标题和显示多少篇文章,于是在form方法中创建一些input表单元素用于接收用户输入,在update方法中用Widget API存储数据
  • 将上述获取最受欢迎的日志的方法放到Widget的前台输出中,也就是widget方法

详细代码不再赘述,有兴趣的朋友请下载源代码示例,将文件放在主题根目录下,并引入到functions.php中即可在后台看见widget(Month Popular Widget)

//functions.php
include "month-popular-widget.php";
Month Popular Widget 已下载 195 次

结语

Widget是一个灵活且强大的工具,是一种模块化的方法,通过拖拽Widget就可以创造出不拘一格的页面布局,类似CMS系统。至于Widget可以显示哪些内容,有了自定义查询,可以获取我们想要的任何数据;有了post的ID,不仅可以输出文章名称,还可以输出作者信息、文章缩略图、评论数甚至浏览次数等信息,通过组合可以创造出各式各样的展示模块,就看你想象力够不够疯狂。

7条留言

  1. 如果不介意的话,我可以提供空间给你。和我的小站同一空间。

    1. 多谢多谢,兄弟太热情了。你用的共享主机吗?其实我买主机不是为了放博客,是为了当测试服务器,主机非买不可,博客不做白不做。看hostgator的reseller好长时间了,其实有意买这个,不过不确定速度咋样,所以打算再墨迹一段时间,吼吼。
      我不急着换主机,打算再观察一段时间,所以多谢你的好意哦,偶心里很热乎。
      不过你的主机到底是哪里的,我到现在也没弄明白呢?

      1. linode的VPS,http://www.linode.com, 搜下就知道,用过几个VPS,就它最好。我的马花藤 156329108,有空加我。

        1. 厉害,用VPS一定有不错的站吧,分享下哦。这个主机看起来不错,速度也很好,我之前没听说过,VPS价格蛮高的,你买的哪种plan?

  2. 新空间搞定了吗?

    1. 还么搞呢,在看哪个合适,总感觉所有的国外主机都有被屏蔽的可能,但国内的坚决不用

评论功能已关闭