Ce guide s’adresse aux propriétaires de boutiques, et aux administrateurs qui les épaulent, qui hésitent entre BigCommerce et WooCommerce et envisagent de changer. BigCommerce est une plateforme de commerce hébergée où le fournisseur gère les serveurs, alors que WooCommerce est une extension gratuite qui transforme WordPress en boutique, sur un hébergement que vous contrôlez. On change surtout pour posséder ses données, avoir un plus grand choix d’extensions et contrôler pleinement le contenu et le référencement naturel (SEO). Notre réponse : décidez d’abord avec une courte liste de questions, puis migrez en tirant les données de l’API de BigCommerce et en les important avec l’importateur CSV de WooCommerce. À la fin, WooCommerce servira votre domaine et chaque ancienne adresse de produit ou de catégorie redirigera vers sa nouvelle page.
Ce que vous allez accomplir
- Décider, avec des critères clairs, s’il vaut mieux rester sur BigCommerce ou passer à WooCommerce.
- Extraire de BigCommerce les produits, variantes, images, catégories, marques, clients et redirections existantes avec
curletjq. - Importer le catalogue dans WooCommerce sous forme de produits variables, avec des attributs globaux et des marques.
- Créer une redirection 301 pour chaque URL de produit et de catégorie BigCommerce, puisqu’aucune ne suit un motif commun.
- Basculer le DNS pendant que BigCommerce est encore actif, et ne l’annuler qu’une fois tout vérifié.
Prérequis
- Un accès propriétaire au panneau de contrôle BigCommerce, pour créer un compte API.
- Un compte cPanel avec accès SSH, et WP-CLI, l’outil en ligne de commande de WordPress. Vérifiez avec
wp --info. - WooCommerce 9.6 ou plus récent. Cette version a intégré les marques (Brands) à WooCommerce lui-même, sans extension séparée.
jq, un petit outil en ligne de commande qui traite le JSON. Vérifiez avecjq --version. S’il manque sur le serveur, faites les étapes d’exportation sur votre ordinateur et téléversez les fichiers.- Un shell Bash, parce que les commandes utilisent des fonctions propres à Bash. Le shell SSH de cPanel est Bash par défaut.
- Un site WordPress de préproduction avec WooCommerce actif, sur un sous-domaine comme
new.example.com, avec ses fichiers dans~/new.example.com. L’étape 4 de notre guide de migration de Drupal vers WordPress montre cette mise en place. - Notre audit pré-vol pour une migration WooCommerce, fait en premier. Il couvre les passerelles de paiement, les taxes et la livraison, que ce guide ne répète pas.
Comment ça fonctionne
Commencez par la décision, parce qu’une migration ne rapporte que si une vraie raison la motive.
BigCommerce est un logiciel-service (SaaS), c’est-à-dire que le fournisseur gère les serveurs, les correctifs de sécurité et les sauvegardes. Son paiement en ligne prend aussi en charge la plus grande partie de votre travail PCI DSS. PCI DSS est la norme de sécurité de l’industrie des cartes pour quiconque accepte des paiements par carte. Sur WooCommerce, une passerelle qui héberge les champs de carte garde les numéros hors de votre serveur, mais sécuriser ce serveur devient votre travail. Les forfaits BigCommerce suivent vos ventes annuelles en ligne, donc la croissance vous fait monter de forfait. Les applications payantes s’additionnent aussi. Ces coûts sont de vrais facteurs, tout comme le désir de posséder vos données.
Une fois la décision prise, les données doivent changer de forme. BigCommerce a deux sortes d’options de produit. Les options de variante, comme la taille ou la couleur, créent un SKU distinct (le code d’un article vendable) avec son propre stock. Les options modificatrices, comme une zone de texte pour une gravure, modifient la commande sans créer de SKU. WooCommerce gère la première sorte nativement et demande une extension pour la seconde.
Les lignes d’URL comptent le plus. BigCommerce place les produits et les catégories à la racine du site, par exemple /blue-widget/ et /shoes/. WooCommerce utilise /product/blue-widget/ et /product-category/shoes/. Une règle à motif ne peut pas distinguer un produit d’une catégorie, alors chaque URL a besoin de sa propre ligne de redirection. Les étapes ci-dessous génèrent ces lignes pour vous.
Étape par étape
-
Créez un compte API en lecture seule. Dans le panneau de contrôle BigCommerce, ouvrez Settings, puis la section API, et créez un compte API de niveau boutique (store-level API account). Mettez Products, Customers, Orders et Content en lecture seule (read-only), et laissez tout le reste à None. Copiez le jeton d’accès dès qu’il s’affiche, car BigCommerce ne le montre qu’une fois. Le chemin d’API affiché contient le code de votre boutique (store hash), le court code après
/stores/. Créez un dossier de travail hors de la racine Web, pour que les données clients exportées ne soient jamais publiques. Un fichierwp-cli.ymldans ce dossier indique à WP-CLI où se trouve le site de préproduction. Testez ensuite le jeton :mkdir ~/bc-migration && cd ~/bc-migration echo "path: $HOME/new.example.com" > wp-cli.yml export BC_STORE='abc123def' export BC_TOKEN='REPLACE_ME' curl -s -H "X-Auth-Token: $BC_TOKEN" -H "Accept: application/json" \ "https://api.bigcommerce.com/stores/$BC_STORE/v3/catalog/products?limit=1" | jq '.meta.pagination'Lancez toutes les commandes suivantes depuis
~/bc-migration, sauf si une étape dit autre chose. Résultat attendu : un objet JSON avec"total": 412ou un nombre semblable, plustotal_pagesetlinks. Un statut401dans la sortie signifie que le jeton ou le code de boutique est erroné. Un403signifie qu’une permission manque. -
Récupérez tout dans des fichiers JSON. L’API renvoie les résultats par pages, et
meta.pagination.total_pagesindique combien il y en a. Cette fonction récupère chaque page de n’importe quelle liste :bc_pull() { page=1; pages=1 while [ "$page" -le "$pages" ]; do curl -s -H "X-Auth-Token: $BC_TOKEN" -H "Accept: application/json" \ "https://api.bigcommerce.com/stores/$BC_STORE/$1&page=$page" > "bc-export/$2-$page.json" pages=$(jq '.meta.pagination.total_pages' "bc-export/$2-$page.json") page=$((page + 1)) done } mkdir -p bc-export bc_pull 'v3/catalog/products?include=variants,images&limit=250' products bc_pull 'v3/catalog/products?include=modifiers&limit=10' modifiers bc_pull 'v3/catalog/categories?limit=250' categories bc_pull 'v3/catalog/brands?limit=250' brands bc_pull 'v3/customers?limit=250' customers bc_pull 'v3/storefront/redirects?limit=100' redirects jq -s '[.[].data[]] | length' bc-export/products-*.jsonRésultat attendu : aucune sortie jusqu’à la dernière ligne, qui affiche votre nombre de produits, par exemple
412. La récupération des modificateurs utiliselimit=10parce que BigCommerce limite les pages à 10 dès que vous demandez les modificateurs. Si vous voyezinteger expression expected, un fichier contient une erreur plutôt que des données. Ouvrez-le avecjq . bc-export/<name>-1.jsonpour lire le message.Téléchargez aussi les fichiers CSV de l’administration comme copie de sécurité lisible dans un tableur. Utilisez Products > Export avec le modèle Default ou Bulk Edit, Customers > Export et Orders > Export.
-
Sauvegardez la liste des URL en ligne. BigCommerce publie un index de plan de site à
/xmlsitemap.php. Cette liste servira d’échantillon de test plus tard, et elle disparaît à la fermeture de la boutique :curl -s https://example.com/xmlsitemap.php \ | grep -oE '<loc>[^<]+</loc>' | sed -e 's|<loc>||' -e 's|</loc>||' -e 's|&|\&|g' \ | while read -r child; do curl -s "$child"; done \ | grep -oE '<loc>[^<]+</loc>' | sed -e 's|<loc>||' -e 's|</loc>||' | sort -u > bc-urls.txt wc -l bc-urls.txtRésultat attendu : un nombre proche de vos produits, plus les catégories, les marques et les pages. Un nombre sous 10 signifie que le plan de site a une autre forme; ouvrez-le alors dans un navigateur et lisez les liens enfants.
-
Préparez WooCommerce. Confirmez la version de WooCommerce et la taxonomie des marques sur le site de préproduction, puis listez les noms d’options qui deviendront des attributs :
wp plugin get woocommerce --field=version wp taxonomy get product_brand --field=name jq -r -s '[.[].data[].variants[].option_values[].option_display_name] | unique | .[]' bc-export/products-*.jsonRésultat attendu : une version 9.6 ou plus, puis
product_brand, puis un nom d’option par ligne, commeColoretSize. Une erreur indiquant que la taxonomie n’existe pas veut dire que WooCommerce est antérieur à 9.6; mettez-le d’abord à jour. Créez un attribut global pour chaque nom d’option de cette liste :wp wc product_attribute create --name=Color --slug=color --user=1 wp wc product_attribute create --name=Size --slug=size --user=1Résultat attendu : une ligne
Success: Created product_attributeavec un identifiant pour chacun. -
Construisez les deux fichiers d’importation. WooCommerce importe un produit variable en deux passes. Viennent d’abord les produits parents, puis les variations qui pointent vers le SKU de leur parent. Enregistrez ces deux programmes
jq:cat > bc-parents.jq <<'EOF' def attr($o): if $o then [$o[0].option_display_name, ($o | map(.label) | unique | join(", ")), 1, 1] else ["", "", "", ""] end; def sku: if .sku == "" then "BC-\(.id)" else .sku end; ($cats[0] | map({key: (.id | tostring), value: .name}) | from_entries) as $c | ($brands[0] | map({key: (.id | tostring), value: .name}) | from_entries) as $b | ["Type", "SKU", "Name", "Published", "Description", "Regular price", "Stock", "Categories", "Brands", "Images", "Attribute 1 name", "Attribute 1 value(s)", "Attribute 1 visible", "Attribute 1 global", "Attribute 2 name", "Attribute 2 value(s)", "Attribute 2 visible", "Attribute 2 global"], (.[].data[] | ([.variants[].option_values[]] | group_by(.option_display_name)) as $opts | (if ($opts | length) > 0 then "variable" else "simple" end) as $type | [$type, sku, .name, (if .is_visible then 1 else 0 end), .description, (if $type == "simple" then .price else "" end), (if $type == "simple" then .inventory_level else "" end), (.categories | map($c[tostring] // empty) | join(", ")), ($b[.brand_id | tostring] // ""), (.images | sort_by(.sort_order) | map(.url_zoom) | join(", "))] + attr($opts[0]) + attr($opts[1])) | @csv EOF cat > bc-variations.jq <<'EOF' ["Type", "SKU", "Parent", "Regular price", "Stock", "Attribute 1 name", "Attribute 1 value(s)", "Attribute 1 global", "Attribute 2 name", "Attribute 2 value(s)", "Attribute 2 global"], (.[].data[] | select([.variants[].option_values[]] | length > 0) | (if .sku == "" then "BC-\(.id)" else .sku end) as $parent | .variants[] | ([ "variation", (if .sku == "" then "BC-\(.product_id)-\(.id)" else .sku end), $parent, (.price // .calculated_price), .inventory_level ] + ([.option_values | sort_by(.option_display_name)[] | [.option_display_name, .label, 1]] | add // []) + ["", "", "", "", "", ""])[0:11]) | @csv EOF jq -r -s --slurpfile cats <(jq -s '[.[].data[]]' bc-export/categories-*.json) \ --slurpfile brands <(jq -s '[.[].data[]]' bc-export/brands-*.json) \ -f bc-parents.jq bc-export/products-*.json > woo-parents.csv jq -r -s -f bc-variations.jq bc-export/products-*.json > woo-variations.csv head -3 woo-parents.csvRésultat attendu : une ligne d’en-tête, puis des lignes comme
"variable","TS-100","Trail Shoe",1,...,"Acme","https://cdn11.bigcommerce.com/...","Color","Black, Red",1,1. Les produits sans SKU propre reçoivent un substitut commeBC-17, pour que les variations retrouvent leur parent. Les programmes gèrent jusqu’à deux options par produit. Les catégories s’importent par nom seulement; recréez ensuite toute imbrication de sous-catégories dans WooCommerce. -
Importez les parents, puis les variations. Gardez BigCommerce en ligne pendant cette étape. WooCommerce télécharge chaque image depuis le CDN de BigCommerce (réseau de diffusion de contenu, les serveurs d’images) pendant l’importation. Dans WordPress, ouvrez Produits > Tous les produits > Importer, téléversez
woo-parents.csvet lancez l’importation. Comptez ensuite :wp post list --post_type=product --post_status=any --format=countRésultat attendu : le même nombre qu’à l’étape 2. Importez
woo-variations.csvde la même façon, puis cherchez les variations sans parent :wp post list --post_type=product_variation --post_status=any --format=count wp db query "SELECT COUNT(*) FROM $(wp db prefix)posts WHERE post_type='product_variation' AND post_parent=0;" --skip-column-namesRésultat attendu : votre nombre de variantes, puis
0. Pour les variations, consultez notre guide sur les produits variables et attributs. -
Recréez les options modificatrices. Listez les produits qui en utilisent :
jq -r -s '.[].data[] | select((.modifiers | length) > 0) | "\(.sku)\t\(.name)\t\([.modifiers[].display_name] | join(", "))"' bc-export/modifiers-*.jsonRésultat attendu : une ligne par produit, par exemple
MUG-01 Custom Mug Engraving text. Aucune sortie signifie que vous n’en avez pas. Recréez chacune avec une extension d’options comme WooCommerce Product Add-Ons, et testez le changement de prix dans le panier. -
Importez les clients. BigCommerce n’exporte jamais les mots de passe, alors les clients devront en choisir un nouveau :
{ echo 'user_login,user_email,first_name,last_name,role' jq -r -s '.[].data[] | [.email, .email, .first_name, .last_name, "customer"] | @csv' bc-export/customers-*.json } > bc-customers.csv wp user import-csv bc-customers.csv --skip-update wp user list --role=customer --format=countRésultat attendu : une ligne par nouvel utilisateur, puis un nombre égal à votre total de clients. WP-CLI n’envoie aucun courriel ici. Après la bascule, envoyez les courriels de réinitialisation depuis
~/public_htmlpar lots de 200. Bien des serveurs cPanel plafonnent en effet le nombre de courriels qu’un domaine peut envoyer par heure. L’étape 8 de notre guide de Magento vers WooCommerce donne les deux commandes. Prévenez les clients la veille pour que le courriel ne soit pas pris pour de l’hameçonnage. -
Gardez les commandes comme archives. Les anciennes commandes ne peuvent être ni remboursées ni facturées depuis WooCommerce, parce que les paiements appartiennent à votre ancienne configuration de passerelle. Gardez le CSV des commandes de l’étape 2 comme archive. Si l’équipe a besoin des anciennes commandes dans WooCommerce, importez-les avec un outil d’importation de commandes et marquez chacune Terminée. Les remboursements des anciennes commandes restent dans BigCommerce ou dans le tableau de bord de la passerelle.
-
Générez la carte de redirections. La boucle cherche la nouvelle adresse de chaque produit par son SKU et écrit une règle par ancienne URL. Elle fait ensuite la même chose pour les catégories :
jq -r -s '.[].data[] | [(if .sku == "" then "BC-\(.id)" else .sku end), .custom_url.url] | @tsv' bc-export/products-*.json \ | while IFS=$'\t' read -r sku old; do new=$(wp post list --post_type=product --meta_key=_sku --meta_value="$sku" --field=url </dev/null | sed 's|^https://[^/]*||') [ -n "$new" ] && printf 'RedirectMatch 301 ^%s/?$ %s\n' "${old%/}" "$new" done > bc-redirects.conf jq -r -s '.[].data[] | [.name, .custom_url.url] | @tsv' bc-export/categories-*.json \ | while IFS=$'\t' read -r name old; do new=$(wp term list product_cat --name="$name" --field=url </dev/null | head -1 | sed 's|^https://[^/]*||') [ -n "$new" ] && printf 'RedirectMatch 301 ^%s/?$ %s\n' "${old%/}" "$new" done >> bc-redirects.conf head -2 bc-redirects.confRésultat attendu :
RedirectMatch 301 ^/trail-shoe/?$ /product/trail-shoe/ RedirectMatch 301 ^/blue-widget/?$ /product/blue-widget/BigCommerce contient peut-être déjà ses propres redirections 301, listées sous Settings > 301 Redirects. Pointez chacune directement vers sa page finale, pour que les visiteurs ne rebondissent pas deux fois :
jq -r -s '.[].data[] | [.from_path, (.to_url | sub("^https?://[^/]+"; ""))] | @tsv' bc-export/redirects-*.json \ | while IFS=$'\t' read -r from to; do new=$(awk -v p="^${to%/}/?\$" '$3 == p {print $4}' bc-redirects.conf) [ -n "$new" ] && printf 'RedirectMatch 301 ^%s/?$ %s\n' "${from%/}" "$new" done > bc-legacy.conf cat bc-legacy.conf >> bc-redirects.conf wc -l bc-redirects.confRésultat attendu : un nombre de lignes proche des produits, plus les catégories et les anciennes redirections. Collez le fichier dans
~/new.example.com/.htaccessau-dessus de# BEGIN WordPress, pour garder le bloc hors de la section que WordPress réécrit quand on enregistre les permaliens. La partie</dev/nullempêche WP-CLI de lire par erreur l’entrée de la boucle. -
Basculez le DNS, et annulez BigCommerce en dernier. Deux jours avant, abaissez le TTL du DNS à 300 secondes. Le TTL (durée de vie) est le temps pendant lequel les résolveurs gardent un enregistrement en cache. Le jour venu, activez le mode maintenance de BigCommerce pour bloquer les nouvelles commandes, puis refaites les étapes 2 et 8 pour tout ce qui a été créé depuis. Déplacez le site du sous-domaine de préproduction vers le domaine principal :
rsync -a ~/new.example.com/ ~/public_html/ cd ~/public_html wp search-replace 'https://new.example.com' 'https://example.com' --all-tables wp option get homeRésultat attendu : un tableau de remplacements, puis
https://example.com. Pointez l’enregistrement A du domaine vers l’adresse IP du serveur cPanel, puis laissez AutoSSL de cPanel émettre un certificat une fois le DNS propagé. Gardez le forfait BigCommerce actif tant que les images, les redirections et votre période de remboursement ne sont pas toutes confirmées.
Valider que tout fonctionne
Testez un échantillon aléatoire des URL sauvegardées à l’étape 3 :
shuf -n 25 bc-urls.txt | while read -r url; do
printf '%s <- %s\n' "$(curl -s -o /dev/null -w '%{http_code} %{redirect_url}' "$url")" "$url"
done
Résultat attendu : 301 et une nouvelle adresse pour les produits et les catégories. Les pages dont le chemin n’a pas changé renvoient 200. Un 404 signale une URL sans règle. Un 200 sur une URL de produit veut habituellement dire que votre ordinateur voit encore l’ancien enregistrement DNS; attendez et testez de nouveau.
Confirmez qu’aucune description de produit n’intègre encore une image de BigCommerce :
wp db query "SELECT COUNT(*) FROM $(wp db prefix)posts WHERE post_content LIKE '%bigcommerce.com%';" --skip-column-names
Résultat attendu : 0. Tout autre nombre signifie que certaines descriptions pointent vers des images BigCommerce, qui cesseront de fonctionner à la fermeture de la boutique. Téléchargez d’abord ces images dans la médiathèque et mettez les descriptions à jour. Enfin, passez une vraie commande de test et confirmez qu’elle arrive dans le tableau de bord de la passerelle.
Dépannage
- L’importation saute une ligne à cause d’un SKU en double. Un produit parent et une de ses variantes partagent un SKU. Changez le SKU du parent dans
woo-parents.csv, ainsi que les valeursParentcorrespondantes danswoo-variations.csv, puis réimportez. - Les pages de produits n’affichent aucun menu d’options. L’attribut n’a pas été créé comme attribut global. Lancez
wp wc product_attribute list --user=1et confirmez que chaque nom d’option de l’étape 4 s’y trouve avant de réimporter. - Des images manquent après l’importation. L’importation a expiré ou BigCommerce était déjà fermé. Découpez le CSV en fichiers d’environ 300 lignes, gardez la boutique en ligne et relancez avec l’option de mise à jour des produits existants cochée.
- Les clients ne peuvent pas se connecter. C’est normal, parce que les mots de passe restent chez BigCommerce. Envoyez la commande de réinitialisation de l’étape 8.
Quand cette approche n’est pas la bonne
Restez sur BigCommerce si personne dans votre équipe ne prendra en charge les mises à jour, les sauvegardes et la sécurité d’un serveur. C’est la même chose si vous comptez sur des fonctions B2B comme les listes de prix par groupe de clients, ou si vous exploitez plusieurs vitrines depuis un seul compte. Ne migrez jamais dans les huit semaines qui précèdent votre saison la plus occupée. Si vous voulez seulement un meilleur thème ou quelques fonctions, une application BigCommerce ira plus vite qu’un déménagement.
Vérifiez les champs qu’utilise votre boutique dans la référence de l’API produits de BigCommerce et dans la documentation de l’importateur CSV de produits WooCommerce avant de fixer une date. Vous quittez plutôt Shopify? Notre guide de Shopify vers WooCommerce couvre les exportations et les URL de cette plateforme.
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.