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

16

Je veux créer 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 de plugins WordPress professionnel, mais je ne sais pas quel crochet 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?

jnthnclrk
la source
Voulez-vous réellement modifier l'URL finale ou simplement les variables utilisées dans WP_Query?
scribu
Le code que vous avez publié redirigerait essentiellement chaque page, c'est ce que vous voulez? Dans quelles conditions cette redirection doit-elle se produire? NOTE: J'ai de toute façon + 1 kaiser, template_redirectserait également ma suggestion.
t31os
scribu, je veux changer l'url finale et la chaîne de requête.
jnthnclrk
t31os, j'ai simplifié mon code pour la question. La vraie chose contient plus de conditions.
jnthnclrk
Quel a été le résultat? Marquez une solution pls.
kaiser

Réponses:

13

Comme kaiser, le template_redirectcrochet répond en effet est approprié pour les redirections.

Vous devez également utiliser la wp_redirect()fonction, plutôt que de définir l'en-tête.

Rarst
la source
Merci pour la suggestion, cela ne me dérangerait pas de savoir pourquoi wp_redirect est préférable, ici: wordpress.stackexchange.com/questions/12944/…
jnthnclrk
17

Je dirais template_redirect. Mais jetez un oeil à la référence d'action .

Exemple

N'oubliez pas de exit()rediriger.

/**
 * 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' );
kaiser
la source
8

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

Ça marche bien pour moi. Aucune suggestion? Cordialement!

Alex
la source