Ce face pre_get_posts
pre_get_posts rulează după ce obiectul WP_Query a fost creat, dar înainte de interogarea în baza de date. Funcția ta primește obiectul prin referință și îl modifică direct cu $query->set( 'parametru', valoare ); nu trebuie să întoarcă nimic.
Hook-ul rulează pentru toate interogările: cea principală a paginii, buclele secundare, listele din administrare. Documentația recomandă ! is_admin() și $query->is_main_query() ca să modifici doar interogarea principală a paginilor publice.
Folosește metodele obiectului primit ($query->is_home(), $query->is_search(), $query->is_category()), nu funcțiile globale is_home() etc., care verifică interogarea globală $wp_query, nu pe cea primită.
Parametri
| Parametru | Descriere |
|---|---|
$query |
Obiectul WP_Query care urmează să ruleze (transmis prin referință). |
Exemple
Exemplul 1: Pagina de articole: 6 pe pagină, fără categoria „Anunțuri”
Schimbăm doar interogarea principală a paginii de articole. ID-ul 7 este, în exemplu, categoria „Anunțuri”; un ID negativ în cat exclude categoria.
add_action( 'pre_get_posts', 'dex_pagina_articole' );
function dex_pagina_articole( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( $query->is_home() ) {
$query->set( 'posts_per_page', 6 );
$query->set( 'cat', '-7' );
}
}
Exemplul 2: Căutare doar în articole și în meniu
Implicit, căutarea include toate tipurile publice care nu au exclude_from_search. Aici o limităm la articole și la tipul dex_meniu, fără pagini.
add_action( 'pre_get_posts', 'dex_cautare_meniu' );
function dex_cautare_meniu( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
$query->set( 'post_type', array( 'post', 'dex_meniu' ) );
}
}
Exemplul 3: Arhiva meniului în ordine alfabetică
Pe arhiva tipului dex_meniu, produsele apar după titlu, de la A la Z, toate pe o singură pagină.
add_action( 'pre_get_posts', 'dex_ordine_meniu' );
function dex_ordine_meniu( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_post_type_archive( 'dex_meniu' ) ) {
$query->set( 'orderby', 'title' );
$query->set( 'order', 'ASC' );
$query->set( 'posts_per_page', -1 );
}
}
Greșeli frecvente
- Fără
is_admin()/is_main_query(): schimbi și listele din panoul de administrare, widget-urile și buclele secundare ale temei. is_home()în loc de$query->is_home(): funcția globală verifică altă interogare și condiția poate fi greșită.query_posts()în șablon în loc depre_get_posts: rulează o a doua interogare și strică paginarea;pre_get_postsmodifică direct interogarea principală.offsetsetat manual strică paginarea (pagina 2 arată aceleași articole); documentația are o secțiune separată despre offset și paginare.
Comenzi înrudite
WP_Query: Clasa care interoghează articole, pagini și tipuri personalizate după criterii: tip, categorie, câmpuri, ordine, paginare.get_posts: Întoarce un tablou de articole după aceleași argumente ca WP_Query, fără să atingă bucla principală.have_posts / the_post: Bucla WordPress (The Loop): have_posts() verifică dacă mai sunt articole, the_post() îl pregătește pe următorul.register_post_type: Înregistrează un tip de conținut personalizat (produse, evenimente, rețete), cu meniu propriu în administrare.