Interroger plusieurs valeurs de clé méta?
4 réponses
- votes
-
- 2012-03-13
J'ai l'impression qu'il y a une confusion ET/OUici.
Les requêtes dans l'OP renverront uniquement lespublications qui ont les deux key1='value1' AND key2='value2'. Laplupart desplugins WP (queje connais,detoutefaçon)ne stockentpasplusieurs valeurs danspostmeta,pour lemême article,en utilisant lamême clé.
Si ce que vous voulezest vraiment un OU (vous voulez obtenir lesmessages où key1='value1',ainsi que lesmessages où key1='value2'),alors voyez la réponse de @ WhiskerSandwich,en utilisant 'IN'et untableau de valeurspour leparamètre value.
Vouspouvez égalementfournir unparamètre
relation
à `meta_query ':$args = array( 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'key1', 'value' => 'value1', 'compare' => '=' ), array( 'key' => 'key1', 'value' => 'value2', 'compare' => '=' ) ) );
Notez que l'utilisation de OR comme relationpourplusieursméta-requêtes utilisant lamême cléest l'équivalentfonctionnel de l'utilisation de
IN
et d'untableau de valeurspour une seule.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.-
Mercipour ça,Boone.Jene savaispas que leparamètre «relation»existait.M'a aidé.Thanks for this, Boone. I didn't know the "relation" param existed. Helped me out.
- 0
- 2012-03-21
- MathSmath
-
Celafonctionne si vousn'avez qu'une seule clé à rechercher.Si vousen avez deux ouplus,vous devrezpeut-être utiliser «ET»pour les combiner dans leparamètre de relation,auquel cas la réponse de @ WhiskerSandwich ci-dessousest lameilleure solution.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
J'aieu lemêmeproblème où lepassage deplusieurstableauxpour lamême cléne fonctionnaitpas.À laplace,utilisez simplement untableau,définissez 'value' sur untableau de valeurset définissez 'compare' sur 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
Vous devez alias latablepostmetapour la deuxième valeur:
$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 ";
Vouspouvez également lefairemaintenant depuis la version 3.1 avec une
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 );
-
Salut Milomerci d'avoir répondu.Le SQLne renvoie aucune valeur.Et letableaune renvoie aucune valeur,sauf sije supprime la deuxième cléet la valeur dutableau.Alorsest-ce que c'estbuggé?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 - Jene saispas quelest votreproblème,j'aitesté les deuxméthodeset ellesfonctionnent dansmoninstallation de 3.3.1.Votre cléest-elle littéralement «clé1»et les valeurs «valeur1»et «valeur2»?Vousne voyez rien si vous `print_r ($the_query);`immédiatement après la requête?@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
La cléest key1et les valeurs 'value1'et 'value2' ontessayé à lafois letexteet lenumérique dans unenouvelleinstallation avec vingt onze.print_r ($the_query);la sortiefonctionne semblenormale.Égalementessayé key1et key2ne fonctionnepasnonplus.Celafonctionne dès queje le limite à un seultableau.Vérifié avec différentsnavigateurs.
Celafonctionne cependant.
<?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 ); ?>
Comment rechercherplusieurs valeurs de cléméta avec lamême clé
code suivant