Widzę, że wiele osób woli używać zaczepu pre_get_posts zamiast query_posts
Tak!
Tak pre_get_posts
filtruje WP_Query
obiektu , co oznacza niczego można zrobić poprzez query_posts()
można zrobić poprzez $query->set()
a $query->get()
. W szczególności możemy skorzystać z meta_query
atrybutu (patrz Kodeks ):
$meta_query = array(
array(
'key'=>'featured',
'value'=>'yes',
'compare'=>'!=',
),
);
$query->set('meta_query',$meta_query);
Ale… to zastępuje oryginalne „meta kwerenda” (jeśli taka miała). Więc jeśli nie chcesz całkowicie zastąpić oryginalnego zapytania meta, sugeruję:
//Get original meta query
$meta_query = $query->get('meta_query');
//Add our meta query to the original meta queries
$meta_query[] = array(
'key'=>'featured',
'value'=>'yes',
'compare'=>'!=',
);
$query->set('meta_query',$meta_query);
W ten sposób dodajemy nasze zapytanie do meta obok istniejących zapytań do meta.
Możesz / możesz nie chcieć ustawić relation
właściwości $meta_query
na AND
lub OR
(aby zwracać posty, które spełniają wszystkie, lub przynajmniej jedno, meta-zapytania).
* Uwaga: ten typ zapytania zwróci posty z „polecanym” meta kluczem, ale którego wartość nie jest yes
. Nie będzie zawierać postów, w których „polecany” meta klucz nie istnieje. Będziesz mógł to zrobić w 3.5 .
Yes
iNo
opcje i „nie” będzie domyślnie zaznaczona. Kiedy chcę polecić post, wybioręYes
. Chcę jednak, aby 5 ostatnich postów pozostało polecanych, a inne będą wyświetlane w głównym zapytaniu. Nie chcę wracać i zmieniać wyboru za każdym razem, więc muszę znaleźć sposób na wykluczenie tylko ostatnich 5 postów. Widzę wiele podobnych pytań na temat stackexchange i powinien istnieć łatwy sposób zarządzania tymi polecanymi postami. (sposób, który nie wpływa na ogólną wydajność, nie tworzy wielu zapytań ani nie wymaga mieszanych zapytań SQL)Yes
lubNo
wartości dla wszystkich postów. Byłoby wspaniale wykluczyć te posty, które po prostu nie mająfeatured
klucza.Uncaught Error: [] operator not supported for strings
błąd, ponieważ oryginałmeta_query
wracał jako zerowy. Można to obejść przez sięgnięcie do pustej tablicy, jeśli żaden nie istnieje przełączania się$meta_query = $query->get('meta_query');
na$meta_query = ( is_array( $query->get('meta_query') ) ) ? $query->get('meta_query') : [];
.Chcę opublikować moje tymczasowe rozwiązanie dla polecanych postów na wypadek, gdyby niektóre osoby mogły z niego skorzystać. Nie używam
pre_get_posts
tutaj haczyka, ale też niequery_posts
. Problem polega na tym, że muszę grać z głównym zapytaniem i uruchomić kawałek zapytania SQL. Byłbym szczęśliwy, gdyby jakikolwiek ekspert mógł sprawdzić kod i dać mi znać, czy jest w porządku i nie spowoduje żadnych problemów z wydajnością. Będzie również świetnie, jeśli ktoś będzie miał lepsze podejście i podzieli się nim z nami.Utwórz zapytanie o polecane posty
Utwórz główne zapytanie, wyklucz posty z poleconym meta_key, ogranicz wykluczenie do 5 najnowszych postów i pokaż wszystkie inne.
źródło
W odpowiedzi na @Carlisle, jeśli chcesz wykluczyć 5 najnowszych postów oznaczonych jako polecane, możesz wykonać następujące czynności. Zmień stronę posts_per_page na liczbę, które chcesz wykluczyć, a meta_query na sposób oznaczania polecanej kategorii.
źródło