Запросить несколько мета-ключей?
4 ответ
- голосов
-
- 2012-03-13
Я чувствую,что здесь происходит путаница И/ИЛИ.
Запросы в OP будут возвращать только сообщения,содержащие оба key1='value1' AND key2='value2'. Большинство плагинов WP (которые мне известны) не хранят несколько значений вpostmeta для одного и того же сообщения с использованием одного и того же ключа.
Если вы действительно хотите выполнить операцию ИЛИ (вы хотите получить сообщения,в которых key1='value1',а также сообщения,где key1='value2'),просмотрите ответ @ WhiskerSandwich,используя 'IN' и массив значений для параметра значения.
В качестве альтернативы вы можете предоставить параметр
relation
для `meta_query ':$args = array( 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'key1', 'value' => 'value1', 'compare' => '=' ), array( 'key' => 'key1', 'value' => 'value2', 'compare' => '=' ) ) );
Обратите внимание,что использование OR в качестве отношения для нескольких мета-запросов с использованием одного и того же ключа является функциональным эквивалентом использования
IN
и массива значений для одного.I feel like there's an AND/OR confusion going on here.
The queries in the OP will only return posts which have both key1 = 'value1' AND key2 = 'value2'. Most WP plugins (that I know of, anyway) do not store multiple values in postmeta, for the same post, using the same key.
If what you want is really an OR (you want to get the posts where key1 = 'value1', as well as the posts where key1 = 'value2'), then see @WhiskerSandwich's answer, using 'IN' and an array of values for the value parameter.
Alternatively, you can provide a
relation
parameter to `meta_query':$args = array( 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'key1', 'value' => 'value1', 'compare' => '=' ), array( 'key' => 'key1', 'value' => 'value2', 'compare' => '=' ) ) );
Note that using OR as the relation for multiple meta queries using the same key is the functional equivalent of using
IN
and an array of values for a single one.-
Спасибо за это,Бун.Я не знал,что существует параметр "отношения".Выручил меня.Thanks for this, Boone. I didn't know the "relation" param existed. Helped me out.
- 0
- 2012-03-21
- MathSmath
-
Это работает,если у вас есть только один ключ для поиска.Если у вас их два или более,вам может потребоваться использовать «И»,чтобы объединить их в параметре отношения,и в этом случае ответ @ WhiskerSandwich ниже подойдет лучше.This works if you only have one key to search on. If you have two or more, you may need to use 'AND' to combine them in the relationship parameter, in which case @WhiskerSandwich's answer below is the better fit.
- 0
- 2015-04-21
- SinisterBeard
-
- 2012-03-13
У меня была такая же проблема,когда передача нескольких массивов для одного и того же ключа не работала.Вместо этого просто используйте один массив,установите значение для массива значений и установите для параметра «сравнение» значение IN:
<?php $args = array( 'meta_query' => array( array( 'key' => 'key1', 'value' => array('value1', 'value2'), 'compare' => 'IN' ), ) ); $query = new WP_Query( $args ); ?>
I had the same problem where passing multiple arrays for the same key wasn't working. Instead, just use one array, set 'value' to an array of values, and set 'compare' to IN:
<?php $args = array( 'meta_query' => array( array( 'key' => 'key1', 'value' => array('value1', 'value2'), 'compare' => 'IN' ), ) ); $query = new WP_Query( $args ); ?>
-
- 2012-01-27
Вы должны создать псевдоним для таблицыpostmeta для второго значения:
$querystr = " SELECT $wpdb->posts.* FROM $wpdb->posts, $wpdb->postmeta, $wpdb->postmeta AS mt1 WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id AND $wpdb->postmeta.meta_key = 'key1' AND $wpdb->postmeta.meta_value = 'value1' AND mt1.meta_key = 'key1' AND mt1.meta_value = 'value2' AND $wpdb->posts.post_status = 'publish' AND $wpdb->posts.post_type = 'post' ORDER BY $wpdb->posts.post_date DESC ";
Это также можно сделать сейчас,начиная с версии 3.1,с помощью
meta_query
а>:$args = array( 'meta_query' => array( array( 'key' => 'key1', 'value' => 'value1', 'compare' => '=' ), array( 'key' => 'key1', 'value' => 'value2', 'compare' => '=' ) ) ); $query = new WP_Query( $args );
You have to alias the postmeta table for the second value:
$querystr = " SELECT $wpdb->posts.* FROM $wpdb->posts, $wpdb->postmeta, $wpdb->postmeta AS mt1 WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id AND $wpdb->postmeta.meta_key = 'key1' AND $wpdb->postmeta.meta_value = 'value1' AND mt1.meta_key = 'key1' AND mt1.meta_value = 'value2' AND $wpdb->posts.post_status = 'publish' AND $wpdb->posts.post_type = 'post' ORDER BY $wpdb->posts.post_date DESC ";
You can also do this now since 3.1 with a
meta_query
:$args = array( 'meta_query' => array( array( 'key' => 'key1', 'value' => 'value1', 'compare' => '=' ), array( 'key' => 'key1', 'value' => 'value2', 'compare' => '=' ) ) ); $query = new WP_Query( $args );
-
Привет,Майло,спасибо за ответ.SQL не возвращает значения.И массив также не возвращает значения,если я не удалю второй ключ и значение из массива.Так это ошибка?Hi Milo thanks for answering. The SQL returns no value. And the array is returning no value as well unless I remove the 2nd key and value from the array. So is this bugged?
- 0
- 2012-01-27
- steen
-
@steen - я не уверен,в чем ваша проблема,я протестировал оба метода,и они работают в моей установке 3.3.1.Ваш ключ буквально «ключ1»,а значения «значение1» и «значение2»?Вы ничего не видите,если сразу после запроса вы `print_r ($the_query);`?@steen - I'm not sure what your issue is, I've tested both methods and they are working in my install of 3.3.1. Is your key literally 'key1' and values 'value1' and 'value2'? Do you see nothing if you `print_r( $the_query );` immediately after the query?
- 0
- 2012-01-27
- Milo
-
- 2012-01-27
Ключ - это ключ1,а значения "значение1" и "значение2" пробовали использовать как текстовые,так и числовые значения в новой установке с двадцатью одиннадцатью.print_r ($the_query);работает,вывод выглядит нормально.Также попробовал key1 и key2,тоже не работает.Он работает,как только я ограничиваю его одним массивом.Проверено разными браузерами.
Однако это работает.
<?php $args = array( 'meta_query' => array( array( 'key' => 'wtf', 'value' => '1', 'compare' => '>=' ), // this array results in no return for both arrays array( 'key' => 'wtf', 'value' => '2', 'compare' => '<=' ) ) ); $the_query = new WP_Query( $args ); ?>
Key is key1 and values 'value1' and 'value2' tried it both text and numeric in a fresh install with twenty eleven. print_r( $the_query ); works output looks normal. Also tried key1 and key2 also doesn't work. It works as soon as I limit it to to one array. Checked with different browsers.
This however does work.
<?php $args = array( 'meta_query' => array( array( 'key' => 'wtf', 'value' => '1', 'compare' => '>=' ), // this array results in no return for both arrays array( 'key' => 'wtf', 'value' => '2', 'compare' => '<=' ) ) ); $the_query = new WP_Query( $args ); ?>
Как запросить несколько значений мета-ключей с одним и тем же ключом
следующий код