Post rank by views

时间:2014-10-10 作者:kytdesigner

我想显示:Post id 5有100个视图,排名第二,Post id 6有90个视图,排名第四,Post id 7有1100个视图,排名第一

我尝试:

$query="SELECT u.*,um.post_id, FIND_IN_SET(
                      um.post_id,(SELECT GROUP_CONCAT( um.post_id ORDER BY um.meta_value * 1 DESC)
                              FROM $wpdb->postmeta
                              WHERE um.meta_key =\'views\')
                           ) AS rank
        FROM $wpdb->postmeta um
        JOIN $wpdb->posts u ON(u.ID = um.post_id)
        WHERE u.post_type = \'post\' AND u.post_status = \'publish\' AND u.ID = \'".$post_id."\'
        ";
但不工作(返回false),请帮助我。

2 个回复
SO网友:Robert hue

您使用$wpdb有什么具体原因吗?你也可以这样做WP_Query 这始终是推荐的。

因此,如果计算帖子浏览量的元键是views 然后你可以运行这个WP_Query 返回顶部查看的帖子。您还可以通过以下方式限制结果posts_per_page.

<?php

    $args = array(
        \'post_type\' => \'post\',
        \'post_status\' => \'publish\',
        \'meta_key\' => \'views\',
        \'orderby\' => \'meta_value_num\',
        \'ignore_sticky_posts\' => 1,
        \'posts_per_page\' => \'30\',
    );

    $my_query = new WP_Query( $args );

    if ( $my_query->have_posts() ) :

        $postnum = 1;

        while ( $my_query->have_posts() ) : $my_query->the_post();

            echo "Post id " . $post->ID . " has " . get_post_meta( $post->ID, \'views\', true ) . " views and rank is " . $postnum . ".<br />";
            $postnum++;

        endwhile;

    endif;

    wp_reset_postdata();

?>

EDIT 1

好了,现在我明白你在问什么了。您希望获得每个帖子的排名,并在帖子列表中显示它。首先,我们需要按视图对所有帖子进行排序,并将其存储在一个数组中。之后,在每个帖子中,我们需要找出每个帖子在排名数组中的位置。

首先,我们将在中定义全局变量functions.php 文件

$rank_array = array();
现在,在您的模板中,我们将运行一个自定义WP\\U查询以获取秩数组。将此添加到某个位置。必须在循环之外,并且必须位于显示这些帖子的主题php文件上。

global $rank_array;

$args = array(
    \'post_type\' => \'post\',
    \'meta_key\' => \'views\',
    \'orderby\' => \'meta_value_num\',
    \'posts_per_page\' => -1,
    \'ignore_sticky_posts\' => 1,
    \'fields\' => \'ids\',
);

$rank_query = new WP_Query( $args );
$rank_array = $rank_query->posts;
现在,我们在我们的$rank_array 大堆

现在,在您输出帖子列表的循环中。你需要找到每个帖子的ID排名。这必须在循环中使用。

global $rank_array;
$item_rank = array_search( $post->ID, $rank_array ) + 1;
echo "Rank: " . $item_rank . " with " . get_post_meta( $post->ID, \'views\', true ) . " views";

SO网友:Pieter Goosen

如果作业可以由主查询完成,则不应使用SQL查询,pre_get_posts 或者自定义查询,所以我将使用不涉及SQL的解决方案。我想@Roberthue的答案差不多就在那里了,所以我只想扩展一下,应该这样对待。

我认为最好的方法是首先使用meta_query 在里面WP_Query. 从那里,您可以使用uasort 根据帖子ID对帖子进行排序uasort 是保留数组键,因为数组键将用作帖子的排名参数。这里需要记住的一点是,数组键从0, 因此,您需要添加1 每一把钥匙。

代码如下:

$args = array(
    \'post_type\' => \'post\',
    \'meta_key\' => \'views\',
    \'orderby\' => \'meta_value_num\',
    \'nopaging\' => true,
    \'ignore_sticky_posts\' => 1,
    \'fields\' => \'ids\',
);
$query = new WP_Query( $args );
$post_ranks = $query->posts;

uasort( $post_ranks, function( $a, $b ){
    if ($a == $b) {
        return 0;
    }
        return ($a < $b) ? -1 : 1;  
    } 
);

foreach ($post_ranks as $key=>$post ) {
    $rank = $key + 1;
    $views = get_post_meta( $post, \'views\', true );

    echo "Post ID " . $post . " has " . $views . " views and is ranked #" . $rank  . ".<br />";
}
这是预期输出

enter image description here

结束

相关推荐

WP_POST_LIST_TABLE::GET_VIEWS-是否有过滤器的帖子计数帐户?

朝向编辑的顶部。php屏幕有一个列表,显示post状态以及post计数。我相信这是由WP\\u Post\\u List\\u Table::get\\u views生成的。例如All (7) | Published (6) | Draft (1)不幸的是,这些post计数不符合过滤器。我正在使用pre_get_posts 排除某些帖子。尽管用户只能看到四篇帖子,但这些数字仍然反映了帖子总数。我想看看All (4) | Published (3) | Draft (1) 我似乎找不到覆盖这些数字的操作/过