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: antetulLocationpleacă, 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: acolois_page()nu funcționează încă. Latemplate_redirectinterogarea este gata. - Încărcarea altui șablon cu
include+exit: folosește filtrultemplate_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ă.