meta_query 'compare' => 'IN' non funziona


13

Prima di tutto, so che è un duplicato, ma nessuna delle risposte più vecchie è stata utile.

Sto cercando nei post post_meta. Ecco il mio codice, che attualmente 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_queryfunziona. Sono sicuro di queste cose:

  • Non ci sono errori di ortografia nel keyo nel value.
  • il tipo di post è post
  • V'è un post con il valore 'single' a 'system_power_supply'. Tuttavia, i campi postali vengono generati da Campi personalizzati avanzati .

è system_power_supplyserializzato?
Howdy_McGee

sì. Ecco il valore nella tabella postmeta a:1:{i:0;s:6:"single";}
Rizwan

2
bene, questo è il tuo problema, la meta query non funzionerà su dati serializzati. se cerchi in questo sito la ricerca di dati serializzati troverai delle risposte, ma nessun metodo sarà l'ideale.
Milo,

Risposte:


13

Non esiste un modo semplice per cercare valori serializzati in una meta query. Se l'elenco dei valori non è pazzo a lungo, potenzialmente potresti 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',
    )
)

O se vuoi essere super fantasioso, puoi impostarlo in modo dinamico:

$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 posso dirti quanto forte mal di testa mi hai risolto.
Rizwan,

btw, perché il meta_value contenente dati serializzati se non siamo in grado di eseguire query tramite meta_query? Il bug di questo wordpress è?
Rizwan,

1
Sono una donna, non un "fratello", ma nessun problema. Il meta_valore contiene dati serializzati a causa del modo in cui i campi personalizzati avanzati salva i dati. Non è l'ideale, di sicuro.
Jen,

1
ahah, mi scuso con la signora. Il secondo e il terzo hanno funzionato bene, non hanno provato il primo.
Rizwan,

2
puoi rimuovere il primo, non funziona
Toskan,

4

So che è passato molto tempo, ma nel caso qualcuno abbia lo stesso problema. Beh, mi sono tirato i capelli per ore prima di trovare il problema: "meta_query" con l'operatore di confronto "IN" non sembra accettare il solito array. invece, devi prima unirti a ','.

Quindi, nel tuo caso, qualcosa del genere 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 del valore. Se lo implochi in una stringa, potresti ottenere risultati imprevisti riguardo al modo in cui wp divide la stringa in segmenti per la IN()parte. Ad esempio, 'this that', 'and', 'that'diventa 'this','that','and','that'- quindi sembra meglio dare semplicemente l'array.
Bananaapple,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.