我想通过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"))
)
是否可以选择在没有额外插件的情况下获得观看次数最多的帖子?
答案 0 :(得分:1)
所以,我在考虑如何做到这一点,我想到了一个解决方案。我开始写下来以便更好地理解这个过程,最后我编写了所有的代码。 :)
尚未完全测试,它肯定可以改进,但它是理解逻辑的开始。所以这就是:
我复制了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'
) );
正如我所说,它需要经过全面测试,所以如果您发现错误,请告诉我。