web-dev-qa-db-fra.com

Quel hook devrait être utilisé pour ajouter une action contenant une redirection?

Je veux construire un plugin qui récupère certains paramètres d'URL de la chaîne de requête pour créer une nouvelle chaîne de requête pour la même page. Je suis l'excellent livre de développement professionnel de plugins WordPress, mais je ne suis pas sûr du hook à utiliser pour cette action. Voici ma fonction d'action:

add_action( 'init', 'tccl_redirect' );
function tccl_redirect() {
    header ( "Location: http://www.mysite.com/$mypage?$newparam=$newvalue" );
?>

Quels crochets conviennent aux redirections d'en-tête?

15
jnthnclrk

Comme kaiser a répondu template_redirect, hook est en effet approprié pour les redirections.

Aussi, vous devriez utiliser wp_redirect() function, plutôt que de mettre en-tête.

12
Rarst

Je dirais template_redirect. Mais jetez un oeil à la Action Reference .

Exemple

N'oubliez pas de exit() sur la redirection.

/**
 * 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' );
16
kaiser

Mais je dirais que cet exemple de kaiser ne peut pas fonctionner, car après une redirection, ce hook template_redirect fonctionne encore et encore, vous aurez un transmission sans fin!

Mieux vaut vérifier, si vous êtes déjà sur la page d'accueil, comme ceci:

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');

Fonctionne bien pour moi. Aucune suggestion? Cordialement!

8
Alex