Modyfikowałem wbudowane wyszukiwanie WP za pomocą pre_get_posts
filtra, pozwalając użytkownikowi sortować posty (w tym kilka niestandardowych typów postów) według różnych pól.
Problemem jest to, że gdy mówię WP, aby sortowała według wartości meta, wyklucza wszystkie posty, które nie mają tej wartości meta. Powoduje to zmianę liczby wyników, jeśli zmienisz sortowanie z powiedz „Cena” na „Data”, ponieważ w „Postach” nie ma ustawionej „Ceny”, ale „Pozycje”.
Nie tego chcę, więc chciałbym wiedzieć, czy istnieje sposób na dołączenie WSZYSTKICH postów - nawet tych, które nie mają meta wartości, którą sortuję - i umieszczenia tych bez wartości na końcu.
Wiem, jak sortować według więcej niż jednego pola, ale to nie pomaga.
Dzięki
Wydaje się, że nie jestem jedyny z tym pytaniem: sposób na dołączanie postów zarówno z, jak i bez określonego meta_key w args dla wp_query? ale nie ma tam rozwiązania.
Aktualizacja
Próbowałem odpowiedzi, ale nie jestem pewien, czy dobrze zrozumiałem, oto co mam teraz:
<?php
function my_stuff ($qry) {
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
$qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
$qry->set('order', 'ASC DESC');
$qry->set('meta_key', 'item_price');
}
Meta wartość jest liczbą (służy do przechowywania ceny, jak sugeruje nazwa)
Aktualizacja 2
Skomentowałem zamówienia i wszystko, co teraz mam, to:
<?php
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
Z tym kodem zapytanie wydaje się zwracać wszystkie posty, które nie mają item_price
klucza i żaden z nich nie ma klucza. IE problem jest teraz odwrócony.
Jeśli dodam również kod zamówienia, otrzymam 0 wyników.
Edycja: ... trzy lata później ... : PI znów miał ten problem. Próbowałem wszystkich podanych odpowiedzi i żadna nie działała. Nie jestem pewien, dlaczego niektórzy ludzie myślą, że działają, ale przynajmniej dla mnie nie działają.
Rozwiązaniem, w którym się znalazłem, jest użycie save_post
filtra - upewniając się, że wszystkie posty mają niestandardowe pola, na których chcę sortować. To trochę denerwujące, że muszę to zrobić, ale dopóki robisz to wcześniej, prawdopodobnie nie będziesz mieć problemów.
W tym przypadku budowałem „licznik wyświetleń” na postach i chciałem, aby użytkownicy mogli sortować według najczęściej czytanych postów. Znów posty, które nigdy nie były oglądane (myślę, że to raczej mało prawdopodobne - ale nadal) zniknęły podczas sortowania według liczby wyświetleń. Dodałem ten fragment kodu, aby upewnić się, że wszystkie posty mają liczbę wyświetleń:
add_action('save_post', function ($postId) {
add_post_meta($postId, '_sleek_view_count', 0, true);
});
meta_query
i zawszetax_query
są , ponieważ łączą wiele tablic. Po drugie - jak wspomniano w mojej odpowiedzi - musisz użyć liczb. Równie dobrze może być konieczne zdefiniowanie (patrz pozycja strony Kodeksu). Ostatnio, to nie ma sensu się i kierunek. To nie jest możliwe. Ogranicznik spacji działa tylko dla i nie można nakazać sortowania pierwszego i drugiego . Do tego służy filtr. array( array() )
meta_value_num
meta_value_num
WP_Query
order
ASC
DESC
orderby
ASC
DESC
posts_clauses
meta_value_num
wpisy są liczbami rzeczywistymi . Zbyt często zdarza się, że ktoś twierdzi, że jest to liczba, ale w rzeczywistości zapisuje ją jako ciąg znaków w bazie danych.
ASC DESC
jest taki, że sortuje na meta_value
w ASC
i date
w DESC
miarę mogę powiedzieć, że działa.