Aller au contenu

Migrer un site Squarespace vers WordPress sur cPanel

Apprenez à migrer un site Squarespace vers WordPress sur un serveur cPanel avec l'export WordPress intégré de Squarespace, et à combler ce qu'il laisse de côté. Vous rapatrierez chaque image hors du CDN de Squarespace, redirigerez les anciennes URL et déplacerez le domaine avant de résilier l'abonnement.

Ce guide vous montre comment déménager un site web de Squarespace vers WordPress autohébergé, sur un serveur cPanel/WHM. La bonne nouvelle, c’est que Squarespace offre un export intégré qui produit un fichier lisible par WordPress. Vos billets de blogue et vos pages de base traversent donc en une seule importation. Le hic, c’est que cet export laisse beaucoup de choses derrière, et que les images qu’il mentionne restent sur les serveurs de Squarespace tant que vous ne les rapatriez pas. La réponse courte est d’importer le fichier, de copier chaque image dans WordPress, de refaire les parties ignorées et de rediriger les anciennes adresses. Faites tout cela pendant que le site Squarespace est encore en ligne. Vous résiliez l’abonnement Squarespace en dernier, une fois qu’une validation prouve que plus rien n’en dépend.

Ce que vous allez accomplir

  • Exporter votre contenu Squarespace en sachant exactement ce que le fichier transporte et ce qu’il ne transporte pas.
  • Importer billets et pages dans WordPress sur un nom d’hôte temporaire pendant que Squarespace continue de servir les visiteurs.
  • Copier chaque image du CDN de Squarespace dans votre propre médiathèque, pour que rien ne casse à la fin de l’abonnement.
  • Installer une carte de redirections 301 qui couvre les formes d’URL de Squarespace, y compris les liens de fichiers /s/ et les filtres ?tag=.
  • Déplacer le DNS du domaine dans un ordre qui garde le courriel en marche, puis résilier Squarespace en toute confiance.

Prérequis

  • Un accès propriétaire ou administrateur au site Squarespace. L’outil d’exportation n’est offert qu’à ces rôles.
  • Un accès au DNS du domaine. Si le domaine est enregistré chez Squarespace Domains, c’est là que vous gérez le DNS. Cela inclut les domaines arrivés lors du passage des enregistrements Google Domains chez Squarespace en 2023.
  • 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. Sans SSH, les étapes d’importation et de redirection ont des équivalents plus lents dans l’admin WordPress et dans le gestionnaire de fichiers de cPanel.
  • curl et dig sur votre propre poste. Les deux sont livrés avec macOS et la plupart des distributions Linux ; sous Windows, utilisez WSL ou Git Bash.
  • Assez de temps avant la prochaine date de renouvellement Squarespace. Prévoyez au moins deux semaines de chevauchement, parce que l’étape des images exige que l’ancien site reste en ligne.
  • Les serveurs cPanel tournent sous Apache ou LiteSpeed. Les deux lisent .htaccess avec la même syntaxe, donc les règles de redirection ci-dessous fonctionnent dans les deux cas.

Comment ça fonctionne

L’export de Squarespace écrit un fichier WXR. WXR veut dire WordPress eXtended RSS : c’est le format XML que WordPress utilise pour ses propres exportations, et le seul que son importateur sait lire. Squarespace est donc plus accommodant que la plupart des constructeurs de sites hébergés, mais le fichier fait un tri.

Diagramme qui répartit le contenu Squarespace en trois groupes : ce que l'export WordPress transporte (un blogue et ses billets, les pages de base, les blocs texte, image et intégration, les galeries en partie), ce qu'il ne fait que référencer (les fichiers image qui restent sur images.squarespace-cdn.com tant qu'on ne les copie pas), et ce qu'il laisse derrière (pages de produits, événements, albums, blocs audio et vidéo, CSS personnalisé et tout second blogue), chacun avec la voie qui l'amène dans WordPress

Ce que l’export transporte. Une collection de blogue avec ses billets, ses commentaires et ses étiquettes. Les pages de base. Les blocs texte, image et intégration qu’elles contiennent. Les pages de galerie passent en partie, généralement sous forme de page qui liste les images plutôt que la mise en page que vous aviez conçue.

Ce qu’il ne fait que pointer. Les images ne sont pas incluses dans le fichier. Le XML contient des liens vers images.squarespace-cdn.com, le réseau de diffusion de contenu (CDN) de Squarespace, c’est-à-dire les serveurs qui stockent et servent vos fichiers téléversés. Après l’importation, vos pages WordPress chargent encore leurs images depuis Squarespace. Elles ont l’air correctes aujourd’hui et cassent quand le site disparaît.

Ce qu’il laisse derrière. Les pages de produits et le reste de Squarespace Commerce. Les pages d’événements, les albums, les blocs audio et vidéo, le CSS personnalisé et la plupart des types de blocs récents. Si le site a plus d’un blogue, l’export vous demande d’en choisir un, donc chaque autre blogue a besoin de sa propre voie.

Les formes d’URL diffèrent aussi. Squarespace sert les billets sous le chemin propre au blogue, par exemple /blog/<post-slug>. Les anciens gabarits 7.0 ajoutent parfois une date dans ce chemin. Les fichiers téléversés utilisent /s/<filename>. Les filtres d’étiquettes et de catégories sont souvent des chaînes de requête comme /blog?tag=recipes. WordPress ne produit aucune de ces formes tout seul, donc la carte de redirections fait partie du travail, ce n’est pas un extra.

L’ordre compte surtout à la fin, parce que deux erreurs ne se voient qu’une fois trop tard pour les annuler.

Diagramme de séquence de la migration Squarespace : exporter et inventorier, importer dans WordPress sur un nom d'hôte temporaire, copier les images hors du CDN de Squarespace, refaire le commerce et les pages ignorées, installer la carte 301, basculer le DNS avec les boîtes courriel avant le MX et le MX avant l'enregistrement A, et résilier l'abonnement Squarespace seulement quand la validation montre zéro référence au CDN

Étape par étape

  1. Inventoriez le site en ligne à partir de son sitemap. Squarespace publie un seul sitemap à plat qui liste chaque page, billet et produit publics.

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

    Résultat attendu : un total comme 96, puis un nombre de billets comme 58. Si votre blogue vit ailleurs que sous /blog/, par exemple /journal/ ou /news/, utilisez ce chemin à la place. Parcourez aussi la liste pour repérer les URL de produits et d’événements, puisqu’elles demandent leur propre plan. Pendant que vous êtes dans Squarespace, ouvrez le panneau URL Mappings (dans les paramètres avancés ou développeur du site) et copiez les redirections existantes dans un fichier texte. Elles ne font pas partie de l’export.

  2. Exportez le fichier WordPress. Dans Squarespace, ouvrez les paramètres et trouvez Import & Export. Squarespace a déplacé ce menu d’une version à l’autre, alors si vous ne le voyez pas, cherchez « export » dans le panneau des paramètres. Choisissez Exporter, puis WordPress, et sélectionnez le blogue voulu si le site en a plusieurs. Téléchargez le fichier quand Squarespace indique qu’il est prêt, puis copiez-le sur le serveur :

    # sur votre propre poste
    scp Squarespace-Wordpress-Export.xml exmpl@server.example.net:~/
    # sur le serveur
    grep -c '<item>' ~/Squarespace-Wordpress-Export.xml
    grep -c 'images.squarespace-cdn.com' ~/Squarespace-Wordpress-Export.xml

    Résultat attendu : un nombre d’éléments comme 74, qui regroupe billets, pages et entrées de pièces jointes, puis un compte CDN supérieur à zéro. Ce deuxième nombre donne un aperçu du travail sur les images à l’étape 5. Le nom exact du fichier varie, alors utilisez celui que Squarespace vous a donné.

  3. Créez le compte cPanel et installez WordPress sur un nom d’hôte temporaire. Dans WHM, utilisez Account Functions > Create a New Account. Faites pointer un sous-domaine comme new.example.com vers le nouveau serveur avec un enregistrement A, et travaillez là. Vous avez ainsi un vrai HTTPS pendant que Squarespace continue de servir les visiteurs. Créez d’abord la base de données vide et son utilisateur dans l’outil Manage My Databases de cPanel, puis reprenez ces noms ci-dessous.

    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 Studio' \
      --admin_user=admin --admin_email=you@example.com --skip-email
    wp rewrite structure '/%postname%/' --hard
    wp option get siteurl

    Résultat attendu : Success: WordPress installed successfully., puis Success: Rewrite structure set., puis https://new.example.com. L’option --hard écrit les règles de permaliens dans .htaccess en plus de la base de données.

  4. Importez le fichier d’export. La commande d’importation de WP-CLI a besoin que l’extension WordPress Importer soit installée d’abord.

    wp plugin install wordpress-importer --activate
    wp import ~/Squarespace-Wordpress-Export.xml --authors=create

    Résultat attendu : une ligne par élément comme -- Imported post as post_id #37, et à la fin Success: Finished importing from '/home/exmpl/Squarespace-Wordpress-Export.xml' file. L’option --authors=create crée un utilisateur WordPress pour chaque auteur du fichier. Utilisez --authors=skip si vous préférez tout attribuer à l’administrateur actuel. L’importateur tente aussi de télécharger les pièces jointes listées dans le fichier. Certains de ces téléchargements peuvent échouer, et les images insérées dans le texte des billets ne sont pas des pièces jointes du tout, donc l’étape suivante rattrape les deux cas.

    Comptez ce qui est arrivé et comparez avec les chiffres du sitemap :

    wp post list --post_type=post --format=count
    wp post list --post_type=page --format=count

    Résultat attendu : un nombre de billets proche du compte de l’étape 1. Un gros écart veut souvent dire que vous avez exporté un autre blogue que celui qui contient la plupart de vos billets.

  5. Copiez chaque image hors du CDN de Squarespace. Commencez par dresser la liste des adresses d’images encore référencées dans votre contenu :

    wp db query "SELECT post_content FROM wp_posts WHERE post_content LIKE '%squarespace-cdn.com%';" --skip-column-names \
      | grep -oE 'https://images\.squarespace-cdn\.com/[^"?) ]+' \
      | sort -u > ~/sq-images.txt
    wc -l < ~/sq-images.txt

    Résultat attendu : un nombre comme 212. Chaque ligne est une image unique. Importez maintenant chacune d’elles 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 < ~/sq-images.txt 2>&1 | tee ~/sq-images.log
    grep -c FAILED ~/sq-images.log

    Résultat attendu : 0 échec. Chaque < /dev/null empêche une commande WP-CLI d’avaler le reste de la liste d’images comme sa propre entrée, ce qui sauterait des images sans avertissement. L’option --porcelain fait afficher à wp media import seulement l’identifiant de la nouvelle pièce jointe, que la boucle utilise pour trouver l’adresse du fichier local. On utilise wp search-replace plutôt qu’un REPLACE SQL parce que WordPress stocke certaines valeurs en données PHP sérialisées, où chaque chaîne enregistre sa propre longueur. WP-CLI garde ces longueurs exactes, alors qu’un remplacement SQL brut peut corrompre la ligne sans avertissement. Squarespace ajoute souvent une indication de taille comme ?format=1500w après le nom du fichier. La boucle la laisse sur la nouvelle adresse, et votre serveur web l’ignore, donc l’image se charge quand même.

    Faites cette étape pendant que Squarespace est encore en ligne. Une fois l’abonnement terminé, ces fichiers du CDN ne sont plus à votre portée.

  6. Refaites ce que l’export a ignoré. Traitez les éléments dans l’ordre de leur valeur pour l’entreprise :

    • Les produits. Dans le panneau d’inventaire de Squarespace Commerce, exportez vos produits en CSV. Importez ce fichier avec l’importateur de produits de WooCommerce et associez les colonnes dans son écran de correspondance. Les colonnes d’images de produits contiennent des liens CDN, et l’importateur les télécharge dans la médiathèque au passage. Relancez quand même la requête de l’étape 5 ensuite, pour attraper tout téléchargement raté. L’historique des commandes est un export CSV séparé, qu’il vaut mieux garder en archive plutôt qu’importer.
    • Un second blogue. Les blogues Squarespace publient un fil RSS à /<blog-path>?format=rss. Il ne liste en général que les billets récents, alors comparez son nombre d’éléments avec le sitemap et recopiez le reste à la main.
    • Événements, albums, blocs audio et vidéo. Refaites-les dans l’éditeur de blocs. Les blocs vidéo deviennent des blocs d’intégration avec le lien YouTube ou Vimeo d’origine.
    • Le CSS personnalisé. Copiez-le dès maintenant du panneau CSS personnalisé de Squarespace vers un fichier texte. Les noms de classes ne correspondront pas à votre thème WordPress, alors servez-vous-en comme référence pour l’apparence, pas comme du code à coller.
  7. Bâtissez et installez la carte 301. Transformez les URL de blogue de l’étape 1 en lignes de redirection :

    grep '/blog/' ~/sq-urls.txt \
      | sed -E 's#https://example\.com/blog/([^/]+)/?$#Redirect 301 /blog/\1 https://example.com/\1/#' \
      | grep '^Redirect' > ~/redirects.conf
    head -2 ~/redirects.conf

    Résultat attendu :

    Redirect 301 /blog/sourdough-starter-guide https://example.com/sourdough-starter-guide/
    Redirect 301 /blog/studio-open-house https://example.com/studio-open-house/

    Les URL de billets datées des gabarits 7.0 ne correspondent pas à ce motif et sont laissées de côté, alors ajoutez-les à la main. Placez ensuite le bloc, avec les lignes pour les pages renommées, les fichiers /s/ et les filtres en chaîne de requête, dans ~/public_html/.htaccess au-dessus de # BEGIN WordPress :

    # --- Squarespace legacy paths: keep above the WordPress block ---
    Redirect 301 /blog/sourdough-starter-guide https://example.com/sourdough-starter-guide/
    Redirect 301 /s/price-sheet.pdf https://example.com/wp-content/uploads/2026/09/price-sheet.pdf
    RewriteEngine On
    RewriteCond %{QUERY_STRING} ^format=rss$
    RewriteRule ^blog/?$ /feed/ [R=301,L,QSD]
    RewriteCond %{QUERY_STRING} ^tag=([^&]+)$
    RewriteRule ^blog/?$ /tag/%1/ [R=301,L,QSD]
    # --- end Squarespace legacy paths ---
    
    # BEGIN WordPress

    La directive Redirect simple ne voit pas les chaînes de requête, c’est pourquoi les cas ?format=rss et ?tag= passent par RewriteCond. %1 insère l’étiquette capturée par la condition, et QSD (query string discard) retire l’ancienne chaîne de requête de la nouvelle adresse. Le bloc se trouve au-dessus des règles WordPress parce que leur règle fourre-tout envoie chaque requête non reconnue à index.php. Gardez-le aussi en dehors des marqueurs BEGIN/END, puisque WordPress réécrit cette section quand on enregistre les permaliens.

    Téléversez d’abord chaque fichier /s/ dans la médiathèque, pour que la cible de la redirection existe. Testez ensuite sur le nom d’hôte temporaire :

    curl -sI https://new.example.com/blog/sourdough-starter-guide | head -3

    Résultat attendu : HTTP/1.1 301 Moved Permanently et un en-tête Location: avec la nouvelle adresse. Un 200 ou un 404 veut dire que le bloc est sous les règles WordPress ou dans le mauvais fichier.

  8. Basculez le DNS : les boîtes courriel, puis le MX, puis l’enregistrement A. Vérifiez d’abord l’état actuel :

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

    Résultat attendu pour un site sur Squarespace : des enregistrements A comme 198.185.159.144 et 198.49.23.144, un CNAME www comme ext-sq.squarespace.com., et des enregistrements MX pour votre fournisseur de courriel. La veille, abaissez le TTL (durée de vie, soit le temps pendant lequel les résolveurs gardent un enregistrement en cache) de ces enregistrements à 300 secondes. Si le courriel déménage vers cPanel, créez et testez chaque boîte avant de toucher au MX. Si le courriel reste chez Google Workspace ou un autre fournisseur, laissez le MX exactement tel quel. Notre liste de préparation DNS détaille la baisse du TTL et la revue des enregistrements.

    Remplacez ensuite les enregistrements A de Squarespace par l’adresse IP de votre serveur et faites pointer www vers le domaine racine. Vous pouvez garder le domaine enregistré chez Squarespace Domains et modifier les enregistrements là-bas. Un transfert de registraire peut attendre que le site soit stable. Terminez en réécrivant 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.

Valider que ça fonctionne

Confirmez que plus rien, ni dans la base de données ni dans la page affichée, ne se charge depuis Squarespace :

wp db query "SELECT COUNT(*) FROM wp_posts WHERE post_content LIKE '%squarespace-cdn.com%';" --skip-column-names
wp db query "SELECT COUNT(*) FROM wp_postmeta WHERE meta_value LIKE '%squarespace-cdn.com%';" --skip-column-names
curl -s https://example.com/ | grep -c 'squarespace'

Résultat attendu : 0 pour les trois. Tout autre nombre est une image ou un script qui cassera à la résiliation.

Vérifiez que chaque ancienne URL répond maintenant par un 200 ou un 301, jamais par un 404 :

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

Résultat attendu : aucune sortie. Chaque ligne qui apparaît est une adresse qu’il reste à rediriger ou à refaire.

Testez les redirections de chaînes de requête et du fil RSS, faciles à oublier :

curl -sI 'https://example.com/blog?format=rss' | grep -i '^location'
curl -sI 'https://example.com/blog?tag=recipes' | grep -i '^location'

Résultat attendu : Location: https://example.com/feed/ et Location: https://example.com/tag/recipes/. Envoyez ensuite un message depuis un compte externe à chaque boîte courriel et confirmez qu’il arrive. Nos tests de fumée post-migration couvrent le reste des vérifications du premier jour. C’est seulement quand tout cela passe que vous résiliez l’abonnement du site Squarespace.

Dépannage

  • wp import indique que l’importateur est absent. L’erreur vous dit que WordPress Importer doit être installé. Lancez wp plugin install wordpress-importer --activate et réessayez. La commande d’importation s’appuie sur cette extension.
  • wp media import échoue avec « Sorry, you are not allowed to upload this file type. » Certaines adresses du CDN se terminent sans extension de fichier, donc WordPress ne peut pas savoir de quel type de fichier il s’agit. Téléchargez l’image avec curl -o image.jpg "<url>", importez le fichier local avec wp media import image.jpg, puis lancez le même wp search-replace pour cette adresse.
  • Les billets sont importés, mais les images se chargent encore depuis Squarespace. La boucle de l’étape 5 n’a pas tourné, ou certains téléchargements ont échoué. Cherchez les lignes FAILED dans ~/sq-images.log, puis relancez la requête de l’étape 5.
  • Un billet affiche du balisage brut ou des sections vides. Les blocs Squarespace que WordPress ne reconnaît pas arrivent sous forme de HTML résiduel, ou n’arrivent pas du tout. Ouvrez le billet dans l’éditeur de blocs, utilisez « Convertir en blocs » sur le contenu classique, et refaites la section manquante à la main. Commencez par les billets les plus visités.
  • Les anciens liens d’étiquettes donnent encore un 404. Le motif RewriteRule suppose que le blogue est à /blog. Si le vôtre est à /journal, remplacez ^blog/?$ par ^journal/?$ dans chaque règle. Confirmez aussi que les étiquettes existent dans WordPress avec wp term list post_tag --fields=slug.

Quand ce n’est pas la bonne approche

Si la boutique est le cœur de l’entreprise, ce guide ne couvre que la plus petite moitié du travail. Les produits passent par CSV, mais pas les comptes clients, les abonnements, les produits numériques ni la configuration des paiements. Planifiez la boutique WooCommerce comme un projet à part, et envisagez de garder Squarespace Commerce en ligne jusqu’à ce que cette boutique soit testée.

Un petit portfolio fait surtout de galeries et d’albums gagne peu à l’export, puisque ce sont justement les parties qu’il gère le moins bien. Refaire les pages directement dans un thème WordPress va souvent plus vite, et vous utilisez quand même les étapes 1, 7 et 8 de ce guide.

Si votre site utilise les Member Areas ou Scheduling de Squarespace, choisissez et testez les extensions WordPress qui les remplacent avant de fixer une date de bascule. Côté WP-CLI, la documentation de référence de la commande import liste chaque option. Si vous comparez Squarespace à un constructeur semblable, notre guide de migration Wix montre ce que donne une plateforme sans aucun export.

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.