Aller au contenu

Migrer un blogue Blogger (Blogspot) vers WordPress sur cPanel

Ce guide vous montre comment migrer un blogue Blogger vers WordPress sur un serveur cPanel à l'aide du fichier de sauvegarde de Blogger et de l'extension Blogger Importer. Vous garderez les adresses de vos billets, rapatrierez les images hébergées chez Google et redirigerez en 301 les anciennes pages, étiquettes et liens mobiles de Blogger.

Ce guide vous accompagne pour déménager un blogue de Blogger, le service de blogue gratuit de Google, vers WordPress autohébergé sur un serveur cPanel/WHM. La plupart des propriétaires de blogues Blogger arrivent ici avec des années de billets, de commentaires et de trafic de recherche qu’ils ne veulent pas perdre. Bonne nouvelle : Blogger fournit un vrai fichier d’exportation, et WordPress a un importateur officiel qui sait le lire. Garder votre trafic dépend de ce que vous faites après l’importation. Vous reproduisez la forme des URL de Blogger, vous rapatriez les images des serveurs de Google et vous ajoutez des redirections 301 pour tout le reste. À la fin, vos anciennes adresses de billets s’ouvriront sur WordPress, et toutes les autres anciennes adresses redirigeront vers leur nouvel emplacement.

Ce que vous allez accomplir

  • Exporter chaque billet, page et commentaire de Blogger dans un seul fichier de sauvegarde, puis compter ce qu’il contient.
  • Importer ce fichier dans WordPress sur un nom d’hôte temporaire pendant que Blogger continue de servir vos lecteurs.
  • Régler les permaliens de WordPress pour que les URL des billets restent identiques à celles de Blogger.
  • Copier les images des serveurs d’images de Google dans votre propre médiathèque.
  • Rediriger les pages, les pages d’étiquettes, les fils et les liens mobiles ?m=1 de Blogger, puis déplacer le DNS sans toucher au courriel.

Prérequis

  • Un accès administrateur au tableau de bord de Blogger.
  • Un accès au DNS de votre domaine personnalisé, habituellement chez le registraire où vous l’avez acheté. Si le blogue vit seulement à une adresse blogspot.com, lisez d’abord la section « Quand ce n’est pas la bonne approche », car les redirections y fonctionnent autrement.
  • Un compte cPanel sur un serveur que vous contrôlez, ou un accès root à WHM pour en créer un.
  • Un accès SSH avec WP-CLI, l’outil en ligne de commande de WordPress. Vérifiez avec wp --info. Chaque étape WP-CLI a un équivalent plus lent dans l’admin WordPress.
  • curl et dig sur votre propre poste, pour tester les URL et le DNS.
  • Apache ou LiteSpeed sur le serveur cPanel. Les deux lisent les règles de réécriture de .htaccess avec la même syntaxe.

Comment ça fonctionne

La sauvegarde de Blogger est un fichier Atom, un format de fil XML standard, qui contient vos billets, pages, commentaires et réglages. L’extension Blogger Importer de WordPress lit ce fichier sous Outils > Importer. Elle ne lit pas les fichiers WXR, et la commande wp import de WP-CLI ne lit que le WXR. Cette importation-là se fait donc dans le navigateur.

Trois choses ne suivent pas d’elles-mêmes. Les images restent chez Google (blogger.googleusercontent.com ou de 1.bp.blogspot.com à 4.bp.blogspot.com). Votre thème et vos gadgets restent derrière. Et les formes d’URL de Blogger exigent soit un réglage de permaliens équivalent, soit une redirection.

Tableau associant chaque forme d'URL Blogger à sa destination WordPress : billets en /AAAA/MM/slug.html gardés identiques par le réglage des permaliens, pages statiques en /p/page.html redirigées vers /page/, pages d'étiquettes en /search/label/Nom redirigées vers /category/nom/, paramètre mobile ?m=1 retiré par une 301, fils en /feeds/posts/default redirigés vers /feed/, et images sur googleusercontent.com copiées dans la médiathèque

Les billets sont la partie facile. Blogger les publie à /2021/04/porch-repair.html, et WordPress peut produire exactement cette forme avec la structure de permaliens /%year%/%monthnum%/%postname%.html. Quand l’adresse est identique, aucune redirection n’est nécessaire, et les moteurs de recherche ne voient aucun changement.

Tout le reste demande une règle. Le paramètre ?m=1 mérite une attention particulière. Blogger l’ajoute aux liens mobiles, et WordPress lit m comme son propre paramètre d’archives par date. Laissés tels quels, ces liens peuvent aboutir sur une archive vide ou une page 404. Vous le retirez donc avec une redirection.

L’endroit où vit votre blogue aujourd’hui détermine ce que vous contrôlez.

Diagramme de décision : un blogue sur un domaine personnalisé déménage en pointant le DNS vers le serveur cPanel, où les redirections 301 dans .htaccess fonctionnent normalement ; un blogue seulement à une adresse blogspot.com reste sur les serveurs de Google, donc aucune redirection côté serveur n'est possible et les options sont une redirection JavaScript dans le thème Blogger ou l'acceptation d'une perte de trafic

Étapes

  1. Listez chaque URL en ligne à partir du sitemap de Blogger. Blogger publie les billets dans sitemap.xml, parfois découpé en plusieurs pages, et les pages statiques dans sitemap-pages.xml.

    { curl -s https://www.example.com/sitemap.xml; curl -s https://www.example.com/sitemap-pages.xml; } \
      | grep -o '<loc>[^<]*</loc>' | sed 's|</*loc>||g' > ~/sm1.txt
    grep 'sitemap.xml?page=' ~/sm1.txt | while read -r s; do curl -s "$s"; done \
      | grep -o '<loc>[^<]*</loc>' | sed 's|</*loc>||g' > ~/sm2.txt
    cat ~/sm1.txt ~/sm2.txt | grep -v 'sitemap.xml?page=' | sort -u > ~/blogger-urls.txt
    wc -l < ~/blogger-urls.txt
    grep -c '/p/' ~/blogger-urls.txt

    Attendu : un total comme 193, puis le nombre de pages comme 6. Conservez ce fichier. C’est votre liste de contrôle pour tous les tests qui suivent.

  2. Téléchargez la sauvegarde Blogger. Dans Blogger, ouvrez Paramètres, descendez jusqu’à Gérer le blog, puis choisissez Sauvegarder le contenu et Télécharger. Téléversez le fichier dans votre compte cPanel et comptez ce qu’il contient :

    grep -oE 'kind#(post|page|comment)|<blogger:type>[A-Z]+</blogger:type>' ~/blog-backup.xml | sort | uniq -c

    Attendu, selon le format d’exportation que Blogger vous remet :

        412 kind#comment
          6 kind#page
        187 kind#post

    Le nombre de billets peut dépasser le total du sitemap, parce que les brouillons sont inclus. Un compte de zéro pour les deux motifs veut dire que le fichier est incomplet : téléchargez-le de nouveau.

  3. Montez WordPress sur un nom d’hôte temporaire. Créez le compte dans WHM sous Account Functions > Create a New Account. Pointez new.example.com vers le serveur avec un enregistrement A, puis installez :

    cd ~/public_html
    wp core download
    wp config create --dbname=exmpl_wp --dbuser=exmpl_wp --dbpass='REPLACE_ME'
    wp core install --url=https://new.example.com --title='Example Blog' \
      --admin_user=admin --admin_email=you@example.com --skip-email
    wp option update timezone_string 'America/Toronto'
    wp rewrite structure '/%year%/%monthnum%/%postname%.html' --hard

    Attendu : Success: WordPress installed successfully., puis Success: Updated 'timezone_string' option., puis Success: Rewrite structure set. Utilisez le fuseau horaire affiché dans Blogger sous Paramètres > Mise en forme. Un écart peut faire glisser un billet publié vers minuit dans le mauvais mois, ce qui change son URL.

  4. Importez les billets et les commentaires. Installez l’importateur, puis vérifiez la limite de téléversement :

    wp plugin install blogger-importer --activate
    wp eval 'echo size_format( wp_max_upload_size() ) . PHP_EOL;'
    ls -lh ~/blog-backup.xml

    Attendu : Success: Plugin installed successfully., puis une limite comme 64 MB. Si la sauvegarde est plus grosse, augmentez upload_max_filesize et post_max_size dans le MultiPHP INI Editor de cPanel. Allez ensuite dans Outils > Importer > Blogger, téléversez le fichier et suivez les invites, y compris l’attribution des auteurs. Comptez ensuite le résultat :

    wp post list --post_type=post --post_status=any --format=count
    wp post list --post_type=page --post_status=any --format=count
    wp comment list --format=count

    Attendu : des nombres proches de ceux de l’étape 2. Le comportement exact varie d’une version de l’extension à l’autre, alors comparez au lieu de supposer. Les pages qui ne sont pas arrivées sont assez peu nombreuses pour être refaites à la main. Si les billets affichent 0, voyez la section Dépannage.

  5. Vérifiez que les URL des billets correspondent. Testez chaque billet du sitemap contre le nouveau site :

    grep -v '/p/' ~/blogger-urls.txt | sed 's#https://www.example.com#https://new.example.com#' \
      | while read -r u; do printf '%s  %s\n' "$(curl -s -o /dev/null -w '%{http_code}' "$u")" "$u"; done \
      | grep -v '^200'

    Attendu : aucune sortie. Chaque ligne qui apparaît est un billet dont le slug ou le mois diffère de Blogger. Corrigez le slug avec wp post update 42 --post_name=porch-repair, où 42 est l’identifiant du billet obtenu avec wp post list --s='Porch' --fields=ID,post_name.

  6. Copiez les images dans la médiathèque. Repérez chaque image hébergée chez Google dans l’exportation :

    grep -oE 'https://(blogger\.googleusercontent\.com|[0-9]\.bp\.blogspot\.com)/[^"&<> ]+' ~/blog-backup.xml \
      | sort -u > ~/blogger-images.txt
    wc -l < ~/blogger-images.txt

    Attendu : un compte comme 340. Blogger lie souvent une petite vignette à un grand original, alors attendez-vous à deux URL par image. Pour chaque image, importez-la et remplacez l’adresse dans le contenu des billets :

    url='https://blogger.googleusercontent.com/img/b/AVvXsEi/s1600/porch.jpg'
    id=$(wp media import "$url" --post_id=42 --porcelain)
    new=$(wp eval "echo wp_get_attachment_url($id);")
    wp search-replace "$url" "$new" wp_posts --include-columns=post_content

    Attendu : un identifiant de fichier joint, puis Success: Made 1 replacement. Pour des centaines d’images, une extension qui rapatrie les images externes fait le même travail en lot. Utilisez wp search-replace plutôt que du SQL brut, parce qu’il gère les données sérialisées, où PHP enregistre chaque chaîne avec sa longueur.

  7. Écrivez les règles de redirection. Ouvrez ~/public_html/.htaccess et ajoutez ce bloc au-dessus de # BEGIN WordPress. Les règles placées entre les marqueurs WordPress sont effacées quand on enregistre les permaliens.

    # --- Anciens chemins Blogger : garder au-dessus du bloc WordPress ---
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{QUERY_STRING} (^|&)m=[01](&|$)
    RewriteRule ^(.*)$ /$1? [R=301,L]
    RewriteRule ^p/([^/]+)\.html$ /$1/ [R=301,L]
    RewriteRule ^feeds/posts/default/?$ /feed/ [R=301,L]
    RewriteRule ^(\d{4})_(\d{2})_\d{2}_archive\.html$ /$1/$2/ [R=301,L]
    RewriteRule ^search/label/Home\sRepair$ /category/home-repair/ [R=301,L]
    RewriteRule ^search/label/([^/]+)$ /category/$1/ [R=301,L]
    </IfModule>
    # --- fin des anciens chemins Blogger ---

    La première règle retire ?m=1 ; le ? final supprime la chaîne de requête. Générez une ligne d’étiquette explicite pour chaque catégorie dont le nom contient des espaces ou des majuscules :

    wp term list category --fields=name,slug --format=csv | tail -n +2

    Attendu : des lignes comme Home Repair,home-repair. Chaque nom qui diffère de son slug obtient sa propre ligne, au-dessus de la règle générale des étiquettes. Utiliser RewriteRule partout garde l’ordre prévisible, car la directive Redirect d’Apache s’exécute à une autre phase.

  8. Basculez le DNS. La veille, abaissez le TTL des enregistrements www et racine à 300 secondes. Vérifiez ensuite ce qui existe :

    dig +short CNAME www.example.com
    dig +short A example.com
    dig +short MX example.com

    Attendu pour un domaine personnalisé Blogger : ghs.google.com., puis les quatre adresses de Google 216.239.32.21, 216.239.34.21, 216.239.36.21 et 216.239.38.21, puis votre hôte de courriel. Chez votre hébergeur DNS, remplacez les quatre enregistrements A par un seul enregistrement A vers l’IP de votre serveur cPanel. Faites pointer le CNAME www vers example.com. Ne touchez pas aux enregistrements MX et TXT. Blogger n’a jamais géré votre courriel, donc le courriel continue de circuler. Terminez ensuite sur le serveur :

    wp search-replace 'https://new.example.com' 'https://www.example.com' --all-tables
    wp option get siteurl

    Attendu : un nombre de remplacements, puis https://www.example.com. Lancez AutoSSL depuis la page SSL/TLS Status de cPanel dès que le DNS pointe vers la nouvelle IP.

Valider que tout fonctionne

Passez la liste complète contre le domaine en production et affichez tout ce qui est inattendu :

while read -r u; do
  printf '%s  %s\n' "$(curl -s -o /dev/null -w '%{http_code}' "$u")" "$u"
done < ~/blogger-urls.txt | grep -vE '^(200|301)'

Attendu : aucune sortie. Les billets répondent 200 ; les pages /p/ répondent 301. Vérifiez ensuite les cas particuliers :

curl -sI 'https://www.example.com/2021/04/porch-repair.html?m=1' | grep -i '^location'
curl -sI 'https://www.example.com/search/label/Home%20Repair' | grep -i '^location'
wp db query "SELECT COUNT(*) FROM wp_posts WHERE post_content REGEXP 'googleusercontent|bp.blogspot';" --skip-column-names

Attendu : deux lignes location: qui pointent vers l’URL propre du billet et vers /category/home-repair/, puis 0. Nos tests de fumée après migration couvrent le reste de la première journée.

Dépannage

  • L’importateur termine, mais n’importe aucun billet. Blogger a changé son format d’exportation au fil des ans, et le soutien de l’importateur a parfois pris du retard. Confirmez que l’extension est à jour avec wp plugin list --name=blogger-importer. Si l’échec persiste, convertissez le fichier en WXR avec un convertisseur Blogger vers WXR, puis lancez wp import converted.xml --authors=create après wp plugin install wordpress-importer --activate.
  • wp media import échoue sur certaines URL de Google. Certaines adresses googleusercontent.com se terminent par un code de taille comme =w640, sans extension de fichier. WordPress refuse les fichiers dont il ne reconnaît pas le type. Essayez la même URL avec /s1600/ à la place du code de taille, ou téléchargez-la avec curl -o porch.jpg puis lancez wp media import porch.jpg --post_id=42.
  • Quelques billets répondent 404 sur WordPress. Blogger raccourcit les longs titres pour en faire des slugs, et WordPress peut bâtir un slug différent à partir du titre complet. L’étape 5 les liste ; corrigez chacun avec wp post update <ID> --post_name=<slug>. Si c’est le mois qui cloche, vérifiez le fuseau horaire du site.
  • Les redirections d’étiquettes aboutissent sur une 404. Le slug de la catégorie diffère du texte de l’étiquette. Ajoutez une règle explicite pour cette étiquette au-dessus de la règle générale, comme à l’étape 7. Notre guide sur les permaliens brisés après une migration détaille les vérifications de réécriture.
  • Les commentateurs n’ont pas d’avatar. L’exportation de Blogger enregistre souvent une adresse courriel générique pour les commentateurs, alors Gravatar n’a rien à associer. Les commentaires eux-mêmes sont intacts.

Quand ce n’est pas la bonne approche

Si votre blogue vit seulement à example.blogspot.com, vous ne pouvez pas y ajouter de redirections côté serveur, car c’est Google qui exploite ce serveur. Si un domaine personnalisé était rattaché au blogue, Blogger redirige l’adresse blogspot.com vers ce domaine tant qu’il reste rattaché. Google ne documente pas si cela continue une fois le DNS déplacé ailleurs. Gardez donc le domaine personnalisé configuré dans Blogger et testez avec curl -sI. Sans domaine personnalisé, l’option qui reste est un script dans le <head> du thème, ajouté sous Thème > Modifier le code HTML :

<script>
  window.location.replace('https://www.example.com' + window.location.pathname);
</script>

Google indique qu’il peut suivre les redirections JavaScript, mais une 301 côté serveur envoie un signal plus fort. Attendez-vous à perdre un peu de positionnement, et laissez le blogue Blogger publié. Notre guide pour préserver son positionnement pendant une migration explique quoi surveiller.

Si vous publiez rarement et que vous tenez à un blogue gratuit sans entretien, rester sur Blogger est un choix raisonnable. WordPress sur cPanel veut dire que les mises à jour, les sauvegardes et la sécurité deviennent votre affaire. Pour la syntaxe de réécriture utilisée plus haut, consultez la documentation de mod_rewrite d’Apache.

Un WordPress qui rapporte vraiment mérite un opérateur — Stack Harbor opère cette pile sous WordPress Entreprise ; réservez une consultation d’infrastructure.