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

Параметры таксономии

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

  • taxonomy (строка): таксономия.
  • field (строка): выбрать термин таксономии по параметрам ‘term_id’ (по умолчанию) ‘name’ или ‘slug’.
  • terms (число/строка/массив): термин(ы) таксономии.
  • include_children (логический): включить или нет дочерние термины иерархических таксономий. По умолчанию – true.
  • оperator (строка): оператор для тестирования. Возможные значения – ‘IN’ (по умолчанию), ‘NOT IN’, ‘AND’.

Тот факт, что у вас есть параметр оperator означает, что вам не нужно выбирать подходящий аргумент из всех существующих для того, чтобы определить включаете вы термины в запрос или исключаете (как в случае с категориями и метками). Вместо этого достаточно использовать один аргумент tax_query.

Если вам нужны несколько таксономий, можно использовать параметр relation, добавив его перед всеми массивами (по одному для каждой таксономии) со значениями AND или ORдля того чтобы определить, нужны вам записи со всеми терминами или с любым из них.

Давайте посмотрим, как все это выглядит на практике.

Получение одного термина таксономии

Это самый легкий вариант из всех возможных, здесь вы используете лишь один вложенный массив:

$args = array(
    'tax_query' => array(
        array(
            'taxonomy' => 'my-taxonomy',
            'field' => 'slug',
            'terms' => 'my-term-slug',
        )
    )
);

В этом фрагменте мы ищем записи из термина my-term-slug, который является элементом таксономии my-taxonomy. Обратите внимание, что здесь нужно использовать параметр field для определения поля, посредством которого вы идентифицируете термин. По умолчанию здесь используется ID термина. Для варианта по умолчанию код будет выглядеть следующим образом:

$args = array(
    'tax_query' => array(
        array(
            'taxonomy' => 'my-taxonomy',
            'terms' => '11'
        )
    )
);

Если вы используете этот вариант (ID термина), то впоследствии будет гораздо сложнее идентифицировать, что именно вы искали. Но, с другой стороны, это позволит вам избежать потенциальных проблем, если вы считаете, что ваши пользователи могут изменить слаги терминов.

Получение нескольких терминов одной таксономии

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

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

$args = array(
    'tax_query' => array(
        array(
            'taxonomy' => 'my-taxonomy',
            'terms' => array(
                '11',
                '12'
            )
        )
    )
);

А если вам нужны записи из всех указанных терминов? В этом случае внутрь вложенного массива вставьте параметр оperator:

$args = array(
    'tax_query' => array(
        array(
            'taxonomy' => 'my-taxonomy',
            'terms' => array(
                '11',
                '12'
            ),
            'operator' => 'AND'
        )
    )
);

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

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

$args = array(
    'tax_query' => array(
        array(
            'taxonomy' => 'my-taxonomy',
            'terms' => array(
                '11',
                '12'
            ),
            'operator' => 'NOT IN'
        )
    )
);

Здесь оператор AND мы заменили на NOT IN, это означает, что WordPress будет искать записи, которые не относятся к терминам, указанным в массиве.

Со всеми выше приведенными вариантами можно использовать слаги терминов, вместо идентификаторов. На практике это будет выглядеть так:

$args = array(
    'tax_query' => array(
        array(
            'taxonomy' => 'my-taxonomy',
            'field' => 'slug',
            'terms' => array(
                'my-slug',
                'your-slug'
            ),
            'operator' => 'NOT IN'
        )
    )
);

Если вы хотите найти записи из одного термина, среди указанных двух, используйте оператор IN (по умолчанию) со знаком минус перед идентификатором любого термина, который вы хотите исключить:

$args = array(
    'tax_query' => array(
        array(
            'taxonomy' => 'my-taxonomy',
            'terms' => array(
                '11',
                '-12'
            )
        )
    )
);

Здесь мы ищем записи из термина 11, и исключаем записи из термина 12.

Получение терминов нескольких таксономий

Если вы хотите работать с несколькими таксономиями, вам потребуется создать несколько массивов. Рассмотрим простейший пример: нам нужно найти записи из одного термина таксономии 1 и одного термина таксономии 2.

$args = array(
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'taxonomy1',
            'field' => 'slug',
            'terms' => array( 'slug-one' )
        ),
        array(
            'taxonomy' => 'taxonomy2',
            'field' => 'slug',
            'terms' => array( 'slug-two' )
        )
    )
);

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

  • Если вы используете значение параметра ‘relation’ => ‘AND’, WordPress будет извлекать записи, заданные в первом и втором массивах. В выше приведенном фрагменте мы запрашиваем записи и со слагом slug-one из taxonomy1, и со слагом slug-two из taxonomy2.
  • Если вы используете значение параметра ‘relation’ => ‘OR’, WordPress будет извлекать записи, выводимые или в первом массиве, или во втором. В этом случае вы получите записи либо со слагом slug-one, либо со слагом slug-two(либо с ними двумя).

В примере ниже мы ищем записи с любым из двух указанных слагов:

$args = array(
    'tax_query' => array(
        'relation' => 'OR',
        array(
            'taxonomy' => 'taxonomy1',
            'field' => 'slug',
            'terms' => array( 'slug-one' )
        ),
        array(
            'taxonomy' => 'taxonomy2',
            'field' => 'slug',
            'terms' => array( 'slug-two' )
        )
    )
);

Можно также запрашивать записи из более, чем одного термина данной таксономии

$args = array(
    'tax_query' => array(
        'relation' => 'OR',
        array(
            'taxonomy' => 'taxonomy1',
            'field' => 'slug',
            'terms' => array( 'slug-one' )
        ),
        array(
            'taxonomy' => 'taxonomy2',
            'field' => 'slug',
            'terms' => array(
                'slug-two',
                'slug-three'
            )
        )
    )
);

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

$args = array(
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'taxonomy1',
            'field' => 'slug',
            'terms' => array( 'slug-one' ),
            'operator' => 'NOT IN'
        ),
        array(
            'taxonomy' => 'taxonomy2',
            'field' => 'slug',
            'terms' => array( 'slug-two' )
        )
    )
);

Обратите внимание, что здесь мы использовали значение параметра ‘relation’ => ‘AND’, в случае применения значения параметра OR, мы бы запрашивали записи со слагом slug-twoи записи без слага slug-one. Нам же нужны записи со слагом slug-two, а не слагом slug-one.

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

Несколько слов об аргументе tax

Вы наверное задаетесь вопросом, почему мы не использовали аргумент {tax}, где аргументы пишутся следующим образом:

$args = array(
    'taxonomy1' => 'slug-one'
);

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

Заключение

Поиск записей по таксономиям немного сложнее, чем поиск по категориям и меткам, поскольку вам приходится работать с аргументом ‘tax_query’.

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

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.