¿Qué gancho se debe usar para agregar una acción que contenga una redirección?

16

Quiero construir un complemento que tome ciertos parámetros de URL de la cadena de consulta para crear una nueva cadena de consulta para la misma página. Sigo el excelente libro Professional WordPress Plugin Development, pero no estoy seguro de qué gancho 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é ganchos son adecuados para redireccionamientos de encabezado?

jnthnclrk
fuente
¿Realmente desea cambiar la URL final o solo las variables utilizadas en WP_Query?
scribu
El código que ha publicado básicamente redirigirá cada página, ¿es eso lo que desea? ¿Bajo qué condiciones debería ocurrir esta redirección? NOTA: He hecho +1 en Kaiser de todos modos, template_redirecttambién sería mi sugerencia.
t31os
scribu, quiero cambiar la url final y la cadena de consulta.
jnthnclrk
t31os, simplifiqué mi código para la pregunta. Lo real contiene más condiciones.
jnthnclrk
¿Cuál fue el resultado? Marcar una solución por favor.
kaiser

Respuestas:

13

Al igual que Kaiser respondió, el template_redirectgancho es apropiado para redireccionamientos.

También debe usar la wp_redirect()función, en lugar de configurar el encabezado.

Rarst
fuente
Gracias por la sugerencia, no me importaría saber por qué es preferible wp_redirect, aquí: wordpress.stackexchange.com/questions/12944/…
jnthnclrk
17

Yo diría template_redirect. Pero eche un vistazo a la Referencia de acción .

Ejemplo

No te olvides de exit()redirigir.

/**
 * This example redirects everything to the index.php page
 * You can do the same for the dashboard with admin_url( '/' );
 * Or simply base the redirect on conditionals like 
 * is_*() functions, current_user_can( 'capability' ), globals, get_current_screen()...
 * 
 * @return void
 */
function wpse12535_redirect_sample() {

    exit( wp_redirect( home_url( '/' ) ) );

}

add_action( 'template_redirect', 'wpse12535_redirect_sample' );
emperador
fuente
8

Pero diría que este ejemplo de Kaiser no puede funcionar, porque después de una redirección, este gancho template_redirect funciona una y otra vez, ¡tendrás un reenvío sin fin !

Mejor es 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 para mi bien. ¿Alguna sugerencia? ¡Saludos!

Alex
fuente