Zapytaj wszystkie posty, w których nie istnieje meta-klucz


50

Usiłuję uzyskać zapytanie, aby pobrać wszystkie posty, w których określony meta_keynie 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 idsz postów z kluczem, colorsilekroć ten klucz jest obecny (odwrotnie niż to, czego potrzebuję). Spróbowałem EXISTzamiast 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!


Jakiej wersji WordPress używasz?
s_ha_dum

Cześć, przepraszam za pominięcie. Używam
v3.5

Wygląda na to, że ten typ zapytania (z zestawem porównawczym NIE ISTNIEJE) został dodany w 3.5, więc powinien działać tak, jak jest, o ile widzę. Łatwo byłoby to jednak zrobić za pomocą niestandardowego zapytania SELECT ...
Tomas Buteler,

Dzięki, spróbuję użyć select. Muszę jednak dowiedzieć się, przed którymi tabelami zapytać i jak dostosować zapytanie :(
JordanBel,

Bardzo dziwny. Nie mogę wykryć problemu z tym kodem, a używasz wersji 3.5+, dlatego zapytałem. Czy rzeczywiście spojrzałeś na bazę danych, aby potwierdzić, że twoje dane są wstawiane tak, jak myślisz?
s_ha_dum

Odpowiedzi:


73

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

'meta_query' => array(
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS' // this should work...
    ),
)

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.

'meta_query' => array(
   'relation' => 'OR',
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS' // doesn't work
    ),
    array(
     'key' => 'colors',
     'value' => 'blue'
    )
)

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 EXISTSwarunek miał jakikolwiek efekt.

'meta_query' => array(
   'relation' => 'OR',
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS', // works!
     'value' => '' // This is ignored, but is necessary...
    ),
    array(
     'key' => 'colors',
     'value' => 'blue'
    )
)

Tak było do czasu WordPress 3.9. Jeśli nadal używasz starszej wersji, jest to realne obejście.


Dzięki! Przepraszam za opóźnienie. Skończyło się na użyciu zapytania, ale będę testować twoje rozwiązanie w ciągu następnych godzin, aby móc wrócić z powrotem i być może, jeśli ta praca pomoże innym. Dam ci znać, gdy tylko będę mógł to sprawdzić.
Jeszcze

Dobrze napisane i potwierdzone, że dodanie pustej wartości zwraca oczekiwane wyniki. Powiedziałbym, że to niezamierzone, warto spojrzeć na trac.wordpress.org, aby sprawdzić, czy jest już bilet, jeśli nie, jest to powtarzalne.
Taylor Dewey,

Dzięki za świetne wyjaśnienie i rozwiązanie, by oszukać WP :) Długo się tu dostałem - ale teraz chcę kliknąć głosowanie przynajmniej 10 razy (jeśli tylko mógłbym;))
lorem małpa

Jeśli użyję porównania ISTNIEJE, wartość nie jest niestety ignorowana w nowszych wersjach WP (testowanych w 4.2.2)
Igor Jerosimić

10
EXISTSI NOT EXISTS„błąd”, który wymagany do określenia wartości, została ustalona w WP 3.9
trex005

11

Przy użyciu niestandardowego zapytania zadziałało to dla mnie:

SELECT * FROM wp_posts as posts
            WHERE   posts.post_type     = 'post'
            AND NOT EXISTS (
              SELECT * FROM `wp_postmeta`
               WHERE `wp_postmeta`.`meta_key` = "your_meta_key"
                AND `wp_postmeta`.`post_id`=posts.ID
            ) 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.