В этом примере мы найдем все 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(). ?>