¿Qué hook debe usarse para agregar una acción que contiene una redirección?
Quiero crear un plugin que tome ciertos parámetros url de la cadena de consulta para construir una nueva cadena de consulta para la misma página. Estoy siguiendo el excelente libro Professional WordPress Plugin Development, pero no estoy seguro de qué hook usar para esta acción. Aquí está mi función de acción:
add_action( 'init', 'tccl_redirect' );
function tccl_redirect() {
header ( "Location: http://www.mysite.com/$mypage?$newparam=$newvalue" );
?>
¿Qué hooks son adecuados para las redirecciones mediante header?

Yo diría template_redirect
. Pero echa un vistazo a la Referencia de Acciones.
Ejemplo
No olvides hacer exit()
al redireccionar.
/**
* Este ejemplo redirige todo a la página index.php
* Puedes hacer lo mismo para el escritorio con admin_url( '/' );
* O simplemente basar la redirección en condicionales como
* funciones is_*(), current_user_can( 'capability' ), globales, get_current_screen()...
*
* @return void
*/
function wpse12535_redirect_sample() {
exit( wp_redirect( home_url( '/' ) ) );
}
add_action( 'template_redirect', 'wpse12535_redirect_sample' );

Como respondió kaiser, el hook template_redirect
es efectivamente apropiado para redirecciones.
También deberías usar la función wp_redirect()
, en lugar de configurar manualmente los encabezados.

Gracias por la sugerencia, no me importaría saber por qué wp_redirect es preferible, aquí: http://wordpress.stackexchange.com/questions/12944/why-is-wp-redirect-preferable-to-a-standard-php-header-redirect

Pero diría que este ejemplo de kaiser no puede funcionar, porque después de un redireccionamiento este hook template_redirect se ejecuta una y otra vez, ¡tendrás un redireccionamiento infinito!
Es mejor verificar si ya estás en la página de inicio, así:
function wpse12535_redirect_sample() {
$current_url = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$site_url = get_bloginfo('siteurl') . "/";
if($current_url != $site_url)
exit( wp_redirect( home_url( '/' ) ));
}
add_action( 'template_redirect', 'wpse12535_redirect_sample');
Funciona bien para mí. ¿Alguna sugerencia? ¡Saludos!
