是否使用分页和orderby自定义WP_COMMENT_QUERY?

时间:2017-04-12 作者:Swen

我正在尝试设置自定义WP_Comment_Query 按元键排序。(值得一提的是,这些注释是通过AJAX检索的。)

在我将分页添加到查询参数之前,一切都很好。

$orderby = \'top-comments\';

$args = array(
    \'post_id\' => $post_id,
    \'type\' => \'comment\',
    \'status\' => \'approve\',
    \'hierarchical\' => true
);

if ( $orderby == \'top-comments\' ) {
    $args[\'meta_key\'] = \'comment_rating\';
    $args[\'orderby\'] = \'meta_value_num\';
    $args[\'order\'] = \'ASC\';
}

// $comments_query = new WP_Comment_Query;
// $comments = $comments_query->query($args);

// Works fine up until I add the pagination args

$number = 5;
$paged = 1;

$args[\'number\'] = $number;
$args[\'paged\'] = $paged;

$comments_query = new WP_Comment_Query;
$comments = $comments_query->query($args);

// Gets the 5 latest comments, then orders those by meta_key
没有分页参数的结果工作得很好,并且按我想要的方式排列注释。

但是,一旦设置了number参数,它将检索最新的5条注释,然后按排序meta_key => \'comment_rating\'.

我期望的行为是WP\\u Comment\\u Queryfirst 应用orderby,以及then 返回前5个结果。

我做错了什么?

2 个回复
最合适的回答,由SO网友:Swen 整理而成

目标是对注释分页,以最高的comment_rating 元值优先。

多亏了cjbj的回答以及米洛和比吉尔的评论,我找到了这个问题的非直观解决方案。

通过使用numberoffset 我能够按正确的顺序生成结果,但分页很奇怪,每5篇文章似乎都在每一页上“翻转”。

这是我的解决方法,产生了一个评论列表,从评分最高的第一个开始,评分最低的最后一个开始。

$orderby = \'top-comments\';

$args = array(
    \'post_id\' => $post_id,
    \'type\' => \'comment\',
    \'status\' => \'approve\',
    \'hierarchical\' => true
);

if ( $orderby == \'top-comments\' ) {
    $args[\'meta_key\'] = \'comment_rating\';
    $args[\'orderby\'] = \'meta_value_num\';
    $args[\'order\'] = \'ASC\';
}

// 5 Comments per page
$comments_per_page = $number = 5; 

// Get the comment count to calculate the offset
$comment_count = wp_count_comments($post_id)->approved;

// Currently page 1 (set with AJAX in my case)
$page = 1;

// Rather unintuitively, we start with the total amount of comments and subtract
// from that number 
// This is nessacary so that comments are displayed in the right order
// (highest rated at the top, lowest rated at the bottom)

// Calculate offset
$offset = $comments_count - ($comments_per_page * $page);

// Calculate offset for last page (to prevent comments being shown twice)
if ( $offset < 0 ) {
    // Calculate remaining amount of comments (always less than 5)
    $comments_last_page = $comments_count % $comments_per_page;

    // New offset calculated from the amount of remaining comments
    $offset = $offset + $comments_per_page - $comments_last_page;

    // Set how many comments the last page shows
    $number = $comments_last_page; 
}

// Then we pass the $number and the $offset to our query args
$args[\'number\'] = $number;
$args[\'offset\'] = $offset;

$comments_query = new WP_Comment_Query;
$comments = $comments_query->query($args);

// Result: 5 comments, starting with the highest rating at the top, and the
// lowest rated at the bottom

SO网友:cjbj

如果你看看wp_comment_query 类,您将看到没有参数paged. 如果你看wp_list_comments, 它允许分页,您将看到它调用lengthy walker function 实现注释分页。

所以,如果您想自己进行注释分页,您需要进行一些非平凡的编程。基础将是numberoffset 参数可用于wp_comments_query. 如果希望每页有五条注释,则需要以下参数:

page 1: offset=0, number=5
page 2: offset=5, number=5
page 2: offset=10, number=5
基本上,您必须从query_var 然后计算所需的偏移量。注意,也没有max_num_pages 中的参数wp_comment_query, 因此,很难知道您的选择中有多少评论。

每次只需检索完整的注释列表并用PHP而不是在查询中解决分页问题可能会更容易。

相关推荐

Count posts for pagination

我正在为一个网站分页<;上一页(页码)下一页>很简单,已经完成。但是现在我需要添加一个选择器来直接转到页面(例如:转到第7页),要这样做,我需要知道有多少页面,为此我需要计算在查询中找到了多少帖子。问题是这个网站有太多的帖子(>13.000),查询所有帖子都会减慢页面加载速度,这就像。。。10秒后页面才能加载。显然,这是不可接受的。分页解决了这个问题,因为一次只加载50或100篇文章,但我无法将它们全部计算在内。我可以在不加载的情况下统计某个查询中的帖子吗?或者我可以通过其他方式获得页数吗