Вопрос или проблема
Я пытаюсь изменить количество постов на странице для архивных страниц, содержащих закрепленные записи категории (добавленные с помощью плагина Category Sticky post).
Для этого я использую хук pre_get_posts
и попробовал следующее:
add_action( 'pre_get_posts', 'my_set_category_posts_per_page' );
function my_set_category_posts_per_page( $query ) {
global $wp_the_query;
if ( 'category_sticky_post' === $query->get( 'meta_key' ) && ! is_paged ) {
$query->set( 'posts_per_page', 8 );
}
return $query;
}
Я var_dump($query)
, и я получаю [meta_key] => category_sticky_post
в query_vars
, но не могу разобраться, как это использовать.
Еще одна идея — использовать что-то вроде этого:
function my_set_category_posts_per_page( $query ) {
$args = array(
array(
'key' => 'category_sticky_post',
'compare' => 'EXISTS'
)
);
$meta_query = new WP_Meta_Query($args);
if ( 'category_sticky_post' === $query->get('meta_query', $meta_query) && ! is_paged() ) {
$query->set( 'posts_per_page', 8 );
}
}
Как я могу изменить запрос только когда мета-ключ присутствует для записей в текущем запросе?
На основе данных из вашего Gist, следующее условие pre_get_posts
должно работать, чтобы ограничить ваши посты на странице.
add_action( 'pre_get_posts', 'my_set_category_posts_per_page' );
function my_set_category_posts_per_page() {
global $wp_query;
if ( 'category_sticky_post' === $wp_query->query_vars['meta_key'] ) {
$wp_query->set( 'posts_per_page', 8 );
}
}
Ответ или решение
Для того чтобы изменить количество постов на странице архивов, содержащих "липкие" посты категории (добавленные плагином "Category Sticky Post"), вы можете использовать хук pre_get_posts
. Ваша задача заключается в том, чтобы правильно настроить запрос, чтобы он учитывал наличие мета-поля category_sticky_post
.
Ниже приведен корректный пример реализации, который должен решить вашу задачу:
add_action( 'pre_get_posts', 'my_set_category_posts_per_page' );
function my_set_category_posts_per_page( $query ) {
// Проверяем, является ли текущий запрос основным и не является пагинацией
if ( ! is_admin() && $query->is_main_query() && ! is_paged() ) {
// Проверяем, есть ли в запросе мета-ключ
if ( $query->get( 'meta_key' ) === 'category_sticky_post' ) {
// Устанавливаем количество постов на странице
$query->set( 'posts_per_page', 8 );
}
}
}
Объяснение кода:
-
Проверка контекста запроса: Мы убеждаемся, что не находимся в админке (
! is_admin()
) и что запрос является основным ($query->is_main_query()
), чтобы избежать влияния на другие запросы (например, виджеты или другие кастомные запросы). -
Проверка мета-ключа: Далее, мы проверяем, установлен ли мета-ключ
category_sticky_post
в текущем запросе. Если он есть, мы меняем количество постов на странице на 8 ($query->set( 'posts_per_page', 8 );
). -
Функция
is_paged()
: Мы используем! is_paged()
, чтобы не изменять количество постов на вторых и последующих страницах, таким образом, количество постов будет изменяться только на первой странице.
Примечания:
- Убедитесь, что кепширование или оптимизация вашего сайта не влияют на отображение постов, потому что в некоторых случаях стоит очистить кэш после внесения изменений.
- Если вы хотите дополнительно проверять определенные категории или другие условия, вы можете добавить дополнительные проверки к условиям.
Используя этот код, вы сможете корректно изменять количество постов на страницах архивов в зависимости от наличия мета-ключа. Не забудьте протестировать код на вашем сайте, чтобы убедиться, что все работает как ожидается.