WordPress非插件非评论方式实现热门文章列表

2012/08/31

WordPress中默认情况下是无法实现热门文章的,目前比较通用的实现热门文章有两种办法:一是实现使用wp-postviews插件的方式实现,但是这种方式在使用了缓存插件会失效。二是采用伪热门方法,什么是伪热门,就是不是通过靠点击数来实现,而是通过评论数来实现。显然这不是真正的热门文章列表。我们要通过点击数来提取热门文章列表。下面我们采用非插件非评论的方式来实现热门文章列表。

一、首先我们需要创建一个函数来记录文章浏览次数并以一个自定义字段保存起来。粘贴下面的代码到 functions.php 内:

<pre>function wpb_set_post_views($postID) {
    $count_key = 'wpb_post_views_count';
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        $count = 0;
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
    }else{
        $count++;
        update_post_meta($postID, $count_key, $count);
    }
}
//为了确保计数的精准度,剔除头部产生的预备代码
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);</pre>

接下来我们要做的是让每篇文章知道你在计数,所以我们需要把下面的代码粘贴进文章循环中:

<pre>wpb_set_post_views(get_the_ID());</pre>

如果你在使用子主题或明了一点,那么需要使用wp_head hook在头部添加tracker 。为了做到这点,需要把下面的代码添加到 functions.php 中:

<pre>function wpb_track_post_views ($post_id) {
    if ( !is_single() ) return;
    if ( empty ( $post_id) ) {
        global $post;
        $post_id = $post->ID;    
    }
    wpb_set_post_views($post_id);
}
add_action( 'wp_head', 'wpb_track_post_views');

完成了上面的工作后,每次有用户访问,自定义字段就会更新浏览次数。
注意: 如果你使用了缓存插件,上面的技术不起作用如 W3 Total Cache就会失效, 这个缓存插件采用的是局部缓存的技术,因此可以通过修改下面代码来其左右:

<pre><!-- mfunc wpb_set_post_views($post_id); --><!-- /mfunc -->

现在较酷的事情就是可以按浏览次数进行排序了,也可以显示浏览次数:

二、显示浏览次数

把下面的代码粘贴到functions.php 文件中:

<pre>function wpb_get_post_views($postID){
    $count_key = 'wpb_post_views_count';
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
        return "0 次";
    }
    return $count.' 次';
}

然后把下面的代码粘贴到single.php文件需要显示的地方:

<pre>wpb_get_post_views(get_the_ID());

三、按浏览次数显示热门文章,可以采用下面的代码:

<pre><?php 
$popularpost = new WP_Query( array( 'posts_per_page' => 4, 'meta_key' => 'wpb_post_views_count', 'orderby' => 'wpb_post_views_count', 'order' => 'DESC'  ) );
while ( $popularpost->have_posts() ) : $popularpost->the_post();

the_title();

endwhile;
?>

4 thoughts on “WordPress非插件非评论方式实现热门文章列表

      1. 额 这个肯定是要去掉的啊 基本的php语法我还是会的 但是那个统计点击数的效果都没有出来耶。 我是把以前自己写的一个统计的代码给完全删了(之前的和这个写法不同但是有效果,为了和点击排名的函数更好对接我就给删了从头开始) 换成这个之后就完全不出现了。求解

发表评论

邮箱地址不会被公开。 必填项已用*标注