Essayez sans attendre l'hébergement proposé par WordPress
-15% sur le premier mois avec le code 2025PRESS15AFF

Essayer maintenant

WordPress REST API v3 : Anticiper les changements et migrer son code

Bon, je vais être direct avec vous : l’API REST de WordPress se prépare à un changement majeur avec sa version 3, et cette fois-ci, il ne s’agira pas d’une simple mise à jour cosmétique. Entre les nouveaux endpoints, l’authentification repensée et les breaking changes qui s’annoncent, on va devoir revoir notre façon de travailler avec l’API. Heureusement, on peut déjà anticiper ces changements et préparer nos projets pour éviter les mauvaises surprises le jour J.

Nouveautés de l’API REST v3 : ce qui va changer

Bon, je dois vous avouer qu’en suivant les discussions sur GitHub concernant l’API REST v3, j’ai été plutôt impressionné par les améliorations prévues. Cette nouvelle version apporte des changements significatifs qui vont vraiment simplifier notre quotidien de développeur WordPress.

Améliorations des performances et de la sécurité

La grande nouveauté côté performance, c’est l’arrivée du cache natif au niveau de l’API. Finies les requêtes répétitives qui ralentissent nos applications ! WordPress v3 intègre un système de cache intelligent qui détecte automatiquement les requêtes identiques.

Par exemple, si vous faites plusieurs appels pour récupérer les mêmes posts :

// Première requête : exécutée normalement
$posts = wp_remote_get('/wp-json/wp/v3/posts?per_page=10');

// Requête identique : servie depuis le cache
$posts_cached = wp_remote_get('/wp-json/wp/v3/posts?per_page=10');

Côté sécurité, l’équipe WordPress a également renforcé la validation des données entrantes. Chaque endpoint bénéficie désormais d’une sanitisation plus stricte, et les erreurs sont mieux gérées (plus de 500 Internal Server Error pour des erreurs de validation simple).

Nouveaux endpoints et fonctionnalités

On va enfin avoir de nouveaux endpoints dédiés ! L’endpoint /media a été complètement revu pour gérer les uploads de fichiers de manière plus intuitive. Plus besoin de jongler avec les en-têtes complexes :

// Upload d'un fichier avec la v3
const formData = new FormData();
formData.append('file', fileInput.files[0]);

fetch('/wp-json/wp/v3/media/upload', {
  method: 'POST',
  body: formData,
  headers: {
    'Authorization': 'Bearer ' + token
  }
});

Les endpoints utilisateurs ont aussi eu droit à leur lifting : on peut maintenant récupérer des informations plus détaillées sans compromettre la sécurité. L’endpoint /users/me permet par exemple d’accéder aux préférences utilisateur et aux métadonnées personnalisées.

Changements dans l’authentification

Alors là, c’est probablement le changement le plus important ! WordPress intègre enfin le support JWT (JSON Web Tokens) de manière native. Plus besoin d’installer le plugin JWT Authentication for WP REST API.

Voici comment ça fonctionne maintenant :

// Génération d'un token JWT
$response = wp_remote_post('/wp-json/wp/v3/auth/token', [
  'body' => [
    'username' => 'votre-username',
    'password' => 'votre-password'
  ]
]);

$token = json_decode(wp_remote_retrieve_body($response))->token;

Et cerise sur le gâteau : l’intégration OAuth 2.0 ! Cette fonctionnalité était très attendue par la communauté (comme on peut le voir dans la pull request #52847). Cela permet enfin de créer des applications tierces sécurisées sans compromettre les identifiants utilisateur.

Attention cependant : ces changements d’authentification nécessiteront une migration de vos applications existantes. Mais ne vous inquiétez pas, la v2 restera supportée pendant au moins deux versions majeures de WordPress.

Comparaison pratique : code v2 vs v3

Bon, passons aux choses sérieuses ! Après avoir testé la v3 en bêta pendant plusieurs mois, je peux vous dire que certains changements vont vous faciliter la vie… mais d’autres vont demander quelques ajustements. Voici les principales différences que vous devrez connaître pour migrer votre code.

Récupération de posts : nouvelle structure de réponse

Avec l’API v2, on avait l’habitude de cette syntaxe :

// API v2
fetch('/wp-json/wp/v2/posts')
  .then(response => response.json())
  .then(posts => {
    console.log(posts[0].title.rendered);
  });

La v3 apporte une structure de réponse enrichie (et c’est tant mieux !) :

// API v3
fetch('/wp-json/wp/v3/posts')
  .then(response => response.json())
  .then(data => {
    console.log(data.posts[0].title); // Plus besoin de .rendered
    console.log(data.meta.total_pages); // Infos de pagination intégrées
  });

Attention : le gros piège ici, c’est que les données ne sont plus directement dans la réponse racine mais dans data.posts. J’ai passé une bonne heure à debugger ça la première fois !

Création d’utilisateurs : authentification simplifiée

En v2, créer un utilisateur depuis le frontend était… disons-le franchement, un parcours du combattant :

// API v2 - côté serveur obligatoire
wp_remote_post('https://monsite.com/wp-json/wp/v2/users', [
  'headers' => [
    'Authorization' => 'Bearer ' . $token
  ],
  'body' => json_encode([
    'username' => 'nouveauuser',
    'email' => 'user@example.com'
  ])
]);

Avec la v3 et l’authentification JWT native, c’est nettement plus propre :

// API v3 - possible depuis le frontend
fetch('/wp-json/wp/v3/users', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-WP-JWT': localStorage.getItem('jwt_token')
  },
  body: JSON.stringify({
    username: 'nouveauuser',
    email: 'user@example.com',
    password: 'motdepasse123'
  })
});

Le JWT est géré automatiquement par WordPress. Plus besoin de plugins tiers pour ça !

Upload de médias : enfin du multipart natif

L’upload de fichiers en v2… bon, disons que ça fonctionnait, mais c’était pas terrible :

// API v2
const formData = new FormData();
formData.append('file', fileInput.files[0]);
formData.append('title', 'Mon image');

fetch('/wp-json/wp/v2/media', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer ' + token
  },
  body: formData
});

La v3 apporte un endpoint dédié avec gestion des chunks pour les gros fichiers :

// API v3 - upload avec chunks automatiques
fetch('/wp-json/wp/v3/media/upload', {
  method: 'POST',
  headers: {
    'X-WP-JWT': jwt_token,
    'X-WP-Upload-Chunk-Size': '1048576' // 1MB chunks
  },
  body: formData
}).then(response => response.json())
  .then(data => {
    console.log(data.media_id); // ID direct du média
    console.log(data.sizes); // Toutes les tailles générées
  });

Les breaking changes à surveiller

Plusieurs points vont casser votre code existant (je vous préviens, j’ai eu quelques sueurs froides) :

  • Les réponses sont maintenant wrappées dans un objet { data: ..., meta: ... }
  • Les champs rendered disparaissent pour la plupart des contenus
  • L’authentification par cookies ne fonctionne plus par défaut (sauf activation explicite)
  • Les codes d’erreur changent : 400 devient 422 pour les erreurs de validation

Mon conseil : testez d’abord avec un flag de compatibilité. WordPress 6.5+ propose un mode de transition qui émule l’ancienne API :

// Dans functions.php - mode transition temporaire
add_filter('rest_api_v3_compatibility_mode', '__return_true');

Cela dit, ne gardez pas ça indéfiniment ! L’idée c’est de migrer progressivement, pas de rester bloqué sur l’ancien système.

Stratégies de migration progressive

Migrer vers WordPress REST API v3, c’est un peu comme déménager : on ne fait pas tout en une fois au risque de casser la vaisselle ! La clé, c’est d’y aller progressivement et méthodiquement. Voici ma méthode éprouvée pour réussir cette transition.

Audit de votre code existant

Avant de toucher quoi que ce soit, il faut savoir où on met les pieds. J’utilise toujours quelques outils pour faire le point sur l’existant :

  • WP-CLI avec la commande wp search-replace pour identifier tous les appels REST API
  • Query Monitor pour traquer les requêtes API en temps réel
  • grep (oui, l’ancien de la ligne de commande !) pour chercher les patterns dans le code

Le truc, c’est de créer un fichier de recensement. Je note systématiquement :

  • Quels endpoints sont utilisés
  • Dans quels fichiers (plugins, thèmes, scripts custom)
  • La fréquence d’utilisation
  • Les dépendances critiques

Attention : n’oubliez pas de vérifier le JavaScript côté frontend ! Souvent, on a des appels AJAX qui passent par l’API et qu’on oublie.

Migration par étapes

Bon, maintenant qu’on sait ce qu’on a, on peut planifier. Ma stratégie ? Toujours commencer par les éléments les moins critiques.

Étape 1 : Les fonctionnalités secondaires Je commence par migrer les features qui ne cassent pas le site si elles plantent. Par exemple, un widget qui affiche les derniers posts ou une fonctionnalité de recherche.

Étape 2 : Les plugins tiers Ensuite, je m’attaque aux plugins externes. Ici, c’est souvent une question de mise à jour ou de remplacement si le développeur n’a pas suivi.

Étape 3 : Le code critique Enfin, les fonctionnalités business-critical. Authentification, paiements, gestion utilisateurs… Là, on teste deux fois plutôt qu’une !

Pour chaque étape, je maintiens toujours un environnement de staging identique à la prod. C’est non négociable.

Tests et validation

Les tests, c’est là où on sépare les amateurs des pros. J’ai développé quelques scripts qui m’ont sauvé la mise plus d’une fois :

#!/bin/bash
# Test basique des endpoints critiques
curl -X GET "https://monsite.com/wp-json/wp/v3/posts" -H "Authorization: Bearer $TOKEN"

Mais le plus important, c’est d’automatiser. J’utilise PHPUnit pour les tests unitaires et Playwright pour les tests end-to-end. Et surtout, je teste sur différentes versions de WordPress (n-1, n, n+1 si disponible).

Le piège classique ? Oublier de tester les permissions. L’API v3 a changé certains comportements d’autorisation, donc vérifiez bien que vos utilisateurs peuvent toujours faire ce qu’ils doivent faire.

Gestion de la compatibilité descendante

Alors là, c’est le point crucial ! On ne peut pas forcer tous nos utilisateurs à migrer du jour au lendemain. Ma solution ? Un système de « fallback intelligent ».

Je créé une couche d’abstraction qui détecte automatiquement quelle version de l’API est disponible :

function get_api_version() {
    if (function_exists('rest_get_server') && version_compare(get_bloginfo('version'), '6.0', '>=')) {
        return 'v3';
    }
    return 'v2';
}

Et dans mes plugins, j’utilise des factory patterns pour instancier la bonne classe selon la version détectée. Ça demande un peu plus de code au début, mais ça évite les migraines plus tard !

Le conseil bonus ? Documentez tout ! Tenez un changelog détaillé de vos modifications. Vos collègues (et votre futur vous) vous remercieront.