# Redirections propres sous WordPress sans multiplier les plugins

> Redirections 301, gestion des URL cassées, migration en masse : les méthodes fiables pour rediriger proprement sans installer de plugin dédié.

- Auteur : Clément Hadrot
- Publié le : 2020-07-09
- Mis à jour le : 2020-07-09
- Catégorie : Tips
- URL : https://wpmoderne.dev.wordpress-developpement.fr/tips/redirections-propres-wordpress-sans-plugin/

## L’essentiel

- template_redirect est le hook central pour rediriger dynamiquement
- Une redirection 301 doit toujours utiliser le bon code HTTP
- Les wildcards se gèrent bien dans .htaccess pour Apache

Rediriger une URL vers une autre est l'un des besoins les plus fréquents sur un site WordPress : une page renommée, une structure d'URL modifiée après une refonte, une ancienne campagne marketing qu'on ferme. Beaucoup de projets installent un plugin dédié pour ça, souvent avec raison quand il faut une interface pour un client. Mais dans bien des cas, quelques lignes de code suffisent, et évitent une dépendance de plus.

Cet article couvre les trois façons de rediriger proprement sous WordPress : via le hook `template_redirect`, via le fichier `.htaccess` pour Apache, et via WP-CLI pour l'automatisation en masse.

## Rediriger dynamiquement avec template_redirect

Le hook `template_redirect` se déclenche juste avant que WordPress ne détermine quel template afficher. C'est l'endroit idéal pour intercepter une requête et rediriger avant que la page ne soit générée.

```
add_action( 'template_redirect', function() {
    if ( is_404() && '/ancienne-page/' === $_SERVER['REQUEST_URI'] ) {
        wp_safe_redirect( home_url( '/nouvelle-page/' ), 301 );
        exit;
    }
} );
```

Deux points méritent l'attention ici. D'abord, `wp_safe_redirect()` plutôt que `wp_redirect()` : la version « safe » vérifie que la destination appartient à une liste d'hôtes autorisés, ce qui évite qu'une redirection ouverte ne serve de vecteur de phishing. Ensuite, l'appel à `exit` juste après est indispensable : sans lui, l'exécution du script continue et WordPress peut renvoyer un contenu après avoir déjà envoyé l'en-tête de redirection.

## Rediriger un type de contenu entier

Un cas fréquent après une refonte : un type de contenu personnalisé disparaît et ses URL doivent pointer vers une page unique. Une correspondance par expression régulière sur `REQUEST_URI` fait l'affaire :

```
add_action( 'template_redirect', function() {
    if ( preg_match( '#^/ancien-produit/([^/]+)/?$#', $_SERVER['REQUEST_URI'] ) ) {
        wp_safe_redirect( home_url( '/catalogue/' ), 301 );
        exit;
    }
} );
```

> L'essentiel à retenir : template_redirect est le hook central pour rediriger dynamiquement ; Une redirection 301 doit toujours utiliser le bon code HTTP ; Les wildcards se gèrent bien dans .htaccess pour Apache

## Redirections statiques dans .htaccess

Pour des redirections simples, en nombre limité et qui ne changent jamais, passer par `.htaccess` évite de charger WordPress inutilement, avec un gain de performance réel sur des sites à fort trafic. Ces règles doivent être placées avant le bloc `# BEGIN WordPress` généré par le CMS :

```
Redirect 301 /ancienne-page/ /nouvelle-page/
RedirectMatch 301 ^/blog/2019/(.*)$ /actualites/$1
```

L'inconvénient : ces règles sont statiques et ne peuvent pas consulter la base de données WordPress. Elles conviennent bien pour des redirections d'URL fixes issues d'une refonte, mais pas pour une logique dépendant du contenu.

## Rediriger en masse avec WP-CLI

Quand une migration touche des centaines d'URL, générer les redirections à la main n'est pas réaliste. Un script WP-CLI, couplé à un fichier CSV listant les anciennes et nouvelles URL, permet d'automatiser la mise à jour d'une table de correspondance :

```
wp eval-file redirections-migration.php --path=/var/www/monsite
```

Le fichier `redirections-migration.php` peut alors lire le CSV et enregistrer chaque correspondance dans une option ou une table dédiée, consultée ensuite par le hook `template_redirect` vu plus haut.

## Les erreurs courantes à éviter

- Utiliser une redirection 302 (temporaire) là où une 301 (permanente) s'impose, ce qui dilue le référencement de l'ancienne page vers la nouvelle
- Créer une chaîne de redirections (A vers B, B vers C) au lieu de rediriger directement A vers C
- Oublier `exit` après `wp_redirect()`, ce qui peut laisser fuiter du contenu après l'en-tête HTTP
- Rediriger vers une URL non fiable sans passer par `wp_safe_redirect()`

## Vérifier une redirection correctement

Pour vérifier qu'une redirection renvoie bien le code attendu, la commande `curl` avec l'option `-I` affiche uniquement les en-têtes de réponse, sans suivre la redirection :

```
curl -I https://example.com/ancienne-page/
```

La ligne `HTTP/1.1 301 Moved Permanently` doit apparaître, suivie d'un en-tête `Location` pointant vers la bonne URL de destination.

> Une redirection 302 qui traîne six mois sur une page migrée n'a plus rien de temporaire : c'est un oubli qui coûte du référencement chaque jour qui passe.

## En résumé

Pas besoin d'un plugin pour gérer une poignée de redirections stables : `template_redirect` couvre les cas dynamiques, `.htaccess` les cas statiques et rapides, WP-CLI l'automatisation en masse lors d'une migration. Un plugin dédié reste pertinent dès qu'un client non technique doit pouvoir ajouter des redirections lui-même depuis l'administration ; en dehors de ce cas, ces trois méthodes suffisent largement et restent bien plus simples à auditer dans le code.
