Вопрос или проблема
Я пытаюсь выполнить запрос к WordPress с несколькими значениями, но, похоже, он не может обрабатывать более 4 ключевых слов.
В настоящее время я использую цикл и уже пробовал использовать оператор IN, но мне нужно, чтобы запрос работал с подстановочными знаками, и хотя REGEXP решает задачу, оператор IN — нет.
foreach ($keywords as $value) {
$args['meta_query'] = array(
'relation' => 'OR',
array(
'key' => 'customfields',
'value' => $value,
'compare' => 'REGEXP'
)
);
}
В этом случае $keywords
является массивом слов, по которым мне нужно выполнить запрос к пользовательскому полю. Это работает с несколькими ключевыми словами, но не справляется с 5 или более.
Вы пробовали передать массив значений аргументу value
?
$your_terms = array( 'foo', 'bar', 'baz' );
$args['meta_query'] = array(
'relation' => 'OR',
array(
'key' => 'customfields',
'value' => $your_terms,
'compare' => 'REGEXP'
)
);
$this_query = new WP_Query( $args );
В текущем виде ваш meta_query
перезаписывается на каждой итерации. В конечном итоге у вас остается только одно пользовательское поле в meta_query
:
В зависимости от оператора, который вы хотите использовать, аргумент meta_query
должен выглядеть следующим образом:
-
для “LIKE“, “REGEXP“
if( is_array($keywords) && count($keywords) ) { $args['meta_query'] = array( 'relation' => 'OR' ); foreach( $keywords as $value ) { $args['meta_query'][] = array( 'key' => 'customfields', 'value' => $value, 'compare' => 'REGEXP', // или 'LIKE' ); } } // === результат: === // $args['meta_query'] = array( // 'relation' => 'OR', // [ 'key' => 'customfields', 'value' => 'value_1', 'compare' => 'REGEXP' ], // [ 'key' => 'customfields', 'value' => 'value_2', 'compare' => 'REGEXP' ], // [ 'key' => 'customfields', 'value' => 'value_3', 'compare' => 'REGEXP' ], // );
-
для “IN“
if( is_array($keywords) && count($keywords) ) { $args['meta_query'] = array( 'relation' => 'OR', array( 'key' => 'customfields', 'value' => $keywords, 'compare' => 'IN', ) ); }
Ответ или решение
Для выполнения запроса к метаданным в WordPress с использованием нескольких значений для одного ключа, важно правильно организовать массив meta_query
. Давайте рассмотрим, как это можно сделать с использованием операторов REGEXP
и LIKE
.
Проблема с текущим кодом
Ваш текущий код перезаписывает массив meta_query
при каждом проходе цикла, что приводит к тому, что в конечном итоге остаётся только одно значение. Чтобы правильно добавить все значения, необходимо использовать массив.
Решение с использованием REGEXP
и LIKE
Для выполнения запросов с оператором REGEXP
вы можете использовать следующий подход:
if ( is_array($keywords) && count($keywords) ) {
$args['meta_query'] = array('relation' => 'OR');
foreach ($keywords as $value) {
$args['meta_query'][] = array(
'key' => 'customfields',
'value' => $value,
'compare' => 'REGEXP', // или 'LIKE'
);
}
}
При этом массив meta_query
будет содержать все условия, и они будут объединены логическим OR
. Как результат, будет сформирован правильный запрос к базе данных, который будет соответствовать всем значениям.
Альтернатива с оператором IN
Если вам необходимо использовать оператор IN
, необходимо учитывать, что этот оператор не поддерживает регулярные выражения. Однако вы можете просто передать массив значений:
if ( is_array($keywords) && count($keywords) ) {
$args['meta_query'] = array(
array(
'key' => 'customfields',
'value' => $keywords,
'compare' => 'IN',
)
);
}
Важные моменты
-
Поддержка операторов:
REGEXP
подходит для поиска по регулярным выражениям, тогда какIN
ищет точные совпадения. Выберите подходящий оператор в зависимости от ваших нужд. -
Запросы с высокой нагрузкой: Учтите, что использование регулярных выражений может повлиять на производительность при больших объёмах данных. Если это критично, лучше избегать слишком сложных регулярных выражений.
-
Тестирование запроса: После настройки запроса протестируйте его на небольшом наборе данных, чтобы убедиться в правильности результатов.
Надеюсь, это поможет вам эффективно выполнять запросы к метаданным в WordPress с использованием нескольких значений для одного ключа! Если возникнут дополнительные вопросы, не стесняйтесь спрашивать.