template_redirect în WordPress

Hooks folosite des WordPress 1.5.0

Acțiunea care rulează înainte ca WordPress să aleagă șablonul paginii; locul potrivit pentru redirecționări.

Sintaxă
do_action( 'template_redirect' )
add_action( 'template_redirect', 'dex_functie' );

Ce face template_redirect

template_redirect rulează după ce interogarea principală s-a făcut (știi ce pagină s-a cerut: is_page(), is_singular(), is_404() funcționează) și înainte să se încarce șablonul sau să se trimită HTML. De aceea este hook-ul potrivit pentru redirecționări cu wp_safe_redirect().

După wp_safe_redirect() sau wp_redirect() scrie întotdeauna exit;, altfel WordPress continuă și afișează pagina. wp_safe_redirect() acceptă doar adrese de pe site-ul tău (sau din lista permisă); o adresă externă este înlocuită cu adresa panoului de administrare.

Documentația avertizează: nu folosi acest hook ca să încarci alt șablon cu include urmat de exit, pentru că celelalte funcții legate de template_redirect nu mai rulează. Pentru alt șablon folosește filtrul template_include.

Exemple

Exemplul 1: Pagina „Contul meu” doar pentru utilizatori autentificați

Vizitatorii neautentificați sunt trimiși la autentificare, cu adresa paginii în redirect_to, ca să revină aici după login.

add_action( 'template_redirect', 'dex_cont_doar_autentificati' );

function dex_cont_doar_autentificati() {
    if ( is_page( 'contul-meu' ) && ! is_user_logged_in() ) {
        wp_safe_redirect( wp_login_url( get_permalink() ) );
        exit;
    }
}

// Test din terminal:
// curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" https://exemplu.ro/contul-meu/

Ieșire în terminal

302 https://exemplu.ro/wp-login.php?redirect_to=https%3A%2F%2Fexemplu.ro%2Fcontul-meu%2F

Exemplul 2: Redirecționare permanentă (301) de la o pagină veche

Pagina „oferta-veche” trimite vizitatorii și motoarele de căutare la noua adresă.

add_action( 'template_redirect', 'dex_oferta_mutata' );

function dex_oferta_mutata() {
    if ( is_page( 'oferta-veche' ) ) {
        wp_safe_redirect( home_url( '/oferta/' ), 301 );
        exit;
    }
}

// curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" https://exemplu.ro/oferta-veche/

Ieșire în terminal

301 https://exemplu.ro/oferta/

Exemplul 3: Arhivele de autor transformate în 404

Pe un site cu un singur autor, arhivele de autor nu sunt utile. Marcăm interogarea ca 404 și trimitem codul HTTP; WordPress încarcă apoi șablonul 404.php.

add_action( 'template_redirect', 'dex_fara_arhive_autor' );

function dex_fara_arhive_autor() {
    if ( is_author() ) {
        global $wp_query;
        $wp_query->set_404();
        status_header( 404 );
        nocache_headers();
    }
}

// curl -s -o /dev/null -w "%{http_code}\n" https://exemplu.ro/author/ana/

Ieșire în terminal

404

Greșeli frecvente

  • Lipsește exit; după redirecționare: antetul Location pleacă, dar WordPress execută în continuare tot șablonul.
  • Redirecționare în buclă: condiția este adevărată și pe pagina de destinație (de exemplu redirecționezi „toate paginile fără login” și la pagina de login). Exclude explicit destinația.
  • Redirecționări la init: acolo is_page() nu funcționează încă. La template_redirect interogarea este gata.
  • Încărcarea altui șablon cu include + exit: folosește filtrul template_include.

Comenzi înrudite

  • init: Acțiunea care rulează după ce WordPress s-a încărcat, înainte de trimiterea antetelor; locul pentru tipuri de conținut, taxonomii și formulare.
  • add_action: Leagă o funcție de o acțiune WordPress, ca să ruleze automat când WordPress ajunge în acel punct.
  • current_user_can: Verifică dacă utilizatorul conectat are un anumit drept (capability), de exemplu manage_options sau edit_post pentru un articol.
  • get_permalink: get_permalink() întoarce adresa permanentă a unui articol sau a unei pagini; the_permalink() o afișează escapată.