WP_Query在上个月获得了大多数观看次数

时间:2015-04-05 17:49:56

标签: wordpress

我想通过WP_Query获取过去30天内观看次数最多的帖子。

我试过了:

$popularpost = new WP_Query( 
array( 
    'posts_per_page' => 6, 
    'meta_key' => 'wpb_post_views_count', 
    'orderby' => 'meta_value_num', 
    'order' => 'DESC'),
));

但是没有时间范围。如果我添加date_query选项,它只显示在此期间发布的那些帖子,但我想要这段时间的观点。

'date_query' => array(
    'after' => date('Ymd', strtotime("-30 days"))
)

是否可以选择在没有额外插件的情况下获得观看次数最多的帖子?

1 个答案:

答案 0 :(得分:1)

所以,我在考虑如何做到这一点,我想到了一个解决方案。我开始写下来以便更好地理解这个过程,最后我编写了所有的代码。 :)

尚未完全测试,它肯定可以改进,但它是理解逻辑的开始。所以这就是:


过去30天内最常见的帖子

我复制了this tutorial的部分内容,将帖子视图的计数器保存为postmeta。需要跟踪时间,我添加了一个数组作为postmeta,其中包含上个月每一天的帖子视图。

// detect post views count and store it as a custom field for each post
function so29460362_set_post_views( $postID ) {
    $days  = get_post_meta($postID, 'so29460362_post_views_count_days', true);
    $today = date('Ymd');
    // update today's counter
    $days[$today] = isset($days[$today]) ? $days[$today]+1 : 1;
    update_post_meta($postID, 'so29460362_post_views_count_days', $days);
    update_post_meta($postID, 'so29460362_post_views_count', array_sum($days));
}
//To keep the count accurate, lets get rid of prefetching
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);

每次加载一个帖子时都会调用上一个函数:

function so29460362_track_post_views ( $post_id ) {
    if ( !is_singular( 'post' ) ) return;
    if ( empty($post_id) )
        $post_id = $GLOBALS['post']->ID;
    so29460362_set_post_views($post_id);
}
add_action( 'wp_head', 'so29460362_track_post_views');

好的,直到现在它每天为每个帖子保存一个不同的视图计数器,但我们只需要过去30天,所以这就是诀窍:每天一次我们将删除超过30天的所有计数器。< / p>

我们可以通过设置每日预定活动来实现这一目标:

// schedule cleanup old days data
add_action('init', 'so29460362_schedule_daily_cleanup');

function so29460362_schedule_daily_cleanup(){
    //check if event scheduled before
    if(!wp_next_scheduled('so29460362_daily_cleanup_cronjob'))
        //shedule event to run after every day
        wp_schedule_event(time(), 'daily', 'so29460362_daily_cleanup_cronjob');
}  

现在我们可以将清理功能添加到该cron作业事件中:

add_action('so29460362_daily_cleanup_cronjob', 'so29460362_daily_cleanup');

function so29460362_daily_cleanup(){
    // get all published posts ids
    $posts = new WP_Query( array('posts_per_page' => -1, 'fields' => 'ids') );
    // date 30 days ago
    $clean_from_date = date('Ymd', strtotime('-30 days'));
    // for every post delete old counters
    foreach ($posts->posts as $postID) {
        $days = get_post_meta($postID, 'so29460362_post_views_count_days', true);
        if(!empty($days)) {
            foreach($days as $date => $views)
                if($date < $clean_from_date)
                    unset($days[$date]);
            update_post_meta($postID, 'so29460362_post_views_count_days', $days);
            update_post_meta($postID, 'so29460362_post_views_count', array_sum($days));
        }
    }
}

就是这样。现在,我们可以使用此查询获得最常见的帖子:

$popularposts = new WP_Query( array(
    'meta_key' => 'so29460362_post_views_count',
    'orderby' => 'meta_value_num',
    'order' => 'DESC'
) );

正如我所说,它需要经过全面测试,所以如果您发现错误,请告诉我。