meta_query 'compare' => 'IN' non funziona

3 apr 2015, 22:43:26
Visualizzazioni: 77.9K
Voti: 21

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 nel value.
  • 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.
3
Commenti

system_power_supply è serializzato?

Howdy_McGee Howdy_McGee
3 apr 2015 22:52:46

sì, lo è. Ecco il valore nella tabella postmeta

a:1:{i:0;s:6:"single";}

Rizwan Rizwan
3 apr 2015 23:20:01

beh, questo è il tuo problema, la meta query non funziona con dati serializzati. Se cerchi su questo sito per interrogare dati serializzati troverai alcune risposte, ma nessun metodo sarà ideale.

Milo Milo
3 apr 2015 23:30:36
Tutte le risposte alla domanda 2
7
22

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',
    );
}
3 apr 2015 23:31:58
Commenti

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

Rizwan Rizwan
3 apr 2015 23:52:29

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

Rizwan Rizwan
3 apr 2015 23:53:27

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.

Jen Jen
6 apr 2015 18:38:30

A proposito, quale soluzione ha funzionato per te?

Jen Jen
6 apr 2015 18:40:18

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

Rizwan Rizwan
6 apr 2015 19:14:18

È insolito vedere una programmatrice donna che non morde affatto :D

Rizwan Rizwan
6 apr 2015 19:22:58

puoi rimuovere il primo, non funziona

Toskan Toskan
13 mar 2016 00:13:29
Mostra i restanti 2 commenti
1

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;
21 dic 2017 13:39:19
Commenti

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.

Bananaapple Bananaapple
3 mag 2019 12:43:04