Пост будет состоять из двух частей, в первой разберемся вообще с тем, что можно сделать при помощи meta_query, а во-второй рассмотрим несколько примеров по работе с произвольными полями без использования meta_query вообще.
Часть 1. Примеры использования meta_query
Вывод постов по значению произвольного поля
Начнем с самого простого примера, предположим, нам нужно вывести все товары синего цвета:
// значение произвольного поля 'color' равно 'blue' $true_args = array( 'meta_query' => array( array( 'key' => 'color', 'value' => 'blue' ) ) ); $true_query = new WP_Query( $true_args );
Если вы заглянете на страницу редактирования любого из полученных в данном примере товаров, то в блоке «Произвольные поля» вы увидите следующее:
Хочу заметить, что примеры упрощены, в массиве аргументов по-любому должны быть такие параметры, как posts_per_page
(количество постов, отображаемых на странице) и скорее всего post_type
(отдельный тип поста для товаров). То есть мы рассматриваем чисто meta_query
и ничего лишнего.
Также можно сделать и наоборот — то есть, чтобы выводились все товары, кроме товаров синего цвета:
// значение произвольного поля 'color' не равно 'blue' $true_args = array( 'meta_query' => array( array( 'key' => 'color', 'value' => 'blue', 'compare' => '!=' // оператор сопоставления ) ) ); $true_query = new WP_Query( $true_args );
А теперь те же самые примеры, но только добавим еще один цвет. Итак, сначала выводим все товары синего или красного цвета:
// значение произвольного поля 'color' равно 'blue' ИЛИ 'red' $true_args = array( 'meta_query' => array( array( 'key' => 'color', 'value' => array('blue','red'), 'compare' => 'IN' ) ) ); $true_query = new WP_Query( $true_args );
А теперь все товары, кроме товаров синего и товаров красного цвета:
// значение произвольного поля 'color' не равно 'blue' И не равно 'red' $true_args = array( 'meta_query' => array( array( 'key' => 'color', 'value' => array('blue','red'), 'compare' => 'NOT IN' ) ) ); $true_query = new WP_Query( $true_args );
Вывод постов по диапазону значений произвольного поля
Ну в случае с товарами удобно будет вывести их по диапазону цен, например выведем все товары, которые дороже 1000 и дешевле 3000:
// значение произвольного поля 'price' больше 1000 и меньше 3000 $true_args = array( 'meta_query' => array( array( 'key' => 'price', 'value' => array( 1000, 3000 ), 'type' => 'numeric', 'compare' => 'BETWEEN' ) ) ); $true_query = new WP_Query( $true_args );
Сравнивание значений произвольных полей
Разделим предыдущий пример на два примера:
// значение произвольного поля 'price' больше или равно 1000 $true_args = array( 'meta_query' => array( array( 'key' => 'price', 'value' => 1000, 'type' => 'numeric', 'compare' => '>=' ) ) ); $true_query = new WP_Query( $true_args );
// значение произвольного поля 'price' меньше 3000 $true_args = array( 'meta_query' => array( array( 'key' => 'price', 'value' => 3000, 'type' => 'numeric', 'compare' => '<' ) ) ); $true_query = new WP_Query( $true_args );
Вывод постов по значениям нескольких произвольных полей
Ничего особо нового придумывать здесь не буду — просто объединю предыдущие примеры, например, чтобы товар был синего цвета И чтобы его цена была от 1000 до 3000, вот как будет выглядеть массив параметров:
// значение произвольного поля 'color' равно 'blue' И значение 'price' находится в диапазоне от 1000 до 3000 $true_args = array( 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'color', 'value' => 'blue' ), array( 'key' => 'price', 'value' => array( 1000, 3000 ), 'type' => 'numeric', 'compare' => 'BETWEEN' ) ) ); $true_query = new WP_Query( $true_args );
Использование параметра compare_key
Начиная с версии WordPress 5.3 вы можете сравнивать не только значения произвольных полей, но и их мета ключи. Подробнее об этом с примерами тут.
Часть 2. Работа с произвольными полями без помощи meta_query
Тут особо и не о чем рассказывать, если параметр WP_Query meta_key
(название параметра) и есть meta_value
(значение параметра, для числовых значений — meta_value_num
) . А ещё есть параметр сопоставления meta_compare
.
Теперь рассмотрим пример. Допустим, некоторые из постов мы должны отобразить на главной странице. Давайте выведем эти посты:
$true_args = array( 'meta_key' => 'homepage_show_it', 'meta_value' => 'on' ); $true_query = new WP_Query( $true_args );
А теперь получим все остальны посты, т.е. у которых параметр homepage_show_it не равен on.
$true_args = array( 'meta_key' => 'homepage_show_it', 'meta_value' => 'on', 'meta_compare' => '!=' ); $true_query = new WP_Query( $true_args );