Реактивный ранец Бесконечная прокрутка конфликтует с предустановленными сообщениями темы пользовательские сообщения на странице


У меня есть текущая функция в моей теме, использующая pre_get_posts, в настоящее время прямо в нижней части моей темы functions.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 задается в разделе "Страницы блога показывают не более __ сообщений" в Настройках → Чтение).

Вышеуказанная функция работает нормально, когда Бесконечная прокрутка реактивного ранца отключена.

Проблема я хочу использовать бесконечную прокрутку Jetpack с архивом "mytheme_portfolio". И когда он активирован, вышеуказанная функция перестает работать, и Бесконечная прокрутка использует номер "Страницы блога показывают не более 5 сообщений" в настройках → Чтение при загрузке новых сообщений. В остальном Бесконечная прокрутка работает нормально, но мне нужно показывать 20 сообщений на странице, а не 5, если я нахожусь на странице архива mytheme_portfolio!

Мой код настройки реактивного ранца выглядит следующим образом, просто для справки:

    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' );

Большое спасибо за любую помощь любой может дать!

РЕДАКТИРОВАТЬ: Я нашел строку в коде плагина 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?

Author: Sarah, 2013-12-26

1 answers

Вы указали приоритет 1 для своей функции pre_get_posts здесь:

add_action( 'pre_get_posts', 'mytheme_portfolio_archive_pages', 1 );

Реактивный ранец не определяет приоритет:

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 );
 3
Author: Milo, 2013-12-26 18:39:56