在特定的时间范围内拉出“热门帖子”

时间:2015-07-05 作者:Kelvin Farrell

我想在一个网站上显示每周的“热门帖子”列表。目前,该列表显示了一个“热门帖子”栏,但这些帖子没有特定的时间范围。它显示了网站开始时最受欢迎的帖子。

这是我的密码。。。

// Track post view count for popular posts
function track_post_view( $post_id ) {
$count_key  = \'post_views_count\';
$count      = get_post_meta( $post_id, $count_key, true );

if( ! $count ) {
    $count = 0;
}

return update_post_meta( $post_id, $count_key, ++$count );
}

// Get popular posts
function get_popular_posts( $limit = 3 ) {
// WP_Query arguments
$args = array (
    \'post_type\'             => \'post\',
    \'post_status\'           => \'publish\',
    \'posts_per_page\'        => $limit,
    \'order\'                 => \'DESC\',
    \'orderby\'               => \'meta_value\',
    \'meta_key\'              => \'post_views_count\',
    \'meta_type\'             => \'NUMERIC\',
);

// The Query
$popular = new WP_Query( $args );

// Restore original Post Data
wp_reset_postdata();

return $popular;
}
那么,这可行吗?如果是这样的话,有人能提出一种方法吗?我已经仔细研究了各种类似的问题,但没有找到具体的答案。

提前谢谢。

1 个回复
SO网友:cameronjonesweb

最好的方法是设置一个自定义表。对于每个视图,您将添加一个新行,其中至少包含uid、帖子id和日期/时间。这种方法的美妙之处在于,您可以在每个视图中存储任意多的数据,例如IP或当前用户(如果他们已登录)。我真的不能给出比这更多的建议,因为我从未尝试使用自定义表,但是有很多插件可以做到这一点。The codex article can be found here.

另一种方法是使用post-meta,类似于您的操作方式。您要做的是存储一个查看时间数组。这样,您就不必存储视图计数,尽管我确信您希望保留旧数据以用于记录。然而,这最终会导致一个非常臃肿的函数试图对您的帖子进行排序。

我已经完成了下面的一些代码,理论上应该可以工作,但我还没有机会测试它。

//Track page view
function track_post_view( $post_id ) {
    $views_key  = \'post_views_times\';
    $views = get_post_meta( $post_id, $views_key, true );
    $count = count( $views );

    if( $count === 0 ) {
        $views = array();
    }

    //Adds another entry to the views with the current UNIX timestamp
    $views[] = time();

    return update_post_meta( $post_id, $views_key, $views );
}

//Get all posts

function get_popular_posts( $limit = 3 ) {

    $all_posts = new WP_Query( \'post_type\' => \'post\', \'post_status\' => \'publish\' );

    //Store these posts
    while($all_posts->get_posts()){
        $all_posts->the_post();
        $post_views = get_post_meta( get_the_ID(), \'post_views_times\' );
        $week_ago_time = time() - 7 * 24 * 60 * 60; //This is the timestamp of 1 week ago
        for( $i = 0; $i < count( $post_views ); $i++ ){
            if( $post_views[$i] < $week_ago_time ){ 
                unset($post_views[$i]); //If the timestamp is less than 1 week ago get remove it from the variable
            }
        }
        $posts_list[] = array( \'views\' => count( $post_views ), \'post_id\' => get_the_ID() );
    }

    //Get the column to sort the $posts_list by
    foreach ($posts_list as $key => $row) {
        $views[$key]  = $row[\'volume\'];
    }

    array_multisort( $views, SORT_DESC, $posts_list ); //This sorts descending by views.

    //Get the top 3 viewed posts and store that it yet another array
    for( $i = 0; $i < $limit; $i++ ){
        $most_viewed_ids[] = $posts_list[$i][\'post_id\'];
    }

    $popular = new WP_Query( \'p\' => $most_viewed_ids ); //Run a query getting our 3 top posts

    wp_reset_postdata();

    return $popular;

}
我希望这个答案在某种程度上有所帮助

结束