Consultar 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; ?>
steen
fonte

Respostas:

31

Sinto que há uma confusão de E / OU acontecendo aqui.

As consultas no OP só retornará as mensagens que têm tanto key1 = 'value1' E key2 = 'value2'. A maioria dos plugins WP (que eu saiba, de qualquer maneira) não armazena vários valores no postmeta, para o mesmo post, usando a mesma chave.

Se o que você deseja é realmente um OR (você deseja obter as postagens onde key1 = 'value1', bem como as postagens em que key1 = 'value2'), consulte a resposta de @ WhiskerSandwich, usando 'IN' e uma matriz de valores para o parâmetro value.

Como alternativa, você pode fornecer um relationparâmetro para `meta_query ':

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

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

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

Boone Gorges
fonte
Obrigado por isso, Boone. Eu não sabia que o parâmetro "relação" existia. Me ajudou a sair.
MathSmath
Isso funciona se você tiver apenas uma chave para pesquisar. Se você tem dois ou mais, pode ser necessário usar 'AND' para combiná-los no parâmetro relationship, caso em que a resposta do @ WhiskerSandwich abaixo é a melhor opção.
SinisterBeard
14

Eu tive o mesmo problema em que a passagem de várias matrizes para a mesma chave não estava funcionando. Em vez disso, basta usar uma matriz, defina 'value' como uma matriz de valores e defina 'compare' como IN:

<?php

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

?>
WhiskerSandwich
fonte
1

Você deve alias 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 agora desde o 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 );
Milo
fonte
Olá Milo, obrigado por responder. O SQL não retorna valor. E a matriz também não está retornando valor, a menos que eu remova a 2ª chave e o valor da matriz. Então isso é bugado?
steen
@steen - Não sei ao certo qual é o seu problema, testei os dois métodos e eles estão funcionando na minha instalação do 3.3.1. Sua chave é literalmente 'chave1' e valores 'valor1' e 'valor2'? Você não vê nada se você print_r( $the_query );imediatamente após a consulta?
Milo
0

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

No entanto, isso 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 );

 ?>
steen
fonte