WordPress propulse une part importante du web, mais pour les blogs axés sur le contenu et les sites de documentation, la surcharge d’une pile PHP/MySQL complète est de plus en plus difficile à justifier. Les générateurs de sites statiques comme Astro offrent des performances ultra-rapides, éliminent pratiquement les vulnérabilités de sécurité et ne coûtent presque rien à héberger.
Ce guide vous accompagne à travers le processus complet de migration d’un blog WordPress vers Astro — de l’exportation de votre contenu et sa conversion en Markdown, à la préservation de votre référencement SEO et au déploiement sur Cloudflare Pages. Ce n’est pas de la théorie : nous avons migré KnowledgeXchange.xyz (507 articles, 1 427 pages générées en 11 secondes) en utilisant exactement ce processus.
Pourquoi migrer de WordPress vers Astro ?
Performance
Une page WordPress typique nécessite plusieurs cycles d’exécution PHP, des requêtes de base de données et le traitement des plugins avant de livrer le HTML au navigateur. Même avec une mise en cache agressive, le Time to First Byte (TTFB) descend rarement en dessous de 200-400 ms.
Astro génère du HTML statique au moment de la compilation. Les pages se chargent en moins de 50 ms depuis un noeud CDN en périphérie. Il n’y a pas de traitement serveur, pas de base de données et pas d’exécution PHP au moment de la requête.
Sécurité
WordPress est le CMS le plus ciblé sur Internet. Chaque plugin, thème et mise à jour du noyau est un vecteur d’attaque potentiel. Les injections SQL, le cross-site scripting, les attaques par force brute et les vulnérabilités de téléchargement de fichiers exigent une vigilance constante.
Les fichiers HTML statiques ont une surface d’attaque pratiquement nulle. Il n’y a pas de base de données à injecter, pas de panneau d’administration à forcer et pas de PHP à exploiter.
Coût
Un site WordPress nécessite généralement un VPS (5-50 $/mois), un hébergement géré (25-200 $/mois) ou un hébergement mutualisé (3-15 $/mois). Ajoutez les plugins premium, les outils de sécurité et les services CDN.
Un site Astro sur Cloudflare Pages coûte 0 $/mois pour la plupart des blogs. Même les sites à fort trafic restent dans les limites du forfait gratuit car servir des fichiers statiques est incroyablement peu coûteux.
Expérience développeur
Astro utilise des outils modernes : des composants écrits dans des fichiers .astro (similaires au HTML avec JavaScript), du Markdown/MDX pour le contenu, la prise en charge de TypeScript et un système de compilation ultra-rapide basé sur Vite. Si vous avez déjà lutté avec la hiérarchie de templates de WordPress, les hooks functions.php ou les conflits de plugins, vous apprécierez la simplicité.
Comprendre Astro
Astro est un générateur de sites statiques moderne conçu pour les sites web axés sur le contenu. Ses principales fonctionnalités incluent :
- Collections de contenu — Contenu Markdown/MDX typé avec validation de schéma
- Architecture en îlots — Aucun JavaScript envoyé par défaut, hydratation des composants interactifs uniquement lorsque nécessaire
- Agnostique en termes de framework — Utilisez des composants React, Vue, Svelte ou HTML simple
- Optimisations intégrées — Optimisation automatique des images, scoping CSS et minification HTML
- Compilations rapides — Système de compilation alimenté par Vite qui gère efficacement des milliers de pages
Planifier la migration
Avant de toucher au moindre code, planifiez votre stratégie de migration :
Inventaire du contenu
- Comptez vos articles, pages et types de publications personnalisés — Connaissez l’ampleur du projet
- Cataloguez vos médias — Images, PDF, vidéos stockés dans
wp-content/uploads - Documentez votre structure d’URL —
/2024/01/mon-article/ou/categorie/mon-article/ou/mon-article/ - Listez les pages SEO critiques — Les pages les plus performantes qui doivent maintenir leur classement
- Identifiez les fonctionnalités dynamiques — Formulaires de contact, commentaires, recherche, e-commerce
Correspondance des fonctionnalités
| Fonctionnalité WordPress | Équivalent Astro |
|---|---|
| Articles/Pages | Fichiers Markdown dans les collections de contenu |
| Catégories/Tags | Métadonnées frontmatter + pages générées |
| Images à la une | Composant Image d’Astro |
| Commentaires | Service externe (Giscus, Disqus) ou suppression |
| Formulaires de contact | Cloudflare Workers, Formspree ou Netlify Forms |
| Recherche | Pagefind, Fuse.js ou Algolia |
| Flux RSS | Intégration @astrojs/rss |
| Sitemap | Intégration @astrojs/sitemap |
| Métadonnées SEO | Composants <head> personnalisés |
Étape 1 : Exporter le contenu WordPress
Utilisation de l’export XML WordPress
Depuis votre tableau de bord d’administration WordPress :
- Naviguez vers Outils > Exporter
- Sélectionnez Tout le contenu
- Cliquez sur Télécharger le fichier d’exportation
Cela génère un fichier XML WXR (WordPress eXtended RSS) contenant tous les articles, pages, commentaires, catégories, tags et références médias.
Utilisation de l’API REST (alternative)
Pour plus de contrôle, vous pouvez récupérer le contenu via l’API REST de WordPress :
# Récupérer tous les articles (paginés, 100 par page)
curl -s "https://knowledgexchange.xyz/wp-json/wp/v2/posts?per_page=100&page=1" > posts-page1.json
curl -s "https://knowledgexchange.xyz/wp-json/wp/v2/posts?per_page=100&page=2" > posts-page2.json
# Récupérer toutes les catégories
curl -s "https://knowledgexchange.xyz/wp-json/wp/v2/categories?per_page=100" > categories.json
# Récupérer tous les tags
curl -s "https://knowledgexchange.xyz/wp-json/wp/v2/tags?per_page=100" > tags.json
# Récupérer la bibliothèque de médias
curl -s "https://knowledgexchange.xyz/wp-json/wp/v2/media?per_page=100&page=1" > media-page1.json
Étape 2 : Convertir le contenu en Markdown
Script de migration Node.js
Voici un script Node.js pratique qui convertit le XML WordPress en fichiers Markdown avec un frontmatter compatible Astro :
// migrate.mjs
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';
import { XMLParser } from 'fast-xml-parser';
import TurndownService from 'turndown';
import slugify from 'slugify';
const turndown = new TurndownService({
headingStyle: 'atx',
codeBlockStyle: 'fenced',
bulletListMarker: '-',
});
turndown.addRule('preCode', {
filter: (node) => node.nodeName === 'PRE',
replacement: (content, node) => {
const code = node.querySelector('code');
const lang = code?.className?.replace('language-', '') || '';
const text = code ? code.textContent : node.textContent;
return `\n\`\`\`${lang}\n${text.trim()}\n\`\`\`\n`;
},
});
const xml = readFileSync('wordpress-export.xml', 'utf-8');
const parser = new XMLParser({ ignoreAttributes: false });
const data = parser.parse(xml);
const items = data.rss.channel.item;
const posts = Array.isArray(items) ? items : [items];
const outputDir = './src/content/posts';
if (!existsSync(outputDir)) mkdirSync(outputDir, { recursive: true });
let count = 0;
for (const post of posts) {
const status = post['wp:status'];
const postType = post['wp:post_type'];
if (status !== 'publish' || postType !== 'post') continue;
const title = post.title?.toString() || 'Untitled';
const date = post['wp:post_date']?.split(' ')[0] || '2024-01-01';
const content = post['content:encoded'] || '';
const slug = post['wp:post_name'] || slugify(title, { lower: true, strict: true });
const cats = [];
const tags = [];
const taxonomy = Array.isArray(post.category) ? post.category : [post.category].filter(Boolean);
for (const term of taxonomy) {
if (term?.['@_domain'] === 'category') cats.push(term['#text'] || term);
if (term?.['@_domain'] === 'post_tag') tags.push(term['#text'] || term);
}
const markdown = turndown.turndown(content);
const frontmatter = [
'---',
`title: "${title.replace(/"/g, '\\"')}"`,
`date: "${date}"`,
`lastModified: "${date}"`,
`categories: [${cats.map(c => `"${c}"`).join(', ')}]`,
`tags: [${tags.map(t => `"${t}"`).join(', ')}]`,
`author: "JC"`,
`slug: "${slug}"`,
`description: "${title.replace(/"/g, '\\"')}"`,
`lang: "en"`,
'---',
].join('\n');
const fileContent = `${frontmatter}\n\n${markdown}\n`;
writeFileSync(`${outputDir}/${slug}.md`, fileContent, 'utf-8');
count++;
}
console.log(`Migrated ${count} posts to ${outputDir}`);
Installez les dépendances et exécutez :
npm install fast-xml-parser turndown slugify
node migrate.mjs
Étape 3 : Gérer les images
WordPress stocke les images dans des répertoires wp-content/uploads/AAAA/MM/. Vous avez plusieurs options :
Option A : Télécharger et stocker localement
wget --mirror --no-parent --reject "index.html*" \
https://knowledgexchange.xyz/wp-content/uploads/ \
-P ./public/wp-content/uploads/
Option B : Utiliser un CDN (recommandé)
Gardez les images sur un CDN externe comme Cloudflare R2, AWS S3 ou Cloudinary. Cela maintient votre dépôt léger et les temps de compilation rapides.
Étape 4 : Préserver la structure des URLs
Maintenir votre structure d’URL existante est essentiel pour le SEO. Configurez le routage Astro pour correspondre à votre format de permaliens WordPress.
Gestion des redirections pour les URLs modifiées
Si votre structure d’URL change, créez un fichier _redirects pour Cloudflare Pages :
# Rediriger les anciennes URLs WordPress vers les nouvelles URLs Astro
/2024/01/my-old-post/ /post/my-old-post/ 301
/category/linux/ /categories/linux/ 301
/tag/ubuntu/ /tags/ubuntu/ 301
# Rediriger les URLs d'administration et de flux WordPress
/wp-admin/* / 301
/wp-login.php / 301
/feed/ /rss.xml 301
Étape 5 : Configurer les collections de contenu Astro
Définissez votre schéma de contenu dans src/content.config.ts :
import { defineCollection, z } from 'astro:content';
const posts = defineCollection({
type: 'content',
schema: z.object({
title: z.string(),
date: z.string(),
lastModified: z.string().optional(),
categories: z.array(z.string()).default([]),
tags: z.array(z.string()).default([]),
author: z.string().default('JC'),
slug: z.string(),
description: z.string().optional(),
lang: z.enum(['en', 'es']).default('en'),
difficulty: z.enum(['beginner', 'intermediate', 'advanced']).optional(),
featured: z.boolean().default(false),
readingTime: z.number().optional(),
}),
});
export const collections = { posts };
Astuce : Astro valide chaque fichier Markdown par rapport à ce schéma au moment de la compilation. Si un article migré a un frontmatter manquant ou mal formé, la compilation échouera avec un message d’erreur clair indiquant le fichier et le champ exact.
Étape 6 : Préservation du SEO
Sitemap
npx astro add sitemap
Flux RSS
npm install @astrojs/rss
Étape 7 : Déployer sur Cloudflare Pages
Connecter votre dépôt
- Poussez votre projet Astro vers un dépôt Git (GitHub, GitLab)
- Connectez-vous au tableau de bord Cloudflare
- Naviguez vers Workers & Pages > Créer une application > Pages
- Connectez votre dépôt Git
- Configurez les paramètres de compilation :
- Commande de compilation :
npm run build - Répertoire de sortie :
dist - Version Node.js : 20 (définie via la variable d’environnement
NODE_VERSION=20)
- Commande de compilation :
Performance de compilation
Pour référence, notre migration KnowledgeXchange :
- 507 articles convertis en entrées de collection de contenu Markdown
- 1 427 pages au total générées (articles + pages de catégories + pages de tags + pages d’index)
- Temps de compilation : 11 secondes sur Cloudflare Pages
La migration KnowledgeXchange : une étude de cas
Lorsque nous avons migré KnowledgeXchange.xyz de WordPress vers Astro, nous avons rencontré plusieurs défis concrets :
Défi 1 : Formatage HTML ancien
De nombreux articles WordPress plus anciens contenaient du HTML brut, des shortcodes et du balisage spécifique aux plugins. Environ 15 % des articles ont nécessité un nettoyage manuel.
Leçon apprise : Prévoyez du temps pour la relecture manuelle. La conversion automatisée vous amène à 85 % du chemin ; les 15 % restants nécessitent une attention humaine.
Défi 2 : Références d’images
Nos 507 articles référençaient des centaines d’images. Nous avons choisi de conserver la même structure de répertoires dans le dossier public/ pour minimiser les changements d’URL.
Défi 3 : Contenu multilingue
KnowledgeXchange a du contenu en anglais et en espagnol. Nous avons utilisé le champ frontmatter lang pour catégoriser les articles et générer des pages d’index spécifiques à chaque langue.
Résultats
Après la migration :
- Le temps de chargement des pages est passé de 1,2 s en moyenne à moins de 100 ms
- Le score de performance Lighthouse est passé de 67 à 99
- Le coût d’hébergement est passé de 15 $/mois à 0 $/mois (forfait gratuit Cloudflare Pages)
- Les incidents de sécurité sont passés de tentatives de force brute occasionnelles à zéro
- La compilation et le déploiement prennent 30 secondes du git push au site en production
Leçons apprises et bonnes pratiques
-
Ne migrez pas tout en une seule fois. Commencez avec un sous-ensemble d’articles, vérifiez le résultat, puis traitez l’archive complète.
-
Gardez votre site WordPress en fonctionnement pendant la migration. Pointez un sous-domaine comme
old.knowledgexchange.xyzvers celui-ci comme référence. -
Testez les redirections de manière exhaustive. Utilisez des outils comme Screaming Frog ou un script pour crawler votre ancien sitemap et vérifier chaque URL.
-
Préservez l’URL de votre flux RSS ou redirigez-la. Les abonnés ne doivent pas perdre l’accès.
-
Configurez les analyses dès le premier jour sur le nouveau site pour comparer les tendances de trafic avant et après la migration.
-
Utilisez les collections de contenu pour la sécurité de type. La validation de schéma d’Astro détecte les erreurs de frontmatter au moment de la compilation.
-
Validez vos scripts de migration dans le dépôt. Vous pourriez avoir besoin de les relancer si vous découvrez des problèmes plus tard.
Résumé
Migrer de WordPress vers Astro est une entreprise importante, mais les avantages sont substantiels : des temps de chargement plus rapides, une meilleure sécurité, des coûts réduits et une expérience développeur moderne. La clé est une planification méthodique, une conversion de contenu automatisée et une préservation soigneuse du SEO.
Avec les collections de contenu, Astro vous offre une gestion Markdown typée qui passe à l’échelle pour des centaines ou des milliers d’articles. Combiné avec Cloudflare Pages pour l’hébergement, vous obtenez une infrastructure de blog de niveau production qui ne coûte rien à exploiter et gère n’importe quel volume de trafic.
Pour des sujets WordPress connexes, consultez nos guides sur le déploiement de WordPress sur Ubuntu et les permissions de fichiers WordPress sous Linux.