Aller au contenu

Migrer un site Weebly vers WordPress sur cPanel

Ce guide vous montre comment migrer un site Weebly vers WordPress sur un serveur cPanel, même si Weebly n'offre aucune exportation WordPress. Vous allez récupérer le blogue par son fil RSS, refaire les pages sous leurs anciens noms, importer chaque image avant de toucher au DNS et rediriger chaque ancienne adresse Weebly.

Ce guide vous montre comment déménager un site web de Weebly vers WordPress autohébergé, sur un serveur cPanel/WHM. Weebly, qui appartient maintenant à Square, n’offre aucune exportation WordPress. Là où le téléchargement du site existe, vous obtenez un ZIP de pages HTML statiques et de fichiers images, sans base de données de blogue derrière. La réponse pratique est de récupérer le blogue par son fil RSS et de refaire les pages à la main sous les mêmes noms. Ensuite, importez chaque image avec WP-CLI pendant que Weebly les sert encore. À la fin, WordPress sert votre domaine, les anciennes adresses Weebly répondent par une redirection 301 et le courriel continue d’arriver.

Ce que vous allez accomplir

  • Garder une copie locale complète du site Weebly, pour ne rien perdre si le forfait prend fin plus tôt que prévu.
  • Bâtir WordPress sur un nom d’hôte temporaire pendant que Weebly continue de servir vos visiteurs.
  • Déplacer les billets de blogue, les pages, les images et les produits de boutique par la voie qui fonctionne pour chacun.
  • Garder la plupart des URL du blogue identiques et rediriger le reste avec une courte carte dans .htaccess.
  • Basculer le DNS dans un ordre sûr (le courriel d’abord, le site ensuite) et annuler le forfait Weebly en dernier.

Prérequis

  • Un accès propriétaire au site Weebly, ou au compte Square sous lequel il vit maintenant.
  • Un accès au DNS du domaine. C’est l’accès au registraire, ou les réglages de domaine de Weebly si vous avez acheté le domaine chez Weebly.
  • 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. Si votre hébergeur n’offre pas SSH, les écrans d’administration font le même travail, plus lentement.
  • curl, dig et wget sur votre propre poste. Les deux premiers sont livrés avec macOS et la plupart des distributions Linux. Sous macOS, installez wget avec Homebrew (brew install wget) ; sous Windows, utilisez WSL.
  • Savoir qui détient vos boîtes courriel. Weebly a revendu Google Workspace, et la possibilité de déplacer le courriel dépend de qui détient l’abonnement.

Ce guide vise les sites Weebly classiques. Si votre compte a déjà été déplacé vers Square Online, le téléchargement ZIP n’y existe pas, mais les étapes du fil RSS, de la copie miroir et des redirections s’appliquent toujours.

Comment ça fonctionne

Weebly vous remet des morceaux, pas un paquet. Chaque type de contenu sort par sa propre voie, et l’un d’eux n’a aucune voie du tout.

Tableau montrant cinq types de contenu Weebly et comment chacun arrive dans WordPress : les pages sont refaites à la main sous les mêmes slugs, les billets de blogue passent par le fil RSS et RSS Importer et gardent leurs URL sous /blog/, les images sous /uploads/ sont importées avec wp media import avant de toucher au DNS, les produits de boutique passent par un export CSV si Weebly en offre un, et les formulaires de contact n'ont aucune exportation et sont refaits avec une extension

L’archive du site est votre point de départ, quand elle existe. Les comptes Weebly classiques ont offert une option de téléchargement du site en ZIP dans les réglages de l’éditeur. Elle contient le HTML rendu de vos pages et les images téléversées. C’est un instantané de ce que voyaient les visiteurs, pas une exportation de données, et elle n’a pas été offerte sur tous les forfaits. C’est pourquoi ce guide fait aussi sa propre copie avec wget --mirror, un mode qui suit chaque lien de votre site et enregistre chaque page et chaque image sur le disque.

Les billets de blogue sont le seul contenu qu’une machine peut importer. Weebly publie un fil RSS (Really Simple Syndication, la liste XML des billets récents que suivent les lecteurs de flux). WordPress le lit avec RSS Importer, un importateur gratuit maintenu par le projet WordPress, qui apparaît sous Outils > Importer. Le hic, c’est que le fil ne contient qu’un nombre limité de billets récents, alors les plus anciens se recopient depuis votre copie miroir.

Les pages se refont dans l’éditeur de blocs. Weebly sert une page à /about-us.html, et WordPress sert la même page à /about-us/. Si vous gardez chaque slug (le nom d’une page tel qu’il apparaît dans l’URL), une seule règle de redirection couvre toutes les pages.

Les images sont le piège propre à Weebly. Elles vivent en général sous /uploads/ sur votre propre domaine. Tout a l’air correct sur le nouveau site jusqu’au jour où le DNS bascule. Ces mêmes adresses pointent alors vers votre nouveau serveur, qui n’a pas les fichiers. Importez-les dans la médiathèque pendant que Weebly répond encore.

Les produits de boutique passent dans WooCommerce par un fichier CSV (valeurs séparées par des virgules, un fichier de tableur). Il faut pour cela que votre Weebly Store ou votre tableau de bord Square offre une exportation de produits. Les formulaires de contact et leurs envois passés n’ont aucune voie d’exportation. Vous refaites les formulaires avec une extension.

Côté URL, Weebly est plus accommodant que la plupart des plateformes fermées. Les billets de blogue Weebly vivent à /blog/<slug>, et WordPress sait produire exactement cette forme.

Tableau des formes d'URL Weebly et de la redirection dont chacune a besoin : about-us.html devient /about-us/ avec une règle RedirectMatch, les billets et les pages de catégorie du blogue gardent la même adresse avec le permalien /blog/%postname%/ et n'ont besoin d'aucune règle, les archives mensuelles passent à /blog/2024/09/ avec une règle RedirectMatch, et les pages de produits exigent une ligne de redirection par produit, avec un rappel de placer le bloc au-dessus de la section WordPress de .htaccess

Étape par étape

  1. Listez chaque URL en ligne. Weebly publie un sitemap à /sitemap.xml. Enregistrez ses adresses dans un fichier :

    curl -s https://example.com/sitemap.xml \
      | grep -o '<loc>[^<]*</loc>' | sed 's|</*loc>||g' | sort -u > ~/weebly-urls.txt
    wc -l < ~/weebly-urls.txt
    grep -c '\.html$' ~/weebly-urls.txt

    Résultat attendu : un total comme 58, puis le nombre de pages comme 14. Si le fichier contient d’autres adresses sitemap.xml au lieu de pages, vous avez un index de sitemaps : lancez la même commande sur chacune. Notre guide d’inventaire avant migration liste ce qu’il faut noter d’autre dès maintenant.

  2. Enregistrez une copie complète du site. Téléchargez le ZIP de Weebly si votre éditeur l’offre. Faites votre propre copie miroir dans tous les cas, puisque c’est la copie que vous contrôlez :

    wget --mirror --adjust-extension --page-requisites --no-parent --wait=1 \
      --directory-prefix="$HOME/weebly-mirror" https://example.com/

    Résultat attendu, à la fin :

    FINISHED --2026-09-14 10:22:31--
    Total wall clock time: 1m 12s
    Downloaded: 214 files, 38M in 9.1s (4.19 MB/s)

    --page-requisites récupère aussi les images de chaque page, et --wait=1 fait une pause d’une seconde entre les requêtes pour que l’exploration reste polie. Vérifiez que les images sont bien descendues avec find ~/weebly-mirror -path '*uploads*' -type f | wc -l. Un résultat de 0 veut dire que les images sont sur un autre hôte, comme une adresse weebly.com ou editmysite.com ; vous les importerez par URL à l’étape 6.

  3. Lisez le DNS actuel. Avant de changer quoi que ce soit, notez ce qui est en ligne aujourd’hui :

    dig +short NS example.com
    dig +short A example.com
    dig +short MX example.com

    Résultat attendu, pour un domaine chez un registraire externe :

    ns1.registrar-dns.com.
    ns2.registrar-dns.com.
    192.0.2.10
    1 smtp.google.com.

    Gardez cette sortie. Si les noms des serveurs de noms mentionnent Weebly ou Square, la zone vit dans les réglages de domaine de Weebly. Vous devrez donc recréer chaque enregistrement, MX et TXT compris, là où le DNS déménage. Des enregistrements MX de Google veulent dire que les boîtes courriel sont chez Google Workspace. Demandez à la facturation de Weebly à qui appartient cet abonnement avant d’aller plus loin.

  4. Créez le compte cPanel et installez WordPress sur un nom d’hôte temporaire. Dans WHM, allez dans Account Functions > Create a New Account. Pointez un sous-domaine comme new.example.com vers le nouveau 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 Inc' \
      --admin_user=admin --admin_email=you@example.com --skip-email
    wp rewrite structure '/blog/%postname%/' --hard

    Résultat attendu : Success: WordPress installed successfully., puis Success: Rewrite structure set. Ce réglage de permalien est la décision clé. Remplacez blog par le nom de votre page de blogue Weebly s’il est différent, comme news. Comme la structure commence par /blog/, WordPress place aussi les archives par catégorie et par date sous /blog/. Confirmez-le :

    wp rewrite list --match=/blog/category/news/ --fields=match,query

    Résultat attendu : au moins une ligne dont la requête contient category_name=news. Un résultat vide veut dire que le permalien n’a pas été enregistré.

  5. Importez le blogue. Trouvez l’adresse du fil dans le HTML de la page de blogue, puis enregistrez le fil dans un fichier :

    curl -s https://example.com/blog | grep -io '<link[^>]*rss[^>]*>'

    Résultat attendu, quelque chose comme :

    <link rel="alternate" type="application/rss+xml" title="Blog" href="https://example.com/1/feed" />
    curl -s https://example.com/1/feed > ~/weebly-feed.xml
    grep -c '<item>' ~/weebly-feed.xml

    Résultat attendu : un nombre comme 20. Installez l’importateur avec wp plugin install rss-importer --activate, puis téléversez weebly-feed.xml sous Outils > Importer > RSS. Comparez ensuite les anciens slugs de billets avec ce que WordPress a créé :

    grep '/blog/' ~/weebly-urls.txt | grep -vE '/blog/(category|archives|previous)/' \
      | sed -E 's#.*/blog/##; s#/$##' | grep -v '^$' | sort -u > ~/old-slugs.txt
    wp post list --post_type=post --field=post_name | sort -u > ~/new-slugs.txt
    comm -23 ~/old-slugs.txt ~/new-slugs.txt

    Résultat attendu : seulement les billets plus anciens qui n’étaient pas dans le fil. Créez chacun d’eux à partir de votre copie miroir, avec l’ancien slug et la date d’origine :

    wp post create --post_type=post --post_status=draft --post_title='Spring maintenance checklist' \
      --post_name=spring-maintenance-checklist --post_date='2021-04-02 09:00:00' --porcelain

    Résultat attendu : un seul identifiant de billet comme 87. Collez le texte depuis la copie miroir dans l’éditeur, puis publiez. Relancez comm jusqu’à ce qu’il n’affiche plus rien.

    Refaites chaque page de la même façon avec --post_type=page, en lui donnant le nom Weebly sans .html : about-us.html devient --post_name=about-us. Pour une boutique, exportez les produits en CSV si Weebly ou Square l’offre, puis faites correspondre les colonnes dans WooCommerce sous Produits > Importer.

  6. Rapatriez chaque image dans WordPress avant de toucher au DNS. Rassemblez les adresses d’images que le contenu importé utilise encore :

    wp db query "SELECT post_content FROM wp_posts WHERE post_status IN ('publish','draft')" --skip-column-names \
      | grep -oE 'https?://[^" ]+/uploads/[^" ]+\.(jpe?g|png|gif|webp)' | sort -u > ~/weebly-images.txt
    wc -l < ~/weebly-images.txt

    Résultat attendu : un nombre comme 63. Importez chacune et remplacez son adresse dans le contenu :

    while read -r old; do
      id=$(wp media import "$old" --porcelain </dev/null) || { echo "FAILED $old"; continue; }
      new=$(wp eval "echo wp_get_attachment_url($id);" </dev/null)
      wp search-replace "$old" "$new" wp_posts --include-columns=post_content --quiet </dev/null
    done < ~/weebly-images.txt

    Résultat attendu : aucune sortie. Chaque ligne FAILED est une image à importer plutôt depuis votre copie miroir, puisque wp media import accepte aussi un chemin de fichier local. Le </dev/null empêche WP-CLI de lire la liste qui alimente la boucle. --porcelain fait afficher seulement l’identifiant de la nouvelle pièce jointe. wp search-replace est plus sûr que du SQL brut parce qu’il garde valides les données sérialisées de WordPress (des réglages où chaque chaîne porte sa longueur en préfixe). Si votre préfixe de tables n’est pas wp_, changez wp_posts dans les deux commandes.

  7. Ajoutez la carte de redirections. Ouvrez ~/public_html/.htaccess et collez ce bloc au-dessus de la ligne # BEGIN WordPress, avec une ligne par produit de boutique :

    # --- Anciens chemins Weebly : garder ce bloc au-dessus du bloc WordPress ---
    Redirect 301 /index.html https://example.com/
    Redirect 301 /store/p12/Blue-Mug.html https://example.com/product/blue-mug/
    RedirectMatch 301 ^/blog/archives/([0-9]{2})-([0-9]{4})/?$ https://example.com/blog/$2/$1/
    RedirectMatch 301 ^/blog/previous/([0-9]+)/?$ https://example.com/blog/page/$1/
    RedirectMatch 301 ^/([^/]+)\.html$ https://example.com/$1/
    # --- fin des anciens chemins Weebly ---

    Le module mod_alias d’Apache applique la première règle qui correspond, alors les lignes précises passent en premier et la règle générale .html en dernier. Cette dernière règle ne vise que les noms au premier niveau, donc elle ne peut pas attraper une URL de boutique. Gardez les lignes previous et archives seulement si ces formes figurent dans votre liste d’URL. Les billets n’ont besoin d’aucune règle : /blog/spring-maintenance-checklist existe maintenant dans WordPress, qui ajoute lui-même la barre oblique finale. Testez sur le nom d’hôte temporaire :

    curl -sI https://new.example.com/about-us.html | grep -iE '^(HTTP|location)'

    Résultat attendu :

    HTTP/1.1 301 Moved Permanently
    Location: https://example.com/about-us/

    Un 404 à la place veut dire que le bloc manque ou qu’il se trouve entre les marqueurs WordPress. WordPress réécrit tout ce qui se trouve entre # BEGIN WordPress et # END WordPress chaque fois qu’on enregistre les permaliens.

  8. Basculez dans un ordre sûr, et annulez Weebly en dernier. La veille, baissez à 300 secondes le TTL des enregistrements que vous allez changer. Le TTL (time to live) est la durée pendant laquelle les résolveurs gardent un enregistrement en cache. L’ordre est le suivant : les boîtes courriel, puis le MX, puis le site. Si le courriel déménage vers cPanel, créez d’abord chaque boîte :

    uapi Email add_pop email=info@example.com password='REPLACE_ME' quota=2048

    Lancez cette commande en SSH avec l’utilisateur cPanel. En root, ajoutez --user=exmpl après uapi. Résultat attendu : une sortie qui contient status: 1. Envoyez un message test dans les deux sens depuis le webmail. Si Google Workspace reste en place, laissez les enregistrements MX exactement comme l’étape 3 les a notés. Ensuite, changez le MX et attendez que l’ancien TTL soit écoulé. Pointez alors l’enregistrement A, et www, vers le nouveau serveur. Enfin, remplacez le nom d’hôte temporaire :

    wp search-replace 'new.example.com' 'example.com' --all-tables
    wp option get siteurl

    Résultat attendu : un nombre de remplacements, puis https://example.com. N’annulez le forfait Weebly qu’une fois les vérifications ci-dessous réussies. Si Weebly est aussi votre registraire, transférez d’abord le domaine ailleurs, ou confirmez qu’il se renouvelle de lui-même.

Valider que tout fonctionne

Suivez chaque ancienne URL jusqu’à son adresse finale et n’affichez que celles qui ne se terminent pas par un 200 :

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

Résultat attendu : aucune sortie. Chaque ligne affichée est une page ou un billet qui manque encore.

Confirmez que plus rien ne dépend des serveurs de Weebly :

wp db query "SELECT COUNT(*) FROM wp_posts WHERE post_content LIKE '%/uploads/_/_/_/_/%' OR post_content LIKE '%editmysite%';" --skip-column-names
curl -s https://example.com/blog/ | grep -ciE 'weebly|editmysite'

Résultat attendu : 0 pour les deux. Le premier motif repère les dossiers de téléversement numérotés de Weebly, mais pas le wp-content/uploads/2026/09/ de WordPress. Un compte différent de zéro est une image qui cassera dès la fermeture du forfait.

Vérifiez trois anciennes adresses au hasard :

for p in /about-us.html /blog/spring-maintenance-checklist /blog/archives/09-2024; do
  curl -sI "https://example.com$p" | grep -iE '^(HTTP|location)'
done

Résultat attendu : chacune affiche 301 et un en-tête Location qui pointe vers la nouvelle adresse. Envoyez ensuite un message depuis un compte externe à chaque boîte courriel et confirmez qu’il arrive. Nos tests de fumée après migration couvrent le reste de la première journée.

Dépannage

  • Les images ont cassé au moment où le DNS a basculé. Le contenu pointait encore vers /uploads/ sur votre propre domaine, et ce chemin mène maintenant à votre nouveau serveur. Relancez la commande de collecte de l’étape 6, puis importez les fichiers listés depuis ~/weebly-mirror par chemin local, par exemple wp media import ~/weebly-mirror/example.com/uploads/1/2/3/4/12345678/photo.jpg --porcelain.
  • Certaines anciennes URL du blogue renvoient une 404. RSS Importer bâtit les slugs à partir des titres, et quelques slugs Weebly avaient été modifiés ou raccourcis. Relancez comm de l’étape 5 et corrigez chaque billet avec wp post update <ID> --post_name=<old-slug>.
  • Les billets importés n’affichent qu’un court résumé. Certains fils transportent un extrait au lieu du texte complet. Collez le texte complet depuis votre copie miroir, et vérifiez quelques billets avant d’en corriger beaucoup.
  • Le bloc de redirections a disparu. Il avait été collé entre les marqueurs WordPress et effacé à l’enregistrement des permaliens. Remettez-le au-dessus de # BEGIN WordPress et confirmez avec grep -n 'BEGIN WordPress' ~/public_html/.htaccess.
  • Le nouveau formulaire de contact n’envoie rien. Le courriel envoyé par PHP depuis le serveur aboutit souvent dans les indésirables, ou échoue au contrôle SPF. SPF est l’enregistrement DNS qui nomme les serveurs autorisés à envoyer pour votre domaine. Utilisez une extension SMTP avec une vraie boîte courriel, et testez avec une adresse externe.

Quand ce n’est pas la bonne approche

Un petit site vitrine sans blogue est souvent plus rapide à refaire de zéro. Sautez le fil RSS et la boucle d’images, refaites les pages et gardez la carte de redirections, dont vous avez toujours besoin.

Votre boutique fonctionne peut-être avec le point de vente de Square, où les ventes en personne partagent le même inventaire. Dans ce cas, passer à WooCommerce coupe ce lien, à moins d’ajouter une intégration comme l’extension WooCommerce Square. Rester sur Square Online peut alors être le meilleur choix. Et si vous quittez Wix plutôt que Weebly, suivez notre guide de migration depuis Wix, parce que les URL de blogue et les exportations de Wix fonctionnent autrement.

La documentation de référence des deux outils qui font le gros du travail est la commande media import de WP-CLI et le module mod_alias d’Apache, qui définit Redirect et RedirectMatch.

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.