Значения подполей

В этом примере мы найдем все events, у которых есть city или Melbourne или Sydney. Каждый city добавляется как новая строка в повторяющееся поле под названием location.

Чтобы успешно запросить значения подполей, нужно помнить, что номер строки неизвестен (может быть 1, 2 или даже 3 строки данных повторяющегося поля). Поэтому нам нужно использовать предложение LIKE в нашем SQL-запросе, чтобы разрешить WILDCARD в поиске мета ключа meta_key. Для этого мы создаем пользовательский фильтр, чтобы заменить стандартное ‘=’ на ‘LIKE’.

UPD: После изменения поведения esc_sql() в WordPress 4.8.3, теперь не так просто использовать символ % в качестве заполнителя для следующего поиска и замены, вместо него мы рекомендуем использовать символ $, как показано ниже.

Примечание: этот метод требует подключения к фильтру posts_where, который не гарантированно будет выполняться при всех запросах к записям. Чтобы решить эту проблему, установите значение suppress_filters равным false в массиве аргументов, передаваемых в get_posts() или WP_Query.

<?php 

// filter
function my_posts_where( $where ) {
	
	$where = str_replace("meta_key = 'locations_$", "meta_key LIKE 'locations_%", $where);

	return $where;
}

add_filter('posts_where', 'my_posts_where');


// vars
$city = 'Melbourne';


// args
$args = array(
	'numberposts'	=> -1,
	'post_type'		=> 'event',
	'meta_query'	=> array(
		'relation'		=> 'OR',
		array(
			'key'		=> 'locations_$_city',
			'compare'	=> '=',
			'value'		=> 'Melbourne',
		),
		array(
			'key'		=> 'locations_$_city',
			'compare'	=> '=',
			'value'		=> 'Sydney',
		)
	)
);


// query
$the_query = new WP_Query( $args );

?>
<?php if( $the_query->have_posts() ): ?>
	<ul>
	<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
		<li>
			<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
		</li>
	<?php endwhile; ?>
	</ul>
<?php endif; ?>

<?php wp_reset_query();	 // Restore global post data stomped by the_post(). ?>

Была ли эта страница полезной?