Pracuję nad niestandardowym szablonem strony z terminologią taksonomii, w której chcemy, aby elementy powiązane z terminem były sortowane według daty publikacji (niestandardowe pole daty) - i jeśli w tym samym dniu jest wiele pozycji (sformatowanych jak RRRR-MM- DD), aby następnie posortować je według tytułu, a na koniec posortować według tytułu, jeśli niestandardowe pole nie zostało wypełnione (starsze elementy).
Tak więc wypróbowałem go na sto różnych sposobów z WP_query i zwraca większość wyników, tak jak chcę, ale w tym przypadku zwraca tylko te elementy, które mają meta_klucz z data_publikacji. Wszystkie pozostałe elementy są ignorowane i nie są wyświetlane. Próbowałem meta_query przy użyciu relacji „lub” i porównałem data_opublikowania jako EXISTS i NOT EXISTS, ale to zwróciło dla mnie 0 wyników.
Ponadto witryna nadal działa w wersji 3.5.2 i nie chcą jej aktualizować.
Oto moje ostatnie zapytanie, które powoduje, że posty z polem niestandardowym data_publikacji są wyświetlane we właściwej kolejności:
$term = get_queried_object(); // find the term of the taxonomy page we are on
$wp_query = new WP_Query( array(
'post_type' => 'resource',
'tax_query' => array(
array(
'taxonomy' => 'resource_types',
'field' => 'slug',
'terms' => $term->name,
)),
'meta_key' => 'publication_date',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'paged' => $paged,
'posts_per_page' => '10',
));
Próbowałem także użyć wpdb i uruchomić zapytanie SQL, ale tak naprawdę nie jestem pewien, jak to zrobić. Gdyby ktoś mógł mi pomóc, byłoby wspaniale!
Z góry dziękuję.
źródło
'meta_query' => array( 'relation' => 'OR', array( //check to see if date has been filled out 'key' => 'publication_date', 'compare' => '!=', 'value' => date('Y-m-d'), ), array( //if no date has been added show these posts too 'key' => 'publication_date', 'value' => date('Y-m-d'), 'compare' => 'NOT EXISTS' ) ),
ale kolejność nie działa: \Odpowiedzi:
Dziękuję wszystkim za waszą pomoc!
Na koniec poniższe zapytanie dostarczyło mi pożądane wyniki - które miały najpierw wyświetlać i sortować posty według niestandardowego pola „data_publikacji” - sortowanie według daty, a jeśli było wiele takich samych dat (powiedzmy 4 oznaczone Czerwiec 2013), posortuje je według tytułu. Następnie, po przejściu przez wszystkie posty z wypełnioną datą publikacji, ponownie przejdzie przez pozostałe posty, alfabetycznie według tytułów.
Dzięki temu otrzymuję wyniki ustawione w tym samym zapytaniu i zachowuje moją paginację:
źródło
meta_query
na tym samym kluczu!meta_key
go automatycznie, nie będzie go zawierał nawet zNOT EXISTS
. Naprawdę mam nadzieję, że robię coś źle.'meta_key' => 'publication_date',
.Kilka lat później kod opublikowany przez CSSGirl nie działał dla mnie, ponieważ były posty, które nie miały meta-klucza lub meta-klucz był pusty, więc to właśnie musiałem zrobić, aby wszystkie posty były uporządkowane według daty i najpierw pokaż te z meta-kluczem:
źródło
Myślę, że musisz zrobić 2 osobne pętle. Możesz łatwo przechwycić wszystkie posty znalezione w pierwszej pętli i łatwo wykluczyć je z drugiej pętli:
Następnie uruchom drugą pętlę.
źródło
echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?page=%#%', 'current' => max( 1, get_query_var('paged') ), 'total' => $publication_query->max_num_pages, 'prev_text' => __('Previous |'), 'next_text' => __('| Next'), ) );
Czy istnieje powód, dla którego nie można wymusić istnienia meta-klucza public_date dla każdego postu z pustą wartością?
Więc w swoim
save_post
działaniu dodałeś / zaktualizowałeś meta klucz, niezależnie od tego, czy$_POST
wartość jest pusta, czy nie.Będziesz musiał uruchomić skrypt aktualizacyjny, aby przejrzeć starsze posty i dodać klucz z pustą wartością, np .:
Uruchom go, przeglądając http://example.com/wp-admin/?update_old_posts
Następnie możesz użyć tego samego zapytania, co masz. Możesz chcieć dodać dodatkowy filtr, aby umożliwić Ci porządkowanie według różnych kolumn w różnych kierunkach, sensowne byłoby dla mnie sortowanie według daty w porządku malejącym i tytułu w porządku rosnącym.
źródło
Stworzyłem niestandardową klauzulę where. Testowałem go przy użyciu
$wp_query->request
tuż przed moją główną pętlą, tak naprawdę nie znam dobrze SQL, ale wydawało się, że to działa.Alternatywnie, można ustawić
compare
się'EXISTS'
i zmienić linię w add_trending_where do$where .= " OR ($wpdb->postmeta.post_id IS NULL)";
. Wtedy wystarczy zmienić wartość klucza tylko w jednym miejscu. Ponownie wykonaj echo$wp_query->request
i baw się, jeśli chcesz to lepiej zrozumieć lub dostosować.EDYCJA: Właśnie zauważyłem, że to nie działa, jeśli
meta_key
jest ustawione w zapytaniu. Możesz użyć,$query->set('meta_key', NULL);
jeśli musisz.EDYCJA 2: Mam tę pracę z powyższą metodą. Z jakiegoś powodu nie było na początku (może ustawiono meta_key ... nie wiem).
źródło