Cuando usar template_redirect y template_include

¿ Cuando deberíamos usar template_redirect y cuando deberíamos usar template_include ?

Echando un ojo al codex de wordpress.org podemos leer claramente en que situaciones debemos usar una u otra función, pero a pesar de tener esto plasmado en la documentación a veces puede resultar confuso.

template_redirect

Este hook se ejecuta justo antes de que WordPress determine que template debe usar. Es decir,  que cuando se ejecuta WordPress ya ha hecho las consultas principales necesarias e instanciado todos los objetos, todo esta hecho excepto el “output”.

Es el punto ideal para redirigir al usuario a otro lugar queriendo tener conocimiento del contenido.

No es una buena práctica usar este hook para incluir una plantilla distinta.

Supongamos que usamos template_redirect para incluir una plantilla:

1
2
3
4
5
6
7
8
add_action( 'template_redirect', 'switch_template' );
 
function switch_template() {
  if ( is_page('test') ) {
    include( PATH . '/test-file.php' );
    exit();
  }
}

El problema aquí es que cualquier script que venga después de este código no va a ejecutarse.

La manera correcta de hacer esto sería usando template_include.

template_include

Este hook se ejecuta justo antes de que WordPress incluya el archivo del template.

Con el ejemplo de antes, la manera correcta sería:

1
2
3
4
5
6
7
8
9
10
11
12
add_filter( 'template_include', 'switch_template' );
 
function switch_template( $template ) {
  if ( is_page('test') ) {
    $template_test = locate_template( array( 'test-file.php' ) );
    if ( $template_test != '' ) {
	   return $template_test ;
	}
  } else {
    return $template;
  }
}

¿ Entonces cuándo podríamos usar template_redirect ?
Un buen ejemplo és el que esta en el codex de wordpress.org, cuando llegamos a una determinada página y queremos que el usuario este identificado, si no esta identificado se le redirige a la pagina de registro.
El siguiente código es el que se encuentra en ese mismo ejemplo:

function my_page_template_redirect()
{
    if( is_page( 'goodies' ) && ! is_user_logged_in() )
    {
        wp_redirect( home_url( '/signup/' ) );
        exit();
    }
}
add_action( 'template_redirect', 'my_page_template_redirect' );

Conclusión

Simplemente hay que tener en cuenta que tal y como indican sus respectivos nombres: