Jetpack无限滚动与主题的PRE_GET_POSTS自定义POST_PER_PAGE冲突

时间:2013-12-26 作者:Sarah

我的主题当前函数使用pre_get_posts, 目前正处于我的主题功能的底部。php文件:

function mytheme_portfolio_archive_pages( $query ) {
    if ( is_admin() || ! $query->is_main_query() )
        return;

    if ( is_post_type_archive( \'mytheme_portfolio\' ) ) {
        // Display 20 posts for a custom post type called \'mytheme_portfolio\'
        $query->set( \'posts_per_page\', 20 );
        return;
    }
}
add_action( \'pre_get_posts\', \'mytheme_portfolio_archive_pages\', 1 );
这意味着如果当前存档是帖子类型,我每页有20篇帖子mytheme_portfolio, 而不是博客页面的默认值5(数字5在“设置阅读”中的“博客页面最多显示\\uuuuu帖子”中设置)。

当Jetpack无限滚动停用时,上述功能正常工作。

问题是我想使用Jetpack无限卷轴和“mytheme\\u公文包”存档。激活后,上述功能停止工作,无限滚动使用设置中的“博客页面最多显示5篇文章”编号→加载新帖子时阅读。无限卷轴在其他方面工作正常,但如果我在mytheme_portfolio 存档页面!

我的Jetpack设置代码如下,仅供参考:

    function mytheme_render_infinite_scroll() {
        while ( have_posts() ) : the_post();
                if (\'mytheme_portfolio\' == get_post_type() && !is_search()) :
                    get_template_part( \'content\', \'archive-portfolio\' );
                elseif ( is_search() ) :
                    get_template_part(\'content\',\'search\');
                else :
                    get_template_part( \'content\', get_post_format() );
                endif;
        endwhile;
    }

    function mytheme_jetpack_setup() {
        add_theme_support( \'infinite-scroll\', array(
            \'container\'      => \'content\',
            \'footer_widgets\' => \'footer-widgets\',
            \'type\'           => \'click\',
            \'render\'         => \'mytheme_render_infinite_scroll\',
            \'wrapper\'        => true,
            \'posts_per_page\' => false
        ) );
    }
    add_action( \'after_setup_theme\', \'mytheme_jetpack_setup\' );
非常感谢任何人能给予的帮助!

EDIT: 我在Jetpack插件代码中找到了一行冲突的代码,在jetpack/modules/infinite-scroll/infinity.php, 第26行。。。

function __construct() {
    add_action( \'pre_get_posts\',                  array( $this, \'posts_per_page_query\' ) );
    ...
对应于同一文件中的第449-452行:

function posts_per_page_query( $query ) {
    if ( ! is_admin() && self::archive_supports_infinity() && $query->is_main_query() )
        $query->set( \'posts_per_page\', self::get_settings()->posts_per_page );
}
如果我把第26行注释掉,我的函数就会工作。显然,我不想更改插件的文件,有没有办法确保我的主题posts_per_page 参数(上面的初始代码块)是使用的参数,而不是Jetpack?

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

您已为您的pre_get_posts 此处的功能:

add_action( \'pre_get_posts\', \'mytheme_portfolio_archive_pages\', 1 );
Jetpack未指定优先级:

add_action( \'pre_get_posts\', array( $this, \'posts_per_page_query\' ) );
因此,将添加默认优先级add_action, 这是10:

$优先级(int)(可选)用于指定与特定操作关联的函数的执行顺序。较小的数字对应较早的执行,具有相同优先级的函数按照它们添加到操作的顺序执行。默认值:10

因此,对于这些请求中的每一个,都会执行您的代码并将每页的帖子数设置为20,然后执行Jetpack的代码并用它自己的值覆盖您的值。

要解决此问题,只需指定较低的优先级,以便您的优先级稍后运行并覆盖Jetpack的:

add_action( \'pre_get_posts\', \'mytheme_portfolio_archive_pages\', 20 );

结束

相关推荐

Pagination for event query

我正在使用Modern Tribe Events Calendar我的问题是分页。这是对WP\\U查询分页的错误方式,还是有其他方法可以对事件日历分页?我找到了一个tutorial 这使用了WPNavi插件,但我想使用核心wordpress函数。<?php $upcoming = new WP_Query(); $upcoming->query( array( \'post_type\'=> \'tribe_events\', \'eve