meta_query 'porównaj' => 'IN' nie działa

14

Po pierwsze wiem, że to duplikat, ale żadna ze starszych odpowiedzi nie była pomocna.

Przeszukuję posty za pośrednictwem post_meta. Oto mój kod, który obecnie nic nie zwraca.

$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;

Jeśli usunę meta_queryto działa. Jestem pewien tych rzeczy:

  • Nie ma pomyłki w pisowni w keylub value.
  • typ postu to post
  • W „system_power_supply” jest post o wartości „single”. Jednak pola wpisów są generowane przez zaawansowane pola niestandardowe .
Rizwan
źródło
jest system_power_supplyserializowany?
Howdy_McGee
Tak to jest. Oto wartość w tabeli postmeta a:1:{i:0;s:6:"single";}
Rizwan
2
cóż, to twój problem, meta kwerenda nie będzie działać na danych serializowanych. jeśli przeszukujesz tę witrynę w poszukiwaniu zapytań o dane serializowane, znajdziesz odpowiedzi, ale żadna metoda nie będzie idealna.
Milo,

Odpowiedzi:

13

Nie ma łatwego sposobu wyszukiwania serializowanych wartości w meta zapytaniu. Jeśli lista wartości nie jest zwariowana, potencjalnie możesz skonfigurować wiele meta-zapytań:

'meta_query'    => array(
    'relation' => 'OR',
    array(
        'key'       => 'system_power_supply',
        'value'     => 'single',
        'compare'   => 'LIKE',
    ),
    array(
        'key'       => 'system_power_supply',
        'value'     => 'redundant',
        'compare'   => 'LIKE',
    )
)

Lub jeśli chcesz być bardzo fantazyjny, możesz ustawić go dynamicznie:

$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',
    );
}
Jen
źródło
Dziękuję bardzo, stary. Nie mogę ci powiedzieć, jak duży ból głowy rozwiązałeś u mnie.
Rizwan
btw, dlaczego wartość meta_value zawierająca dane serializowane, jeśli nie jesteśmy w stanie wykonać zapytania za pomocą meta_query? Czy błąd tego wordpressa?
Rizwan
1
Jestem kobietą, nie „bratem”, ale nie ma problemu. Meta_value zawiera dane zserializowane ze względu na sposób, w jaki Advanced Custom Fields zapisuje dane. Na pewno nie jest idealny.
Jen
1
haha, przepraszam moją damę. Drugi i trzeci działały dobrze, nie próbowałem pierwszego.
Rizwan
2
możesz usunąć pierwszy, to nie działa
Toskan
4

Wiem, że minęło dużo czasu, ale na wypadek, gdyby ktoś miał ten sam problem. Cóż, ciągnęłam włosy przez wiele godzin, zanim znalazłam problem: „meta_query” z operatorem porównania „IN” nie akceptuje zwykłej tablicy. zamiast tego musisz najpierw dołączyć do niego za pomocą „,”.

W twoim przypadku coś takiego powinno działać:

$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;
Badr
źródło
W WP 5 możesz po prostu przekazać tablicę bezpośrednio do klucza wartości. Jeśli wszczepisz go do łańcucha, możesz uzyskać nieoczekiwane wyniki w odniesieniu do tego, jak wp dzieli łańcuch na segmenty dla IN()części. Np. 'this that', 'and', 'that'Staje się 'this','that','and','that'- wydaje się, że lepiej jest po prostu dać mu tablicę.
Bananaapple