问题描述
我正在使用 pre_get_posts
来调整我主页上显示的帖子数量。
function lifelounge_query_adjust( $query ) {
if ( is_home() ) {
set_query_var( 'posts_per_page', 12 );
return;
}
}
add_filter( 'pre_get_posts', 'lifelounge_query_adjust' );
但是我遇到了一个粘贴帖子的问题。基本上,如果我有任何粘贴的帖子,查询将显示超过我指定的 12 个帖子,因为它会显示 12 加上任何粘贴的帖子。当然,我可以忽略粘贴的帖子:
function lifelounge_query_adjust( $query ) {
if ( is_home() ) {
set_query_var( 'posts_per_page', 1 );
set_query_var( 'ignore_sticky_posts', 1 );
return;
}
}
add_filter( 'pre_get_posts', 'lifelounge_query_adjust' );
但我不认为这是理想的。我认为粘贴的帖子应该包含在 12 个帖子的限制内,而不是添加到限制。这是对我来说最有意义的。有办法实现吗?我做了一个 face-palm-worthy 错误?
几乎是一个重复的:Sticky Posts & Posts Per Page,但这是非常关闭,太本地化了。我不同意,显然是因为我正在寻找一个答案,也是因为这是一个问题,为什么 WordPress 似乎不尊重 posts_per_page
限制,如果你使用粘贴的帖子。如果你想要每页 12 个帖子,你应该得到 12,而不是 13,这是你会得到,如果你有一个粘贴的帖子。
最佳解决方案
这是一个通过获取粘性帖子数量 (如果有的话) 来解释粘贴帖子的方法,并将其包含在计算 posts_per_page
参数中:
add_action('pre_get_posts', 'ad_custom_query');
function ad_custom_query($query) {
if ($query->is_main_query() && is_home()) {
// set the number of posts per page
$posts_per_page = 12;
// get sticky posts array
$sticky_posts = get_option( 'sticky_posts' );
// if we have any sticky posts and we are at the first page
if (is_array($sticky_posts) && !$query->is_paged()) {
// counnt the number of sticky posts
$sticky_count = count($sticky_posts);
// and if the number of sticky posts is less than
// the number we want to set:
if ($sticky_count < $posts_per_page) {
$query->set('posts_per_page', $posts_per_page - $sticky_count);
// if the number of sticky posts is greater than or equal
// the number of pages we want to set:
} else {
$query->set('posts_per_page', 1);
}
// fallback in case we have no sticky posts
// and we are not on the first page
} else {
$query->set('posts_per_page', $posts_per_page);
}
}
}
Edit
在我们希望设置的页面数量小于或等于粘性帖子数量的情况下,我将 posts_per_page
设置为 1,这将导致 13 个或更多帖子 $sticky_count + 1
(在这种情况下) 仅在第一页 (后续页面将有 12 个帖子) 。也许这是可以的,因为这种情况是罕见的,第一页上的+1 帖子可能不那么重要。
这是因为 Wordpress 将首先显示所有粘贴的帖子 (第一页),即使它们的数量大于 posts_per_page 参数,因此我们将 posts_per_page 设置为 1 的最小量,因为 0 和负值将禁用 posts_per_page 参数,这将使 Wordpress 显示第一页上的所有帖子。
参考文献
注:本文内容整合自 google/baidu/bing 翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:gxnotes#qq.com(#替换为 @) 。