Obține postări cu mai multe chei meta și valori
Încerc să obțin o postare pe baza următoarelor chei meta.
post_code
cu valoarea432C
location
cu valoareaXYZ
Ambele aparțin unui CPT. Încerc să obțin postarea care are ambele aceste valori meta.
Nu doresc o relație OR, vreau o relație AND, am încercat mai multe obiecte WP_Query
și tot nu am găsit o soluție după ore întregi de căutare.
$args = array(
'post_type' => 'your_custom_post_type',
'meta_query' => array(
'relation' => 'AND', // Relație AND între condițiile meta
array(
'key' => 'post_code',
'value' => '432C',
'compare' => '='
),
array(
'key' => 'location',
'value' => 'XYZ',
'compare' => '='
)
)
);
$query = new WP_Query($args);

Asta ar trebui să funcționeze. Relația implicită este ȘI (AND), așa că nu va trebui specificată.
$args = array(
'post_type' => 'wpse_cpt',
'meta_query' => array(
array(
'key' => 'post_code', // codul poștal
'value' => '432C',
),
array(
'key' => 'location', // locația
'value' => 'XYZ',
),
),
);
$query = new WP_Query( $args );

Am încercat asta, dar obțin prea multe informații, încerc să obțin rezultate folosind $wpdb.. Este posibil?

Aceasta va returna rezultatele pe care le-ai descris în întrebarea ta. Deci, fie trebuie să faci o interogare mai specifică, fie să te asiguri că articolele tale au metadate corecte.

$args = array(
'post_type' => 'wpse_cpt',
'meta_query' => array(
'relation' => 'AND' //**** Folosește AND sau OR conform necesităților tale pentru clauza Where
array(
'key' => 'post_code',
'value' => '432C',
),
array(
'key' => 'location',
'value' => 'XYZ',
),
),
);
$query = new WP_Query( $args );

Editare din nou: Ah, nu am răspuns la întrebare. Ai selecta a.*
pentru a obține toate coloanele postărilor cu valorile cheie corespunzătoare, în loc să selectezi c.meta_value
.
Următoarea interogare SQL/$wpdb
va selecta toate valorile meta_value%s
ale unei postări cu post_type de $postType
și o valoare meta_key de $metaKey
. Prin urmare, selectează toate valorile diferite ale unui meta_key dat (prin '$metaKey'). Tabelul term_relationships
este tabelul helper al WordPress pentru conexiuni de relații în tabele. wp_posts
este tabelul 'posts' din WordPress, iar wp_postmeta
este tabelul 'postmeta' din WordPress. (Notă: Dacă utilizați tabele personalizate, aceste nume de tabele ar putea diferi.)
~ Editat pentru a adăuga note despre 'doing', la cererea lui @MikeNGarrett
/* $wpdb este o variabilă globală furnizată de 'motorul' WordPress
** pentru interogarea tabelelor bazei de date WordPress.
*/
global $wpdb;
$postType = 'mycustomposttype';
$metaKey = 'mymetakey';
$query = "
SELECT c.meta_value
FROM wp_posts a
LEFT JOIN wp_term_relationships b
ON (a.ID = b.object_id)
LEFT JOIN wp_postmeta c
ON (a.ID = c.post_id)
WHERE a.post_type = %s AND c.meta_key = %s";
$metaValues = $wpdb->prepare(query, [$postType, $metaKey]);
$metaValues = $wpdb->get_results($metaValues);
Note: Doar reutilizez variabila $metaValues. Nu există alt motiv pentru a scrie rezultatele $metaValues prepare()
înapoi în variabila $metaValues. Cu toate acestea, trebuie să transmiți $metaValues către get_resluts()
.

Salut Eric! Poți să oferi puțin mai mult context? Mai ales răspunzând la "Ce face acest cod?" și "De ce este aceasta cea mai bună modalitate de a realiza acest lucru?"

@MikeNGarrett, am adăugat note. Serios, poți returna orice valori dorești din oricare dintre aceste trei tabele cu interogarea. Trebuie doar să schimbi tabelul din care întrebi/compară. Prin intermediul a
,b
,c
și .
și numele coloanei.

@MikeGarrett, "De ce este aceasta cea mai bună modalitate de a realiza acest lucru?". Sincer, nu știu dacă aceasta este cea mai 'bună' modalitate de a realiza acest lucru. Dar funcționează. Aș fi interesat dacă cineva găsește o metodă mai bună/mai rapidă, de asemenea. Cred că aceasta este cea mai puțin solicitantă metodă de a face asta, în limita abilităților și cunoștințelor mele actuale în acest moment.

SOLUȚIE
Soluția acceptată mai jos a funcționat, dar am vrut să știu cum funcționează?
Iată cum funcționează:
SELECT * FROM wp_posts p, wp_postmeta m1, wp_postmeta m2
WHERE p.ID = m1.post_id AND p.ID = m2.post_id
AND m1.meta_key = 'key1' AND m1.meta_value = 'value1'
AND m2.meta_key = 'key2' AND m2.meta_value = 'value2'
AND p.post_type = 'cpt' AND p.post_status = 'published'

Am încercat să folosesc soluția WP_Query sugerată mai sus, dar am primit un rezultat gol. Cea sugerată de Sheraz Ahmed funcționează bine. Iată propria mea abordare, pentru ceea ce valorează:
//baza de date
wp_posts
+---------+--------------------+--------------+
| ID | post_title | post_type |
+---------+--------------------+--------------+
| 8567 | Intro to MySQL | talk |
+---------+--------------------+--------------+
| 8590 | Intro to PHP | talk |
+---------+--------------------+--------------+
wp_postmeta
+---------------+------------+----------------+
| post_id | meta_key | meta_value |
+---------------+------------+----------------+
| 8567 | speaker | John Doe |
+---------------+------------+----------------+
| 8567 | year_of | 2021 |
+---------------+------------+----------------+
| 8590 | speaker | John Doe |
+---------------+------------+----------------+
| 8590 | year_of | 2021 |
+---------------+------------+----------------+
//căutare după speaker și an
$speaker = "John Doe";
$year_of = "2021";
$talks = $wpdb->get_results(
$wpdb->prepare(
'SELECT post_title, meta_value AS speaker
FROM '.$wpdb->prefix.'posts AS pt, '.$wpdb->prefix.'postmeta AS pm
WHERE post_type = %s AND pm.post_id = pt.id AND ( meta_key = %s AND meta_value = %s )
AND post_id IN ( SELECT post_id FROM nm_postmeta WHERE meta_key = %s AND meta_value = %s )',
array( 'talk',
'speaker',
$speaker,
'year_of',
$year_of )
)
);
foreach ( $talks as $talk ) {
echo "<p>".$talk->speaker.': '.$talk_homily->post_title."</p>";
}
John Doe: Introducere în MySQL
John Doe: Introducere în PHP

am explicat deja asta, te rog să încerci acești parametri folosind acești parametri, va rezolva automat problema
