web-dev-qa-db-fra.com

Interroger plusieurs valeurs de clé méta?

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; ?>
22
steen

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 both key1 = 'value1' AND key2 = 'value2'. La plupart des plugins WP (que je sache, de toute façon) ne stockent pas plusieurs valeurs dans postmeta, pour le même message, en utilisant la même clé.

Si vous voulez vraiment un OR (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.

31
Boone Gorges

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

?>
14
WhiskerSandwich

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 );
1
Milo

Key est key1 et les valeurs 'value1' et 'value2' ont essayé le texte et le numérique lors d'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 );

 ?>
0
steen