meta_query 'compare' => 'IN' nu funcționează

3 apr. 2015, 22:43:26
Vizualizări: 77.9K
Voturi: 21

Î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 sau value.
  • 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.
3
Comentarii

este system_power_supply serializat?

Howdy_McGee Howdy_McGee
3 apr. 2015 22:52:46

da, este. Iată valoarea din tabelul postmeta

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

Rizwan Rizwan
3 apr. 2015 23:20:01

păi asta e problema ta, interogarea meta nu va funcționa pe date serializate. dacă cauți pe acest site informații despre interogarea datelor serializate vei găsi câteva răspunsuri, dar nicio metodă nu va fi ideală.

Milo Milo
3 apr. 2015 23:30:36
Toate răspunsurile la întrebare 2
7
22

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

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

Rizwan Rizwan
3 apr. 2015 23:52:29

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

Rizwan Rizwan
3 apr. 2015 23:53:27

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ță.

Jen Jen
6 apr. 2015 18:38:30

Apropo, ce soluție a funcționat pentru tine?

Jen Jen
6 apr. 2015 18:40:18

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

Rizwan Rizwan
6 apr. 2015 19:14:18

E neobișnuit să vezi o programatoare care nu mușcă deloc :D

Rizwan Rizwan
6 apr. 2015 19:22:58

poți să-l elimini pe primul, nu funcționează

Toskan Toskan
13 mar. 2016 00:13:29
Arată celelalte 2 comentarii
1

Ș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;
21 dec. 2017 13:39:19
Comentarii

Î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.

Bananaapple Bananaapple
3 mai 2019 12:43:04