Cum se interoghează mai multe valori pentru aceeași cheie meta?
Cum să interogăm mai multe valori meta pentru aceeași cheie
$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'
// de ce nu funcționează acest lucru?
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
";
următorul cod
<?php
$args = array(
'meta_query' => array(
array(
'key' => 'key1',
'value' => 'value1',
'compare' => '='
),
// acest array nu returnează nimic pentru ambele array-uri
array(
'key' => 'key1',
'value' => 'value2',
'compare' => '='
)
)
);
$the_query = new WP_Query( $args );
?>
<?php /* Începe Loop-ul */ ?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<?php get_template_part( 'content', get_post_format() ); ?>
<?php endwhile; ?>

Am impresia că există o confuzie între ȘI/SAU aici.
Interogările din postarea originală vor returna doar articolele care au atât key1 = 'value1' CÂT ȘI key2 = 'value2'. Cele mai multe plugin-uri WordPress (din câte știu eu, oricum) nu stochează valori multiple în postmeta, pentru același articol, folosind aceeași cheie.
Dacă ceea ce doriți este de fapt un SAU (doriți să obțineți articolele unde key1 = 'value1', precum și articolele unde key1 = 'value2'), atunci consultați răspunsul lui @WhiskerSandwich, folosind 'IN' și un array de valori pentru parametrul value.
Alternativ, puteți furniza un parametru relation
pentru `meta_query':
$args = array(
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'key1',
'value' => 'value1',
'compare' => '='
),
array(
'key' => 'key1',
'value' => 'value2',
'compare' => '='
)
)
);
Rețineți că utilizarea OR ca relație pentru interogări multiple de meta folosind aceeași cheie este echivalentul funcțional al utilizării IN
și a unui array de valori pentru una singură.

Mulțumesc pentru asta, Boone. Nu știam că există parametrul "relation". M-a ajutat mult.

Am avut aceeași problemă în care trecerea mai multor array-uri pentru aceeași cheie nu funcționa. În schimb, folosește un singur array, setează 'value' la un array de valori și setează 'compare' la IN:
<?php
$args = array(
'meta_query' => array(
array(
'key' => 'key1',
'value' => array('value1', 'value2'),
'compare' => 'IN'
),
)
);
$query = new WP_Query( $args );
?>

Trebuie să folosești un alias pentru tabela postmeta pentru a doua valoare:
$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
";
Începând cu versiunea 3.1, poți face acest lucru și folosind 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 );

Salut Milo, mulțumesc pentru răspuns. Interogarea SQL nu returnează nicio valoare. Și array-ul nu returnează nicio valoare decât dacă elimin al doilea key și valoarea din array. Deci este o eroare aici?

Cheia este key1 și valorile 'value1' și 'value2' am încercat atât text cât și numeric într-o instalație proaspătă cu twenty eleven. print_r( $the_query ); funcționează, ieșirea arată normal. Am încercat și key1 și key2, de asemenea nu funcționează. Funcționează imediat ce limitez la un singur array. Am verificat cu diferite browsere.
Aceasta însă funcționează.
<?php
$args = array(
'meta_query' => array(
array(
'key' => 'wtf',
'value' => '1',
'compare' => '>='
),
// acest array nu returnează nimic pentru ambele array-uri
array(
'key' => 'wtf',
'value' => '2',
'compare' => '<='
)
)
);
$the_query = new WP_Query( $args );
?>
