meta_query 'compare' => 'IN' non funziona
Prima di tutto, so che è un duplicato, ma nessuna delle risposte precedenti è stata d'aiuto.
Sto cercando nei post attraverso post_meta
. Ecco il mio codice, che al momento non restituisce nulla.
$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;
Se rimuovo meta_query
funziona. Sono sicuro di queste cose:
- Non ci sono errori di ortografia nella
key
o nelvalue
. - il tipo di post è
post
- C'è effettivamente un post con il valore 'single' in 'system_power_supply'. Tuttavia, i campi del post sono generati da Advanced Custom Fields.

Non esiste un modo semplice per cercare valori serializzati in una meta query. Se l'elenco di valori non è eccessivamente lungo, potresti potenzialmente impostare più meta query:
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'system_power_supply',
'value' => 'single',
'compare' => 'LIKE',
),
array(
'key' => 'system_power_supply',
'value' => 'redundant',
'compare' => 'LIKE',
)
)
Oppure, se vuoi essere più sofisticato, potresti impostarlo dinamicamente:
$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',
);
}

Grazie mille, fratello. Non riesco a dirti quanto grande mal di testa mi hai risolto.

a proposito, perché il meta_value contiene dati serializzati se non possiamo interrogare tramite meta_query? È un bug di WordPress?

Sono una donna, non un "fratello", ma nessun problema. Il meta_value contiene dati serializzati a causa del modo in cui Advanced Custom Fields salva i dati. Non è l'ideale, sicuramente.

haha, mi scusi signorina. La seconda e la terza hanno funzionato bene, non ho provato la prima.

So che è passato molto tempo, ma nel caso qualcuno abbia lo stesso problema. Ho passato ore a strapparmi i capelli prima di trovare il problema: 'meta_query' con l'operatore di confronto 'IN' non sembra accettare il solito array. Invece, è necessario prima unirlo con ', '.
Quindi, nel tuo caso, qualcosa come questo dovrebbe funzionare:
$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;

In WP 5 puoi semplicemente passare l'array direttamente alla chiave value. Se lo implodi in una stringa potresti ottenere risultati imprevisti riguardo a come wp suddivide la stringa in segmenti per la parte IN()
. Ad esempio, 'this that', 'and', 'that'
diventa 'this','that','and','that'
- quindi sembra essere meglio passargli direttamente l'array.
