Реактивный ранец Бесконечная прокрутка конфликтует с предустановленными сообщениями темы пользовательские сообщения на странице
У меня есть текущая функция в моей теме, использующая 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?
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 );