Interroger plusieurs valeurs de clé méta?

22

Comment interroger plusieurs valeurs de clé méta avec la même clé

$querystr = "  
            SELECT $wpdb->posts.* 
            FROM $wpdb->posts, $wpdb->postmeta
            WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id 

            AND $wpdb->postmeta.meta_key = 'key1'   
            AND $wpdb->postmeta.meta_value = 'value1'
            // why doesn't this work?
            AND $wpdb->postmeta.meta_value = 'value2'

            AND $wpdb->posts.post_status = 'publish' 
            AND $wpdb->posts.post_type = 'post'
            ORDER BY $wpdb->posts.post_date DESC
                ";

code suivant

<?php 
$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1',
            'value' => 'value1',
            'compare' => '='
        ),
// this array results in no return for both arrays
        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);
$the_query  = new WP_Query( $args );
 ?>

                <?php /* Start the Loop */ ?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

                    <?php get_template_part( 'content', get_post_format() ); ?>

                <?php endwhile; ?>
    
posée steen 27.01.2012 - 04:44

4 réponses

30

J'ai l'impression qu'il y a une confusion ET / OU ici.

Les requêtes dans l'OP renverront uniquement les publications qui ont les deux key1 = 'valeur1' ET clé2 = 'valeur2'. La plupart des plugins WP (que je sache, de toute façon) ne stockent pas plusieurs valeurs dans postmeta, pour le même post, en utilisant la même clé.

Si ce que vous voulez est vraiment un OU (vous voulez obtenir les posts où key1 = 'valeur1', ainsi que les posts où key1 = 'valeur2'), voyez la réponse de @ WhiskerSandwich en utilisant 'IN' et un tableau de valeurs pour le paramètre value.

Vous pouvez également fournir un paramè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 relation pour plusieurs méta-requêtes utilisant la même clé équivaut à utiliser IN et un tableau de valeurs pour une seule.

    
réponse donnée Boone Gorges 13.03.2012 - 20:07
14

J'ai eu le même problème où le passage de plusieurs tableaux pour la même clé ne fonctionnait pas. À la place, utilisez simplement un tableau, définissez 'valeur' sur un tableau de valeurs, puis 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 );

?>
    
réponse donnée WhiskerSandwich 13.03.2012 - 19:48
1

Vous devez aliaser la table postmeta pour 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
            ";

Vous pouvez également le faire maintenant depuis la version 3.1 avec un meta_query :

$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1',
            'value' => 'value1',
            'compare' => '='
        ),
        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);
$query = new WP_Query( $args );
    
réponse donnée Milo 27.01.2012 - 05:36
0

Key est key1 et les valeurs 'value1' et 'value2' ont essayé le texte et le numérique dans une nouvelle installation avec vingt-onze. print_r ($ the_query); la sortie des travaux semble normale. Aussi essayé key1 et key2 ne fonctionne pas non plus. Cela fonctionne dès que je le limite à un tableau. Vérifié avec différents navigateurs.

Cela fonctionne 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 );

 ?>
    
réponse donnée steen 27.01.2012 - 11:59

Lire d'autres questions sur les étiquettes