¿Cómo consultar múltiples valores de meta key?

27 ene 2012, 05:44:36
Vistas: 105K
Votos: 26

Cómo consultar múltiples valores de meta key 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'
            // ¿por qué esto no funciona?
            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' => '='
        ),
// este array no devuelve resultados para ambos arrays
        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);
$the_query  = new WP_Query( $args );
 ?>

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

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

                <?php endwhile; ?>
0
Todas las respuestas a la pregunta 4
2
34

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

Las consultas en el post original solo devolverán publicaciones que tengan ambas key1 = 'value1' Y key2 = 'value2'. La mayoría de los plugins de WordPress (al menos los que conozco) no almacenan múltiples valores en postmeta, para la misma publicación, usando la misma clave.

Si lo que realmente quieres es un OR (quieres obtener las publicaciones donde key1 = 'value1', así como las publicaciones donde key1 = 'value2'), entonces revisa la respuesta de @WhiskerSandwich, usando 'IN' y un array de valores para el parámetro value.

Alternativamente, puedes proporcionar un parámetro relation a `meta_query':

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

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

Nota que usar OR como relación para múltiples meta queries usando la misma clave es funcionalmente equivalente a usar IN y un array de valores para una sola.

13 mar 2012 21:07:10
Comentarios

Gracias por esto, Boone. No sabía que existía el parámetro "relation". Me ayudó mucho.

MathSmath MathSmath
22 mar 2012 00:37:45

Esto funciona si solo tienes una clave para buscar. Si tienes dos o más, puede que necesites usar 'AND' para combinarlas en el parámetro de relación, en cuyo caso la respuesta de @WhiskerSandwich abajo es la más adecuada.

SinisterBeard SinisterBeard
21 abr 2015 14:58:54
0
15

Tuve el mismo problema donde pasar múltiples arreglos para la misma clave no funcionaba. En su lugar, simplemente usa un solo arreglo, establece 'value' como un arreglo de valores y configura 'compare' como IN:

<?php

$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1', // Clave de metadato
            'value' => array('value1', 'value2'), // Valores a buscar
            'compare' => 'IN' // Operador de comparación
        ),
    )
);
$query = new WP_Query( $args ); // Ejecutar la consulta

?>
13 mar 2012 20:48:28
2

Debes hacer un alias para 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->posts.ID = $wpdp->mt1.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 puedes hacer esto desde la versión 3.1 con una meta_query:

$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1',
            'value' => 'value1',
            'compare' => '='
        ),
        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);
$query = new WP_Query( $args );
27 ene 2012 06:36:28
Comentarios

Hola Milo, gracias por responder. El SQL no devuelve ningún valor. Y el array tampoco devuelve valor a menos que elimine la segunda clave y valor del array. ¿Esto es un error?

steen steen
27 ene 2012 07:48:35

@steen - No estoy seguro de cuál es tu problema, he probado ambos métodos y funcionan en mi instalación de 3.3.1. ¿Tu clave es literalmente 'key1' y los valores 'value1' y 'value2'? ¿No ves nada si haces print_r( $the_query ); inmediatamente después de la consulta?

Milo Milo
27 ene 2012 08:14:48
0

La clave es key1 y los valores 'value1' y 'value2' lo probé tanto en texto como numérico en una instalación fresca con Twenty Eleven. print_r( $the_query ); funciona y la salida se ve normal. También probé con key1 y key2 y tampoco funciona. Funciona tan pronto como lo limito a un solo array. Verificado con diferentes navegadores.

Sin embargo, esto sí funciona.

    <?php 
$args = array(
    'meta_query' => array(
        array(
            'key' => 'wtf',
            'value' => '1',
            'compare' => '>='
        ),
// este array resulta en ningún retorno para ambos arrays
        array(
            'key' => 'wtf',
            'value' => '2',
            'compare' => '<='
        )
    )
);
$the_query  = new WP_Query( $args );

 ?>
27 ene 2012 12:59:37