Аргументы WP_Query: рубрики и теги

В предыдущих статьях из этой серии мы успели познакомиться со структурой класса WP_Query, а также его параметрами и методами. Теперь пришло время понять, как использовать различные аргументы.

Сегодня я бы хотела познакомить вас с двумя типами аргументов: для рубрик и тегов.
Аргументы для этих двух таксономий схожи, но все-таки отличаются, и чтобы эффективно их использовать, важно понимать эту разницу.

Вспоминаем, как работают аргументы в WP_Query

Когда вы используете WP_Query в темах оформления или плагинах, приходится включать в код четыре основных элемента:

  • Аргументы запроса, в которых используются параметры, с которыми мы познакомимся в сегодняшней статье;
  • Сам запрос;
  • Цикл;
  • Завершающий этап: сброс данных записи.

На практике это выглядит следующим образом:

<?php

$args = array(
    // Аргументы для вашего запроса
);

// Произвольный запрос
$query = new WP_Query( $args );

// Проверка наличия результатов запроса
if ( $query->have_posts() ) {

    // начало цикла обработки данных из результатов запроса
    while ( $query->have_posts() ) {

        $query->the_post();

        // содержимое опрашиваемой записи

    }

}

// восстановление исходных данных записи
wp_reset_postdata();

?>

Аргументы сообщают WordPress, какие данные нужно извлекать из базы данных. Давайте сосредоточим внимание на самом начале кода:

$args = array(
    // Аргументы для вашего запроса
);

Как видно, аргументы заключены в массив.

Создаем код для аргументов

Аргументы задаются в массиве следующим образом:

$args = array(
    'parameter1' => 'value',
    'parameter2' => 'value',
    'parameter3' => 'value'
);

Вам следует заключать параметры и их значения в одинарные кавычки, а также использовать => между ними. Аргументы разделяются запятой. Если здесь что-то сделать неправильно, то WordPress может опросить не все указанные вами аргументы, и в итоге ничего не выведется на экран.

Параметры категорий

Давайте начнем с параметров категорий:

  • cat (int): используем id категории;
  • category_name (string): используем slug категории (не name);
  • category__and (array): используем id категории;
  • category__in (array): используем id категории;
  • category__not_in (array): используем id категории.

Учтите, что ни в одном из приведенных случаев мы не используем название категории. Даже в параметре category_name в качестве значения используется slug. Я предпочитаю использовать именно этот параметр, а не ID, так как это позволит быстрее разобраться в готовом коде позже, если возникнет необходимость что-нибудь изменить.

Но если вам кажется, что редакторы или модераторы вашего сайта могут изменить slug категории в будущем, то рекомендую вам использовать ID.

Параметр cat

Параметр cat довольно простой: в нем используется ID отдельной категории или строка, состоящая из ID нескольких рубрик. Запрос к отдельной категории выглядит следующим образом:

$args = array(
    'cat' => '12'
);

Запрос к нескольким категориям:

$args = array(
    'cat' => '12, 13, 14'
);

Приведенные выше запросы сообщают WordPress о необходимости извлекать записи только из определенной или определенных категорий. Если вам нужно найти записи во всех категориях, то следует использовать параметр category_and.

Параметр cat также можно использовать для поиска записей в определенной категории, исключив какую-то другую. Для этого нужно поставить минус перед ID исключаемой категории:

$args = array(
    'cat' => '12, -13'
);

Приведенный выше запрос направлен к записям категории 12, но не к постам категории 13.

Параметр category_name

В параметре category_name используется slug, а не name. Можно использовать его как для отдельной категории, так и для нескольких. Или находить записи, находящиеся в этих категориях.

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

$args = array(
    'category_name' => 'my-slug'
);

Поиск записей в одной или нескольких категориях:

$args = array(
    'category_name' => 'my-slug, your-slug, another-slug'
);

Как и в случае с параметром cat, этот запрос не направлен к записям, находящимся во всех категориях, но позволяет находить записи из любой указанной рубрики.

Параметр category__and

Если вам нужно найти записи во всех категориях из массива, то следует использовать этот параметр. В качестве значения он принимает ID рубрик. В приведенном ниже примере производится поиск постов из трех перечисленных категорий:

$args = array(
    'category__and' => array(
        '12',
        '13',
        '14'
    )
);

Учтите, что параметр использует массив, а не строку запроса. Обратите внимание, что в названии параметра используется сразу два знака подчеркивания. Если вы напишите только один знак, то параметр не будет работать.

Параметр category__in

Позволяет находить записи из одной или более категорий в массиве. Он работает по тому же принципу, что и параметр cat: использует ID рубрик в качестве значения.

Запрос к одной или нескольким категориям из массива:

$args = array(
    'category__in' => array(
        '12',
        '13',
        '14'
    )
);

Приведенный выше код позволит извлечь записи из одной или нескольких категорий.

Параметр category__not_in

Параметр category__not_in осуществляет запрос записей, которые не находятся в определенной категории из массива.

Чтобы исключить записи из определенной категории, следует использовать следующий код:

$args = array(
    'category__not_in' => '12'
);

Исключение записей, находящихся в категориях из массива:

$args = array(
    'category__not_in' => array(
        '12',
        '13',
        '14'
    )
);

Приведенный выше код исключает записи, которые находятся в любой из отмеченных категорий.

Параметры тегов

Существуют следующие параметры тегов:

  • tag (string): используем slug тега;
  • tag_id (int): используем id тега;
  • tag__and (array): используем несколько id тегов;
  • tag__in (array): используем несколько id тегов;
  • tag__not_in (array): используем несколько id тегов;
  • tag_slug__and (array): используем slug тегов;
  • tag_slug__in (array): используем slug тегов.

Параметр tag

Параметр tag в качестве значения использует slug тега, и его можно использовать для поиска записей с одним установленным тегом или при помощи строки запроса с несколькими тегами.

Чтобы найти записи с одним тегом, используется код:

$args = array(
    'tag' => 'my-tag'
);

Поиск сообщений с тегами из массива:

$args = array(
    'tag' => 'my-tag, your-tag, another-tag'
);

Приведенный выше код выполняет запрос записей, в которых используется любой из тегов в массиве, а не сразу все указанные.

Параметр tag_id

Параметр tag_id работает по принципу параметра cat: использует ID тега, и его можно использовать как с одним, так и с несколькими тегами. Чтобы найти записи с отдельным тегом, можно использовать следующий код:

$args = array(
    'tag_id' => '21'
);

Чтобы найти записи с одним и более ID тегов, нужно воспользоваться этим кодом:

$args = array(
    'tag_id' => '21, 22, 23'
);

tag_id также можно использовать для исключения тегов как при работе с отдельными тегами, так и с несколькими. Чтобы осуществить запрос всех записей, за исключением тех, где имеется определенный тег, нужно использовать следующий код:

$args = array(
    'tag_id' => '-21'
);

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

$args = array(
    'tag_id' => '21, -22, 23'
);

Приведенный выше код выполняет запрос записей с тегами 21 или 23, но без тега 22.

Параметр tag__in

Этот параметр позволяет находить записи с одним или более тегом из массива. Он работает по тому же принципу, что и tag:

$args = array(
    'tag_in' =>  array(
        '21',
        '22',
        '23'
    )
);

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

Параметр tag__not_in

tag__not_in позволяет делать запрос записи, в которой отсутствует определенный тег или теги из массива.

Чтобы исключить из поиска записи с определенным тегом, используйте следующий код:

$args = array(
    'tag__not_in' => array( '21' )
);

Учтите, что вам все равно нужно будет использовать массив, даже если вы работаете с каким-то конкретным тегом. Если нужно указать больше тегов, код должен быть таким:

$args = array(
    'tag__not_in' => array(
        '21',
        '22',
        '23'
    )
);

Этот код осуществляет запрос записей, в которых отсутствуют любые из приведенных выше тегов.

Параметры tag_slug__and и tag_slug__in

Эти два параметра работают абсолютно по тому же принципу, что и параметры tag__and и tag__in, за исключением того, что здесь вместо ID используются slug тегов.

Чтобы найти записи, в которых используются оба тега из пары, нужно использовать tag__slug_in:

$args = array(
    'tag_slug__in' => array(
        'my-tag',
        'your-tag',
        'another-tag'
    )
);

Этот код осуществляет поиск записей с любым из этих тегов. Вы также можете использовать параметр tag со строкой запроса, состоящей из коротких имен тегов, и получите тот же результат. Чтобы включить записи со всеми указанными тегами, используйте параметр tag_slug__and следующим образом:

$args = array(
    'tag_slug__and' => array(
        'my-tag',
        'your-tag',
        'another-tag'
    )
);

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

В завершение

Используя приведенные выше параметры и комбинируя их, вы сможете создавать многофункциональные аргументы, и извлекать необходимые вам данные.

Перевод статьи “WP_Query Arguments: Categories and Tags” был подготовлен дружной командой проекта Сайтостроение от А до Я.