pre_get_posts în WordPress

Hooks folosite des WordPress 2.0.0

Acțiunea care îți permite să schimbi parametrii unei interogări WP_Query înainte să ruleze, fără query_posts() în șablon.

Sintaxă
do_action_ref_array( 'pre_get_posts', WP_Query $query )
add_action( 'pre_get_posts', 'dex_functie' );

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 de pre_get_posts: rulează o a doua interogare și strică paginarea; pre_get_posts modifică direct interogarea principală.
  • offset setat 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.