Come interrogare più valori meta key?

27 gen 2012, 05:44:36
Visualizzazioni: 105K
Voti: 26

Come interrogare più valori meta key con la stessa chiave

$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'
            // perché questo non funziona?
            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
                ";

codice successivo

<?php 
$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1',
            'value' => 'value1', 
            'compare' => '='
        ),
// questo array non restituisce risultati per entrambi gli array
        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);
$the_query = new WP_Query( $args );
?>

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

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

                <?php endwhile; ?>
0
Tutte le risposte alla domanda 4
2
34

Mi sembra che ci sia una confusione tra AND/OR qui.

Le query nel post originale restituiranno solo i post che hanno entrambi key1 = 'value1' E key2 = 'value2'. La maggior parte dei plugin di WP (almeno quelli che conosco) non memorizza valori multipli in postmeta, per lo stesso post, utilizzando la stessa chiave.

Se quello che vuoi è veramente un OR (vuoi ottenere i post dove key1 = 'value1', così come i post dove key1 = 'value2'), allora guarda la risposta di @WhiskerSandwich, utilizzando 'IN' e un array di valori per il parametro value.

In alternativa, puoi fornire un parametro relation a `meta_query':

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

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

Nota che utilizzare OR come relazione per multiple meta query usando la stessa chiave è funzionalmente equivalente a usare IN e un array di valori per una singola query.

13 mar 2012 21:07:10
Commenti

Grazie per questo, Boone. Non sapevo che esistesse il parametro "relation". Mi è stato molto utile.

MathSmath MathSmath
22 mar 2012 00:37:45

Questo funziona se hai solo una chiave su cui cercare. Se ne hai due o più, potresti aver bisogno di usare 'AND' per combinarle nel parametro relationship, nel qual caso la risposta di @WhiskerSandwich qui sotto è più adatta.

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

Ho avuto lo stesso problema in cui passare array multipli per la stessa chiave non funzionava. Invece, usa semplicemente un array, imposta 'value' con un array di valori e 'compare' a IN:

<?php

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

?>
13 mar 2012 20:48:28
2

Devi creare un alias per la tabella postmeta per il secondo valore:

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

Puoi anche farlo ora dalla versione 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 );
27 gen 2012 06:36:28
Commenti

Ciao Milo, grazie per la risposta. La SQL non restituisce alcun valore. E anche l'array non restituisce alcun valore a meno che non rimuova la seconda chiave e il valore dall'array. Quindi è un bug?

steen steen
27 gen 2012 07:48:35

@steen - Non sono sicuro di quale sia il tuo problema, ho testato entrambi i metodi e funzionano nella mia installazione della versione 3.3.1. La tua chiave è letteralmente 'key1' e i valori sono 'value1' e 'value2'? Non vedi nulla se fai print_r( $the_query ); immediatamente dopo la query?

Milo Milo
27 gen 2012 08:14:48
0

La chiave è key1 e i valori 'value1' e 'value2' provati sia come testo che numerici in un'installazione fresca con twenty eleven. print_r( $the_query ); funziona e l'output appare normale. Ho anche provato con key1 e key2 ma non funziona comunque. Funziona non appena lo limito a un solo array. Verificato con diversi browser.

Tuttavia, questo funziona.

    <?php 
$args = array(
    'meta_query' => array(
        array(
            'key' => 'wtf',
            'value' => '1',
            'compare' => '>='
        ),
// questo array non restituisce risultati per entrambi gli array
        array(
            'key' => 'wtf',
            'value' => '2',
            'compare' => '<='
        )
    )
);
$the_query  = new WP_Query( $args );

 ?>
27 gen 2012 12:59:37