Вывод постов по значениям произвольных полей при помощи meta_query класса WP_Query

Пост будет состоять из двух частей, в первой разберемся вообще с тем, что можно сделать при помощи 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 );

Сравнивание значений произвольных полей

Разделим предыдущий пример на два примера:

  • В первом — цена товаров будет больше 1000 (или равна 1000)
  • Во втором — цена товаров будет строго меньше 3000
// значение произвольного поля '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 );

Часть 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 );
Миша Рудрастых Разработчик WordPress WooCommerce

Миша Рудрастых

Впервые познакомился с WordPress в 2009 году, и после двух лет мучений с Joomla и самописными движками это был просто бальзам на душу. С 2014 года меня можно встретить на WordCamp — официальной конфе по WP в Москве, иногда там выступаю. Также в настоящее время веду курсы по WordPress в Epic Skills в Питере.

Смотрите также