Аргументы WP_Query: Произвольные поля

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

Сегодня мы познакомимся с аргументами для произвольных полей (custom fields), но сначала вспомним, как использовать аргументы в 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 может опросить не все указанные вами аргументы, и на экран ничего не выведется.

Параметры произвольных полей

Произвольные поля (также известные как метаданные записей) могут использовать отдельный класс WP_Meta_Query. Поэтому для получения метаданных записи, можно использовать либо WP_Meta_Query, либо WP_Query (который все равно обращается к WP_Meta_Query). Но если требуется сделать запрос метаданных и других элементов (вроде типа записи), то следует использовать только WP_Query.

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

Параметры для простого запроса произвольного поля

Основные параметры WP_Query для выполнения запросов к произвольным полям:

  • meta_key (string): ключ произвольного поля;
  • meta_value (string): значение произвольного поля;
  • meta_value_num (number): значение произвольного поля;
  • meta_compare (string): оператор для тестирования ‘meta_value‘. Допустимые значения: ‘=’, ‘!=’, ‘>’, ‘>=’, ‘<‘, ‘<=’, ‘LIKE’, ‘NOT LIKE’, ‘IN’, ‘NOT IN’, ‘BETWEEN’, ‘NOT BETWEEN’, ‘NOT EXISTS’, ‘REGEXP’, ‘NOT REGEXP’ или ‘RLIKE’. Значение по умолчанию: ‘=’.

Используйте эти параметры для создания простых запросов к произвольным полям. Например, чтобы вывести записи, в которых имеются произвольные поля с ключом key1 (независимо от его значения), нужно использовать следующий аргумент:

$args = array(
    'meta_key' => 'key1'
);

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

$args = array(
    'meta_key' => 'key1',
    'meta_value' => 'value1'
);

Такой аргумент выведет все записи с произвольным полем, у которого имеется ключ key1 со значением value1.

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

$args = array(
    'meta_value' => 'value1'
);

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

Используем аргумент meta_compare

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

  • =: Равно. Это параметр по умолчанию. То есть, если вы не используете аргумент meta_compare, WP_Query будет использовать именно его;
  • !+: Не равно;
  • >: Больше чем;
  • >=: Больше или равно;
  • < : Меньше чем;
  • LIKE: Этот параметр игнорирует регистр, в котором вы вносите значение. Здесь даже можете использовать специальные символы для поиска значений;
  • NOT LIKE: Работает по тому же принципу, что и LIKE, только абсолютно противоположно;
  • IN: Используйте этот параметр с массивом в аргументе ‘value’ для поиска записей с одним или несколькими значениями в массиве;
  • BETWEEN: Используется с массивом из двух числовых значений (указанных в аргументе meta_value) для поиска записей со значением произвольного поля, находящимся между этими двумя значениями (но не равным им);
  • NOT BETWEEN: Осуществляет запрос записей со значением произвольного поля, находящимся за пределами указанного интервала из двух цифровых значений в meta_value.

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

$args = array(
    'meta_key' => 'key1',
    'meta_compare' => '!='
);

Можно использовать значение ‘NOT IN’ в аргументе meta_compare, который также может применяться со строкой из нескольких значений:

$args = array(
    'meta_key' => 'key1, key2',
    'meta_compare' => 'NOT IN'
);

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

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

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

$args = array(
    'meta_key' => 'numkey',
    'meta_value' => '100',
    'meta_compare' => '>'
);

Этот запрос позволит получить все записи, значением произвольного поля которых является значение выше 100. Если нужно запросить записи со значениями от 100 и выше, то можно использовать параметр ‘meta_compare’ => ‘>=’.

Также при помощи аргумента BETWEEN и массива можно находить записи, в произвольных полях которых используются значения в определенном диапазоне:

$args = array(
    'meta_key' => 'numkey',
    'meta_value' => array (
        '100',
        '200'
    ),
    'meta_compare' => 'BETWEEN'
);

Такой запрос позволит найти все записи со значением произвольных полей между 100 и 200.

Запросы для вложенных произвольных полей

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

Структура запроса будет следующей:

$args = array(
    'meta_query' => array(
        'relation' => '', // Опциональный аргумент.
        array(
            // здесь будут аргументы `meta_query`.
        )
    )
);

Структура аргумента ‘meta_query’ в классе WP_Query будет такой же, как и при использовании класса WP_Meta_Query, о котором мы подробно поговорим в следующих статьях.

После выхода WordPress версии 4.1 стало можно использовать несколько уровней вложенных массивов для создания еще более сложных и точных запросов. Структура таких запросов выглядит примерно так:

$args = array(
    'meta_query' => array(
        'relation' => '', // Опциональный аргумент.
        array(
            'relation' => '',
            array (
                // Первый набор аргументов `meta_query`.
            ),
            array (
                // Второй набор аргументов `meta_query`.
            )
        )
    )
);

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

В завершение

Применение класса WP_Query для создания запросов метаданных записей (или произвольных полей) предоставляет гибкость при работе с множеством различных аргументов в сочетании с операторами.

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

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