Usiłuję uzyskać zapytanie, aby pobrać wszystkie posty, w których określony meta_key
nie istnieje, a następnie go utworzyć.
Mam problem ze znalezieniem tych postów, ponieważ testowane przeze mnie zapytanie nie działa.
Oto kod, którego używam, aby uzyskać te posty:
$args = array(
'posts_per_page' => 18,
'cat'=>1955,
'post_status'=>'publish',
'meta_query' => array(
array(
'key' => 'colors',
'compare' => 'NOT EXISTS'
),
));
query_posts($args);
To nic nie zwraca, jeśli nie ma postów z kluczem colors
, ale zwraca je ids
z postów z kluczem, colors
ilekroć ten klucz jest obecny (odwrotnie niż to, czego potrzebuję). Spróbowałem EXIST
zamiast tego, ale bez powodzenia.
Jeśli ktoś może podpowiedzieć mi prawidłowy sposób tworzenia zapytania takiego jak to, którego potrzebuję, docenię to.
Dzięki!
custom-post-types
wp-query
post-meta
JordanBel
źródło
źródło
Odpowiedzi:
Zrobiłem z tym więcej testów i szczerze mówiąc, nie mogę znaleźć powodu, dla którego nie zadziałałoby (chyba że powyższy kod jest tylko fragmentem kodu, a prawdziwy kod pasuje do moich przykładów poniżej). Odkryłem jednak kilka rzeczy, które mogą poprowadzić cię we właściwym kierunku.
1) Sama meta-kwerenda jest odpowiednikiem „kolorów IS NULL”, tzn. Zwróci posty, które nie mają tego klucza ustawionego w tabeli postmeta. Jest to przypadek pokazany powyżej i powinien był zadziałać.
2) Przed WordPress 3.9 ustanowienie indeksu „relacji” do „LUB” zmienia ten warunek. Zwraca odwrotność. Nie pytaj mnie dlaczego. Jest to szczególnie ważne podczas wykonywania wielu meta-zapytań. Oznacza to, że początkowo nie można wykonać zapytania dotyczącego postów, w których klucz „kolory” jest ustawiony na „niebieski” (lub cokolwiek innego) lub w ogóle nie jest ustawiony. Poniższe zapytanie zignoruje pierwszy warunek i zwróci tylko te, które pasują do drugiego warunku.
3) Możemy jednak oszukać WordPress do używania pierwszego warunku, jeśli ustawimy „wartość”. Nie potrzebuje odpowiedniej wartości (o ile wiem, jest ignorowana), ale należy ją ustawić , aby
NOT EXISTS
warunek miał jakikolwiek efekt.Tak było do czasu WordPress 3.9. Jeśli nadal używasz starszej wersji, jest to realne obejście.
źródło
EXISTS
INOT EXISTS
„błąd”, który wymagany do określenia wartości, została ustalona w WP 3.9Przy użyciu niestandardowego zapytania zadziałało to dla mnie:
źródło