问题描述
我的目标是分页 WP_Comment_Query()。看来这是禁忌,还是没有关于它的可行信息 online,没有什么。
为什么?可能吗?如果是这样,怎么样?
最佳解决方法
是的,这是可能的,但这是一个痛苦。
看看 codex page,只有注释的参数是 number
和 offset
。
我们需要这两个来创建我们的分页。
首先,我们设置 $paged
参数,它是当前页面:
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
然后显示数量的注释:
$number = 3;
之后,计算偏移量 (查询开始拉取注释的位置):
$offset = ( $paged - 1 ) * $number;
我们把它们全部放在 arguments 变量中:
// arguments to filter comments
$args = array(
'number' => $number,
'offset' => $offset,
'paged' => $paged
);
现在让我们点击查询并循环遍历:
// the query
$the_query = new WP_Comment_Query;
$comments = $the_query->query( $args );
// Comment Loop
if ( $comments ) {
foreach ( $comments as $comment ) {
echo '<p>' . $comment->comment_content . '</p><br><br>';
}
} else {
echo 'No comments found.';
}
优秀。现在我们可以测试将/page/2
添加到 URL 栏中,检查它是否可行。
唯一缺少的是添加分页链接,例如 next_posts_link()
功能。
问题是我还没有找到一种获得 max_num_pages
的方法。以下将通常在一个简单的 WP_Query 中工作:
$the_query->max_num_pages
但这不行。不知道最大页面数量,我们无法正确地创建分页链接。请注意,count($comments)
将只给我们每页的评论总数 ($number
) 。
就个人而言,我通过根据我定位的查询计算最大页面来修复这个问题。我想获得用户 ID 的评论总量。所以我用这样的数字:
$maximum_pages = $user_total_comments / $number;
这在我的情况下工作,但我们绝对需要一种方法来获得 max_num_pages
。希望通过这个答案,它将激发某人解决最后一点。至少我们有更多关于 wp_comment_query()
分页的信息,比其他任何地方。
Update
所以剩下的问题是缺乏 max_num_pages
。一个解决方法是 count()
返回的数组,并检查它是否与 $number
(您在 number
数组键中设置的内容) 匹配,如下所示:
$tot_returned_comments = count($comments);
if ($number == $tot_returned_comments) {
echo '<a href="/comments/page/'%20.%20$nextpage%20.%20'">Next</a>';
}
除了最后一页与您在 $number
变量中设置的帖子数量完全相同,所有这些都适用。因此,如果将 $number
设置为 15,并且最终分页的页面有 15 个结果,则会显示下一个按钮。
现在,如果你不关心性能,你可以很容易地运行两个查询。一个你不限制结果,只是 count()
的结果,并将其用于 max_num_pages
值。
虽然这并不能解决 max_num_pages
的缺陷,但是对于 wp_comments_query()
来说,应该足够让您满足您的需求。
次佳解决方法
处理此问题的另一种方法是使用 get_comments()(或任何类似的查询) 来使用 paginate_links() 。具体要获得相当于 max_num_pages 的功能,您可以使用内置功能 wp_count_comments() 。
因此,要获得最大页数,您首先会生成所需的所有评论。假设你不想要未经批准的评论:
$all_comments = wp_count_comments();
$all_comments_approved = $all_comments->approved;
将 $ all_comments_approved 除以每页的评论数量,这是一件很简单的事情。所以,每页都有一个所需的”n” 评论:
//Adding one at the end as simple way of rounding up.
$max_num_pages = intval( $all_comments_approved / $comments_per_page ) + 1;
($ comments_per_page 的值应为 pre-set 为> 0,并且也用于主注释查询 – 见下文) 。
根据其他细节,完整的分页功能将如下所示。 (例如:有时候’base’ 选项会因 URL 中存在查询变量而变得更加棘手,我必须使用 preg_replace 来解决这个问题。)
$current_page = max(1, get_query_var('paged'));
echo paginate_links(array(
//check codex for how to work with get_pagenum_link and variations
'base' => get_pagenum_link(1) . '%_%',
'current' => $current_page,
'total' => $max_num_pages,
'prev_text' => __('« Previous'),
'next_text' => __('Next »'),
'end_size' => 2,
'mid-size' => 3
));
… 其余的是格式化输出… 和主要注释查询。后者将如下所示:注意,$ comments_per_page 对于检索的注释数量和计算偏移量至关重要。还要注意,检索到的对象的总大小受到数量 (以及’status’) 的限制。
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$offset = ($paged - 1) * $comments_per_page;
$comments = get_comments(array(
'status' => 'approve',
'number' => $comments_per_page,
'offset' => $offset
));
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。