WORDPRESS TO ASTRO MIGRATION FLOW WordPress PHP + MySQL Themes + Plugins wp_posts table ~200ms TTFB Export XML/JSON to Markdown + frontmatter Transform URLs + Images SEO + Redirects preserve slugs Astro Static HTML/CSS Markdown + MDX Cloudflare Pages ~20ms TTFB CDN Edge Global Exporter le contenu, transformer en Markdown, deployer en site statique sur CDN edge

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

  1. Comptez vos articles, pages et types de publications personnalisés — Connaissez l’ampleur du projet
  2. Cataloguez vos médias — Images, PDF, vidéos stockés dans wp-content/uploads
  3. Documentez votre structure d’URL/2024/01/mon-article/ ou /categorie/mon-article/ ou /mon-article/
  4. Listez les pages SEO critiques — Les pages les plus performantes qui doivent maintenir leur classement
  5. Identifiez les fonctionnalités dynamiques — Formulaires de contact, commentaires, recherche, e-commerce

Correspondance des fonctionnalités

Fonctionnalité WordPressÉquivalent Astro
Articles/PagesFichiers Markdown dans les collections de contenu
Catégories/TagsMétadonnées frontmatter + pages générées
Images à la uneComposant Image d’Astro
CommentairesService externe (Giscus, Disqus) ou suppression
Formulaires de contactCloudflare Workers, Formspree ou Netlify Forms
RecherchePagefind, Fuse.js ou Algolia
Flux RSSIntégration @astrojs/rss
SitemapIntégration @astrojs/sitemap
Métadonnées SEOComposants <head> personnalisés

Étape 1 : Exporter le contenu WordPress

Utilisation de l’export XML WordPress

Depuis votre tableau de bord d’administration WordPress :

  1. Naviguez vers Outils > Exporter
  2. Sélectionnez Tout le contenu
  3. 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

  1. Poussez votre projet Astro vers un dépôt Git (GitHub, GitLab)
  2. Connectez-vous au tableau de bord Cloudflare
  3. Naviguez vers Workers & Pages > Créer une application > Pages
  4. Connectez votre dépôt Git
  5. 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)

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

  1. 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.

  2. Gardez votre site WordPress en fonctionnement pendant la migration. Pointez un sous-domaine comme old.knowledgexchange.xyz vers celui-ci comme référence.

  3. 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.

  4. Préservez l’URL de votre flux RSS ou redirigez-la. Les abonnés ne doivent pas perdre l’accès.

  5. Configurez les analyses dès le premier jour sur le nouveau site pour comparer les tendances de trafic avant et après la migration.

  6. 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.

  7. 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.