¿Desea consultar los valores de varias claves meta?

22

Cómo consultar los valores de las múltiples claves de metadatos 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; ?>
    
pregunta steen 27.01.2012 - 04:44

4 respuestas

30

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

Las consultas en el OP solo devolverán las publicaciones que tengan ambas key1 = 'value1' AND key2 = 'value2'. La mayoría de los complementos de WP (que yo sepa, de todos modos) no almacenan varios valores en postmeta, para la misma publicación, usando la misma clave.

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

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' => '='
        )
    )
);

Tenga en cuenta que usar OR como la relación para múltiples meta consultas utilizando la misma clave es el equivalente funcional de usar IN y una matriz de valores para una sola.

    
respondido por el Boone Gorges 13.03.2012 - 20:07
14

Tuve el mismo problema en el que no funcionaba el paso de varias matrices para la misma clave. 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 );

?>
    
respondido por el WhiskerSandwich 13.03.2012 - 19:48
1

Tienes que crear un alias de 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 puedes 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 );
    
respondido por el Milo 27.01.2012 - 05:36
0
La clave

es clave1 y los valores 'valor1' y 'valor2' lo probaron tanto de forma numérica como de texto en una instalación nueva con veintiocho. print_r ($ the_query); La salida de trabajos se ve normal. También probé key1 y key2 tampoco funciona. Funciona tan pronto como lo limito a una matriz. Comprobado con diferentes navegadores.

Sin embargo, esto 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 );

 ?>
    
respondido por el steen 27.01.2012 - 11:59

Lea otras preguntas en las etiquetas