Consulta vários valores de meta-chave?

22

Como consultar vários valores de meta-chave com a mesma chave

$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
                ";

próximo código

<?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; ?>
    
por steen 27.01.2012 / 04:44
fonte

4 respostas

30

Eu sinto que há uma confusão AND / OR acontecendo aqui.

As consultas no OP só retornarão postagens que tenham ambas key1 = 'value1' AND key2 = 'value2'. A maioria dos plugins do WP (que conheço, de qualquer forma) não armazena vários valores em postmeta, para o mesmo post, usando a mesma chave.

Se o que você quer é realmente um OR (você deseja obter as postagens onde key1 = 'value1', assim como as postagens onde key1 = 'value2'), veja a resposta do @ShawkerSandwich, usando 'IN' e um matriz de valores para o parâmetro value.

Como alternativa, você pode fornecer um parâmetro relation para 'meta_query':

$args = array(
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'key1',
            'value' => 'value1',
            'compare' => '='
        ),

        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);

Observe que o uso de OR como a relação para várias meta-consultas usando a mesma chave é o equivalente funcional de usar IN e uma matriz de valores para um único.

    
por Boone Gorges 13.03.2012 / 20:07
fonte
14

Eu tive o mesmo problema em que passar vários arrays para a mesma chave não estava funcionando. Em vez disso, basta usar uma matriz, definir "valor" para uma matriz de valores e definir "comparar" como IN:

<?php

$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1',
            'value' => array('value1', 'value2'),
            'compare' => 'IN'
        ),
    )
);
$query = new WP_Query( $args );

?>
    
por WhiskerSandwich 13.03.2012 / 19:48
fonte
1

Você tem que aliasar a tabela postmeta para o segundo valor:

$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
            ";

Você também pode fazer isso desde a 3.1 com um meta_query :

$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1',
            'value' => 'value1',
            'compare' => '='
        ),
        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);
$query = new WP_Query( $args );
    
por Milo 27.01.2012 / 05:36
fonte
0

A chave é chave1 e os valores 'valor1' e 'valor2' tentaram texto e numérico em uma nova instalação com vinte e onze. print_r ($ the_query); funciona saída parece normal. Também tentei key1 e key2 também não funciona. Funciona assim que eu limito a um array. Verificado com diferentes navegadores.

Isso, no entanto, funciona.

    <?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 );

 ?>
    
por steen 27.01.2012 / 11:59
fonte

Tags