Come interrogare più valori meta key?
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; ?>

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.

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

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 );
?>

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

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 - 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?

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 );
?>
