Aller au contenu

WooCommerce ou BigCommerce : quand changer, et comment migrer vers WooCommerce sur cPanel

Ce guide vous aide à choisir entre WooCommerce et BigCommerce, puis montre comment migrer une boutique BigCommerce vers WooCommerce sur un serveur cPanel. Vous exporterez les produits, les variantes, les marques, les clients et les commandes, vous les reconstruirez dans WooCommerce et vous garderez chaque ancienne URL fonctionnelle grâce à des redirections 301.

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 curl et jq.
  • 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 avec jq --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.

Arbre de décision pour choisir entre rester sur BigCommerce et passer à WooCommerce sur cPanel : rester si personne dans l'équipe ne s'occupe d'un serveur, si la boutique dépend de listes de prix B2B ou de plusieurs vitrines, si assumer la sécurité des cartes poserait problème, ou si une haute saison arrive dans moins de huit semaines; sinon, passer à WooCommerce pour le choix d'extensions, le contrôle du contenu et du SEO, et la propriété des données

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.

Diagramme de correspondance de BigCommerce vers WooCommerce : les produits avec options de variante deviennent des produits variables, les options de variante deviennent des attributs globaux, les options modificatrices demandent une extension d'options, les marques deviennent des termes de marque, les catégories deviennent des catégories de produits, les images du CDN sont copiées dans la médiathèque, les clients deviennent des utilisateurs WordPress avec réinitialisation du mot de passe, les commandes deviennent des archives, et les URL de produits et de catégories à la racine reçoivent des redirections 301 vers des adresses /product/ et /product-category/

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

  1. 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 fichier wp-cli.yml dans 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": 412 ou un nombre semblable, plus total_pages et links. Un statut 401 dans la sortie signifie que le jeton ou le code de boutique est erroné. Un 403 signifie qu’une permission manque.

  2. Récupérez tout dans des fichiers JSON. L’API renvoie les résultats par pages, et meta.pagination.total_pages indique 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-*.json

    Résultat attendu : aucune sortie jusqu’à la dernière ligne, qui affiche votre nombre de produits, par exemple 412. La récupération des modificateurs utilise limit=10 parce que BigCommerce limite les pages à 10 dès que vous demandez les modificateurs. Si vous voyez integer expression expected, un fichier contient une erreur plutôt que des données. Ouvrez-le avec jq . bc-export/<name>-1.json pour 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.

  3. 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|&amp;|\&|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.txt

    Ré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.

  4. 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-*.json

    Résultat attendu : une version 9.6 ou plus, puis product_brand, puis un nom d’option par ligne, comme Color et Size. 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=1

    Résultat attendu : une ligne Success: Created product_attribute avec un identifiant pour chacun.

  5. 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.csv

    Ré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 comme BC-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.

  6. 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.csv et lancez l’importation. Comptez ensuite :

    wp post list --post_type=product --post_status=any --format=count

    Résultat attendu : le même nombre qu’à l’étape 2. Importez woo-variations.csv de 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-names

    Résultat attendu : votre nombre de variantes, puis 0. Pour les variations, consultez notre guide sur les produits variables et attributs.

  7. 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-*.json

    Ré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.

  8. 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=count

    Ré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_html par 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.

  9. 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.

  10. 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.conf

    Ré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.conf

    Résultat attendu : un nombre de lignes proche des produits, plus les catégories et les anciennes redirections. Collez le fichier dans ~/new.example.com/.htaccess au-dessus de # BEGIN WordPress, pour garder le bloc hors de la section que WordPress réécrit quand on enregistre les permaliens. La partie </dev/null empêche WP-CLI de lire par erreur l’entrée de la boucle.

  11. 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 home

    Ré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 valeurs Parent correspondantes dans woo-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=1 et 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.