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,digetwgetsur votre propre poste. Les deux premiers sont livrés avec macOS et la plupart des distributions Linux. Sous macOS, installezwgetavec 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.
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.
Étape par étape
-
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.txtRésultat attendu : un total comme
58, puis le nombre de pages comme14. Si le fichier contient d’autres adressessitemap.xmlau 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. -
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-requisitesrécupère aussi les images de chaque page, et--wait=1fait une pause d’une seconde entre les requêtes pour que l’exploration reste polie. Vérifiez que les images sont bien descendues avecfind ~/weebly-mirror -path '*uploads*' -type f | wc -l. Un résultat de0veut dire que les images sont sur un autre hôte, comme une adresseweebly.comoueditmysite.com; vous les importerez par URL à l’étape 6. -
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.comRé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.
-
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.comvers 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%/' --hardRésultat attendu :
Success: WordPress installed successfully., puisSuccess: Rewrite structure set.Ce réglage de permalien est la décision clé. Remplacezblogpar le nom de votre page de blogue Weebly s’il est différent, commenews. 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,queryRé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é. -
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.xmlRésultat attendu : un nombre comme
20. Installez l’importateur avecwp plugin install rss-importer --activate, puis téléversezweebly-feed.xmlsous 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.txtRé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' --porcelainRésultat attendu : un seul identifiant de billet comme
87. Collez le texte depuis la copie miroir dans l’éditeur, puis publiez. Relancezcommjusqu’à 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.htmldevient--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. -
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.txtRé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.txtRésultat attendu : aucune sortie. Chaque ligne
FAILEDest une image à importer plutôt depuis votre copie miroir, puisquewp media importaccepte aussi un chemin de fichier local. Le</dev/nullempêche WP-CLI de lire la liste qui alimente la boucle.--porcelainfait afficher seulement l’identifiant de la nouvelle pièce jointe.wp search-replaceest 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 paswp_, changezwp_postsdans les deux commandes. -
Ajoutez la carte de redirections. Ouvrez
~/public_html/.htaccesset 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
.htmlen 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 lignespreviousetarchivesseulement si ces formes figurent dans votre liste d’URL. Les billets n’ont besoin d’aucune règle :/blog/spring-maintenance-checklistexiste 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 WordPresset# END WordPresschaque fois qu’on enregistre les permaliens. -
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=2048Lancez cette commande en SSH avec l’utilisateur cPanel. En root, ajoutez
--user=exmplaprèsuapi. Résultat attendu : une sortie qui contientstatus: 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, etwww, 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 siteurlRé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-mirrorpar chemin local, par exemplewp 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
commde l’étape 5 et corrigez chaque billet avecwp 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 WordPresset confirmez avecgrep -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.