wp_redirect() : La fonction de la semaine n°19

wp_redirect() : La fonction de la semaine n°19

4 ans après la fonction de la semaine 18, voici la 19.

Vous allez me dire « c’est bon, on la connait », ou pas ? Savez-vous qu’elle va changer en WordPress 5.0 ?

Voilà, j’ai votre attention, c’est parti.

Un peu d’intro

wp_redirect() et wp_safe_redirect() sont 2 fonctions natives de WordPress présentes dans les fonctions pluggables, ce grand regret des devs de l’époque puisque si une extension défini en premier une de ces fonctions, on peut y faire tout et n’importe quoi (ok, idem avec les hooks ?), mais surtout UNE seule extension peut le faire, la première activée, contrairement aux hooks où tout le monde peut ajouter le sien et jouer avec les priorités.

Mais je m’égare déjà dès le premier paragraphe, recentrons nous. wp_redirect() et wp_safe_redirect() sont 2 fonctions natives de WordPress depuis la 1.5.1 de février 2005. 

Elles servent à rediriger l’utilisateur (le navigateur en fait) sur une autre page ou ressource. La différence entre l’une et l’autre est le « safe mode« , c’est à dire que par défaut seul des redirections vers votre site (local donc) seront autorisées, libre à vous d’utiliser le filtre allowed_redirect_hostspour en rajouter.

Un peu de code

Voici la déclaration avant la 5.0 :

function wp_redirect( $location, $status = 302 )
function wp_safe_redirect( $location, $status = 302 )

2 paramètres donc, le premier, $location, obligatoire qui sera l’URL sur laquelle il faut rediriger et le second un $status, il s’agit du code HTTP renvoyé par la requête. Par défaut 302, cela signifie qu’il s’agit d’une redirection temporaire, contrairement à 301 qui est une redirection permanente. Retrouvez toute la liste des codes HTTP sur Wikipedia.

Comme indiqué précédemment, pour le mode safe, l’URL devra passer par une validation, si elle ne passe pas, le navigateur va rediriger par défaut sur la page de l’administration si possible, sinon page blanche.

Un peu de sécurité

Niveau sécurité, il faut savoir qu’il est possible de faire une requête HTTP en demandant au navigateur d’ignorer l’entête de redirection. Car finalement WP n’a rien inventé évidemment, il utilise PHP avec la fonction header() avec le paramètre Location:.

Afin d’éviter ceci, il est ultra recommandé d’ajouter un die(); ou exit; après une redirection, si jamais elle est ignorée, on coupe le script au lieu de continuer !

Un peu de nouveauté

Ha vous êtes encore là, vous avez lu ou vous avez triché et scrollé jusqu’ici ? Bon allez, peu importe, je vous pardonne.

Voici les nouvelles déclarations de ces fonctions :

function wp_redirect( $location, $status = 302, $x_redirect_by = 'WordPress' )
function wp_safe_redirect( $location, $status = 302, $x_redirect_by = 'WordPress' )

Tadaaa ! Le nouveau paramètre $x_redirect_by qui vaut donc par défaut 'WordPress'. Et là vous me direz « Oui, et alors ?« . Alors voici son histoire :

On le retrouve dans le core https://github.com/WordPress/WordPress/blob/master/wp-includes/pluggable.php#L1205 et sur wpseek.

Mais ça sort de où ce nom ? Et cette idée ?

Un peu d’histoire

En l’an 2015, M. Omar Reiss actuellement CTO chez @Yoast a proposé une solution afin d’être capable de reconnaitre l’origine d’une redirection, simplement en ajoutant un header qui identifierait leur extension, ça dans le but de simplifier le debug et le développement.

La solution est simple et rapide à mettre en place (source) :

header( 'X-Redirect-By: WordPress SEO by Yoast' );

Donc cette idée a fait son chemin et s’est retrouvée direct dans le core du plugin SEO :

https://github.com/Yoast/wordpress-seo/pull/9887 ! 29 mai 2018, oui bon, « direct dans le core » quoi.

L’année précédente le 27 octobre 2017 ils avaient publié sur leur blog une proposition d’entête standardisée pour ça justement, expliquant l’intérêt.

Puis cela a cheminé jusque dans le code de WordPress :

Ticket#42313 ouvert le 23 octobre 2017, fermé le 4 février 2018, 6 mois. Les vrais savent que c’est un record, mais bon, c’est Yoast, passe-droit tout ça.

Évidemment et finalement, le code sera supprimé du plugin, décision prise le 11 juin 2018 puisque ça sera inclus dans WordPress 5.0 en septembre.

Un peu de démonstration

Petite démo d’un lien qui est redirigé grâce à ce plugin (vous pouvez cliquer) :

http://okolicepalnika.pl/porady/wybrac-dobra-patelnie/attachment/org8bffc96cf5b33ea6ab072d0ede7f72f9/

Vous arriverez alors sur :

http://okolicepalnika.pl/wp-content/uploads/2018/01/org8bffc96cf5b33ea6ab072d0ede7f72f9.jpg

Comment je sais que c’est redirigé avec Yoast ? Ou plutôt, comment vérifier que ce site utilise Yoast même sans footprint ? hehe, un petit coup de sniffer d’entête :

« X-Redirect-By: Yoast SEO » le nouveau mouchard !

Un peu de conseil

Si vous développez aussi des extensions ou thèmes et que vous avez parfois besoin de faire des redirections, pensez à ajouter ce troisième paramètre. Cela facilitera tout travail de debug de la part de tout le monde.

Pas besoin d’avoir le site en WordPress 5.0 pour que ça soit compatible, au pire le paramètre ne sert à rien, ajouter des paramètres inutiles ne provoque aucune erreur en PHP (l’inverse oui !).

A vous de jouer !

Lire la suite

Vous aimez ? Partagez !


Réagir à cet article

120 caractères maximum