问题描述

我正在使用 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(#替换为 @) 。