Oto argumenty mojego zapytania:
$args = array(
'post_type' => 'news',
'meta_query' => array(
array(
'key' => 'topics',
'value' => 'sports',
)
)
);
Działa topics
to, gdy jest łańcuchem, ale nie, gdy jest tablicą. Chciałbym, aby to zapytanie działało, gdy topics
jest na przykładarray( 'sports', 'nonprofit', etc. )
Czy istnieje sposób na budowanie meta-zapytań z tablicami jako meta_key?
query
meta-query
mike23
źródło
źródło
Odpowiedzi:
Karmienie kwerendy tablicą możliwych wartości
Jeśli wartość w bazie danych jest łańcuchem i chcesz wprowadzić do zapytania kilka wartości:
Wyszukiwanie określonej wartości w szeregowym szeregu danych
Jeśli wartość w bazie danych jest tablicą kilku tematów i chcesz wyszukać pojedynczy temat w tej tablicy (zwróć uwagę, że tablicę w bazie danych można pobrać jako taką, ale żyje ona w bazie danych w postaci szeregowej, która jest string również):
Użycie „LIKE” jako wartości porównania nie jest tak jednoznaczną instrukcją, jak można się było spodziewać, ale jest to najlepsza opcja.
Oprócz tego jedyną inną opcją byłoby pobieranie wszystkich postów z ustawionymi „tematami” meta_key i iterowanie nad nimi ręcznie, innymi słowy, sprawdzanie wartości w pętli i wyświetlanie postów w tym stanie.
źródło
Aby odejść od odpowiedzi Johannesa, ponieważ jest to szeregowa tablica, jeśli zdarza się, że przechowuje się coś w rodzaju identyfikatora użytkownika (tak było w moim przypadku), być może trzeba potraktować to nieco inaczej.
Zapisano posta meta w następujący sposób:
Tak więc są liczbami całkowitymi, ale dzięki temu
update_post_meta
zostały zapisane jako ciągi znaków.Więc faktycznie porównujesz LIKE z serializowaną wersją ciągów tego, czego szukasz. Spędziłem dobre godziny, starając się, aby coś takiego działało i do tej pory było to najlepsze, co mogłem wymyślić.
źródło
'meta_query' => array( array( 'key' => 'my_meta_key', 'value' => ':' . $user_id . ';', 'compare' => 'NOT LIKE' ) )
Ponieważ po serializacji wszystkie wartości są zapisywane w następujący sposób: ' :wartość;'Kolejna niewielka poprawa w stosunku do odpowiedzi @sMyles.
Miałem przypadki, w których identyfikatory były przechowywane zarówno jako ciągi znaków (np. Gdy zostały pobrane z danych wejściowych formularza), jak i jako liczby całkowite (np
update_post_meta($post_id, authorized_users', array(get_current_user_id()));
.). Jest to rodzaj dobrze znanego problemu polegającego na tym,wp_set_object_terms()
że można używać identyfikatorów terminów do ustawiania warunków, ale jeśli nie użyjesz ich jako liczb całkowitych, masz około 50% szansy na utworzenie nowych warunków z tymi liczbami jako ich nazwami zamiast.Może to spowodować, że będą one przechowywane zupełnie inaczej w szeregowej tablicy, co można zobaczyć na podstawie fragmentów takiego przypadku z bazy danych mojej witryny testowej:
Oba powyższe, po przejściu
print_r()
będą renderowane jakoAby to naprawić, wprowadziłem niewielką modyfikację
meta_query
, dodającrelation
kolejną wersję zapytania, która rzuciła wartość jako liczbę całkowitą zamiast ciągu.Oto końcowy wynik:
EDYCJA: Właśnie zdałem sobie sprawę, że ta metoda może narazić na ryzyko kolizji z indeksami tablic, co może umożliwić komuś nielegalny dostęp do materiałów, jeśli nie ma go w tablicy, ale jego identyfikator użytkownika pojawia się jako indeks. W związku z tym, chociaż działa to w przypadku omówienia problemu, lepszą praktyką jest dopilnowanie, aby wszystkie wartości, które chcesz wyszukać, były rzutowane jako ciągi przed zapisaniem ich, aby zamiast tego można było użyć metody @sMyles.
źródło
Chciałbym uzyskać odpowiedź Johannesa. Jednak chcę to poprawić, ponieważ używając tego meta_query, spotkasz taki przypadek
twoja wartość to
podczas wyszukiwania
wtedy wynik zwróci zarówno „sport”, jak i „sport2”.
Aby to naprawić, zmień argumenty meta_query na
Jest tak, ponieważ wartość jest serializowana w bazie danych, a każdy element będzie oddzielony średnikiem. Tak więc powyższe argumenty będą działać
Jeśli elementy w wartości są liczbą, wystarczy usunąć podwójny cudzysłów „
źródło
Walczyłem dzisiaj z czymś podobnym. Muszę wysłać zapytanie o pole relacji ACF (Advanced Custom Fields) z wieloma powiązanymi użytkownikami (macierz).
Po zaktualizowaniu pola przez php zapytanie nie działało. Po zaktualizowaniu go za pomocą interfejsu ACF zapytanie działało.
Problem polegał na tym, że mój kod php ustawił wartości relacji na int-wartości, a interfejs użytkownika ustawił na wartości łańcuchowe. Aby upewnić się, że obie działają, używam teraz tego zapytania (dopasowanego do przykładu tutaj):
źródło