запрос wp проверяет, существует ли целое число в массиве настраиваемого поля
Я использую wp_query
для поиска пользовательских записей, которые имеют указанное числовое значение внутри настраиваемого поля. Значение этого настраиваемого поля представляет собой массив чисел (идентификаторы выбранных записей с использованием поля Связи расширенного настраиваемого поля).
Поэтому я пытаюсь найти все записи, которые имеют указанное значение внутри массива этого поля.
Вот мой код:
foreach ($selectedAuthors as $myAuthor){
$args = array(
'posts_per_page' => -1,
'post_type' => 'resource',
'resource_types' => 'ml-special-reports',
'meta_query' => array (
'key' => 'qd_resource_author_selector',
'value' => $myAuthor,
),
'orderby' => 'title',
'order' => 'ASC'
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
echo '<h3>'.get_the_title($myAuthor).'</h3>';
while ( $query->have_posts() ) :
$query->the_post();
echo '<h3>'.get_the_title().'</h3>';
endwhile;
wp_reset_postdata();
}
}
Если я var_dump()
$selectedAuthors
Я получаю:
array(3) { [0]=> int(214) [1]=> int(216) [2]=> int(211) }
Каждый прогон while($query->have_posts())
возвращает каждый сообщение типа resource
с термином resource_types
таксономии ml-special-reports
независимо от того, существует ли $myAuthor
в массиве настраиваемого поля qd_resource_author_selector
.
Есть какие-нибудь мысли о том, что я делаю неправильно?
2 answers
Прежде всего, ваш meta_query
это неправильно. Это должен быть массив массива, а не просто массив
Итак, следующее
'meta_query' => array (
'key' => 'qd_resource_author_selector',
'value' => $myAuthor,
),
Становится
'meta_query' => array (
array(
'key' => 'qd_resource_author_selector',
'value' => $myAuthor,
),
),
Во-вторых, вы можете оптимизировать свой запрос. Вы выполняете запрос для каждого значения. Если у вас есть 100 значений, вы собираетесь выполнить 100 запросов, что дорого
Вы можете оптимизировать свой запрос, добавив свои значения в массив и передав массив непосредственно вашему meta_query
Всего несколько другие проблемы
Запустите надлежащий
tax_query
. Используемый вами синтаксис обесцениваетсяВаш первый экземпляр
get_the_title()
выглядит неуместно за пределами петли. Не уверен, что вы там делаетеНе смешивайте свой синтаксис, он сбивает с толку и очень трудно отлаживается при сбое. Для вашего заявления
if
вы используете curlies (которые я предпочитаю, так как в основном все редакторы поддерживают их, очень легко отлаживаются) и в вашемwhile
оператор, который вы используете:
иendwhile
. Я бы рекомендовал вам использовать кудряшки и придерживаться их в будущем
Учитывая все сказанное, вы можете попробовать что-то подобное без foreach
цикла
$myAuthor = array('value1', 'value2', 'value3');
$args = array(
'posts_per_page' => -1,
'post_type' => 'resource',
'tax_query' => array(
array(
'taxonomy' => 'resource_types',
'field' => 'slug',
'terms' => 'ml-special-reports',
),
),
'meta_query' => array (
array(
'key' => 'qd_resource_author_selector',
'value' => $myAuthor,
'compare' => 'IN',
),
),
'orderby' => 'title',
'order' => 'ASC'
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
echo '<h3>'.get_the_title().'</h3>';
}
wp_reset_postdata();
}
Я решил эту проблему, используя часть кода Питера Гусена и более внимательно изучив значение поля в SQL. Это было сохранение информации странным образом, что потребовало от меня заключить значение в кавычки, чтобы вернуть правильные сообщения.
Вот рабочий код:
foreach ($selectedAuthors as $myAuthor){
echo '<hr /><p>my author = '.$myAuthor.'</p>';
$args = array(
'posts_per_page' => -1,
'post_type' => 'resource',
'tax_query' => array(
array(
'taxonomy' => 'resource_types',
'field' => 'slug',
'terms' => 'ml-special-reports',
),
),
'meta_query' => array (
array(
'key' => 'qd_resource_author_selector',
'value' => '"'.$myAuthor.'"',
'compare' => 'LIKE',
),
),
'orderby' => 'title',
'order' => 'ASC'
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
echo '<h3>'.get_the_title($myAuthor).'</h3>';
while ( $query->have_posts() ) {
$query->the_post();
echo '<h3>'.get_the_title().'</h3>';
}
wp_reset_postdata();
}
}
Поэтому в этой строке мне пришлось заставить появиться кавычки:
'value' => '"'.$myAuthor.'"',
Теперь он возвращает имя автора, а затем название каждой записи с правильным термином таксономии, который им присвоен до.