Изменение запроса с помощью pre_get_posts(), если присутствует meta_key

Вопрос или проблема

Я пытаюсь изменить количество постов на странице для архивных страниц, содержащих закрепленные записи категории (добавленные с помощью плагина 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 );
        }
    }
}

Объяснение кода:

  1. Проверка контекста запроса: Мы убеждаемся, что не находимся в админке (! is_admin()) и что запрос является основным ($query->is_main_query()), чтобы избежать влияния на другие запросы (например, виджеты или другие кастомные запросы).

  2. Проверка мета-ключа: Далее, мы проверяем, установлен ли мета-ключ category_sticky_post в текущем запросе. Если он есть, мы меняем количество постов на странице на 8 ($query->set( 'posts_per_page', 8 );).

  3. Функция is_paged(): Мы используем ! is_paged(), чтобы не изменять количество постов на вторых и последующих страницах, таким образом, количество постов будет изменяться только на первой странице.

Примечания:

  • Убедитесь, что кепширование или оптимизация вашего сайта не влияют на отображение постов, потому что в некоторых случаях стоит очистить кэш после внесения изменений.
  • Если вы хотите дополнительно проверять определенные категории или другие условия, вы можете добавить дополнительные проверки к условиям.

Используя этот код, вы сможете корректно изменять количество постов на страницах архивов в зависимости от наличия мета-ключа. Не забудьте протестировать код на вашем сайте, чтобы убедиться, что все работает как ожидается.

Оцените материал
Добавить комментарий

Капча загружается...