在 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;
?>