meta_query 'compare' => 'IN' nu funcționează
În primul rând, știu că este un duplicat, dar niciuna dintre răspunsurile anterioare nu au fost de ajutor.
Caut în postări prin post_meta
. Iată codul meu, care momentan nu returnează nimic.
$args = array(
'numberposts' => -1,
'post_type' => 'post',
'meta_query' => array(
array(
'key' => 'system_power_supply',
'value' => array('single', 'redundant'),
'compare' => 'IN',
)
)
);
$query = new WP_Query($args);
echo $query->found_posts;
Dacă elimin meta_query
funcționează. Sunt sigur de următoarele lucruri:
- Nu există greșeli de ortografie în
key
sauvalue
. - tipul postării este
post
- Există într-adevăr o postare cu valoarea 'single' în 'system_power_supply'. Totuși, câmpurile postării sunt generate prin Advanced Custom Fields.

Nu există o modalitate ușoară de a căuta valori serializate într-o interogare meta. Dacă lista de valori nu este foarte lungă, ai putea să configurezi mai multe interogări meta:
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'system_power_supply',
'value' => 'single',
'compare' => 'LIKE',
),
array(
'key' => 'system_power_supply',
'value' => 'redundant',
'compare' => 'LIKE',
)
)
Sau, dacă vrei să fii mai avansat, ai putea să o configurezi dinamic:
$values_to_search = array('single', 'redundant');
$meta_query = array('relation' => 'OR');
foreach ($values_to_search as $value) {
$meta_query[] = array(
'key' => 'system_power_supply',
'value' => $value,
'compare' => 'LIKE',
);
}

Mulțumesc foarte mult, frate. Nu-ți pot spune cât de mare durere de cap mi-ai rezolvat.

Apropo, de ce meta_value conține date serializate dacă nu putem interoga prin meta_query? Este o eroare a WordPress?

Sunt femeie, nu "frate", dar nu-i problemă. Meta_value conține date serializate din cauza modului în care Advanced Custom Fields salvează datele. Nu este ideal, cu siguranță.

haha, îmi cer scuze, doamnă. A doua și a treia au funcționat bine, nu am încercat prima.

Știu că a trecut mult timp, dar doar în cazul în care cineva întâmpină aceeași problemă. Ei bine, m-am smuls de păr ore întregi înainte să descopăr problema: 'meta_query' cu operatorul de comparație 'IN' nu pare să accepte array-ul obișnuit. În schimb, trebuie mai întâi să-l concatenezi cu ', '.
Deci, în cazul tău, ceva de genul ar trebui să funcționeze:
$args = array(
'posts_per_page' => -1,
'post_type' => 'post',
'meta_query' => array(
array(
'key' => 'system_power_supply',
'value' => join(', ', array('single', 'redundant')),
'compare' => 'IN',
)
)
);
$query = new WP_Query($args);
echo $query->found_posts;

În WP 5 poți pasa direct array-ul către cheia value. Dacă folosești implode pentru a-l transforma în string, s-ar putea să obții rezultate neașteptate în privința modului în care wp împarte string-ul în segmente pentru partea IN()
. De exemplu, 'this that', 'and', 'that'
devine 'this','that','and','that'
- așadar pare mai bine să-i dai direct array-ul.
