¿Consultar múltiples valores de metaclaves?

22

Cómo consultar valores de metaclaves múltiples con la misma clave

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

siguiente 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
fuente

Respuestas:

31

Siento que hay una confusión AND / OR aquí.

Las consultas en el OP sólo se devolverán los mensajes que tienen tanto key1 = 'valor1' Y clave2 = 'valor2'. La mayoría de los complementos de WP (que yo sepa, de todos modos) no almacenan múltiples valores en postmeta, para la misma publicación, usando la misma clave.

Si lo que quiere es realmente un OR (desea obtener las publicaciones donde key1 = 'value1', así como las publicaciones donde key1 = 'value2'), vea la respuesta de @ WhiskerSandwich, usando 'IN' y una matriz de valores para el parámetro de valor.

Alternativamente, puede proporcionar un relationparámetro para 'meta_query':

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

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

Tenga en cuenta que usar OR como la relación para múltiples metaconsultas usando la misma clave es el equivalente funcional de usar INy una matriz de valores para una sola.

Gargantas de Boone
fuente
Gracias por esto, Boone. No sabía que existía el parámetro de "relación". Me ayudó a salir.
MathSmath
Esto funciona si solo tiene una clave para buscar. Si tiene dos o más, es posible que necesite usar 'Y' para combinarlos en el parámetro de relación, en cuyo caso la respuesta de @ WhiskerSandwich a continuación es la mejor opción.
SinisterBeard
14

Tuve el mismo problema en el que pasar múltiples arreglos para la misma clave no funcionaba. En su lugar, solo use una matriz, establezca 'valor' en una matriz de valores y establezca 'comparar' en IN:

<?php

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

?>
BigoteSandwich
fuente
1

Debe alias la tabla postmeta para el 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
            ";

También puede hacer esto ahora desde 3.1 con 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 );
Milo
fuente
Hola Milo, gracias por responder. El SQL no devuelve ningún valor. Y la matriz tampoco devuelve ningún valor a menos que elimine la segunda clave y el valor de la matriz. Entonces, ¿está molesto?
steen
@steen: no estoy seguro de cuál es su problema, he probado ambos métodos y están funcionando en mi instalación de 3.3.1. ¿Es su clave literalmente 'clave1' y los valores 'valor1' y 'valor2'? ¿No ves nada si print_r( $the_query );inmediatamente después de la consulta?
Milo
0

La clave es clave1 y los valores 'valor1' y 'valor2' lo probaron tanto en texto como numérico en una nueva instalación con veinte once. print_r ($ the_query); El resultado de trabajo parece normal. También probé key1 y key2 tampoco funciona. Funciona tan pronto como lo limito a una matriz. Comprobado con diferentes navegadores.

Esto sin embargo 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
fuente