Comment repartir d’un export CSV Shopify quand chaque variante — taille, couleur, matière — occupe sa propre ligne, alors que WooCommerce attend un produit variable unique avec ses variations rattachées ? C’est la question posée par un commerçant qui quittait Shopify après trois ans, avec un catalogue de deux cents références et autant de combinaisons de tailles et de couleurs à ne pas perdre au passage.
Les extensions génériques d’import CSV vers WooCommerce gèrent rarement bien ce cas : elles créent souvent un produit simple par ligne, ce qui multiplie les fiches au lieu de les regrouper. La solution retenue a été d’écrire une commande wp-cli personnalisée qui regroupe les lignes du CSV par produit parent avant de reconstruire la structure de variations attendue par WooCommerce.
Étape 1 : comprendre la structure de l’export Shopify
Un export Shopify standard (products_export.csv) contient une colonne Handle identique pour toutes les variantes d’un même produit, et des colonnes Option1 Value, Option2 Value qui portent respectivement la taille et la couleur. Le prix et le stock sont renseignés ligne par ligne, variante par variante. La première tâche consiste à regrouper les lignes par Handle en PHP avant toute création de contenu WordPress.
Étape 2 : déclarer les attributs globaux avant l’import
WooCommerce distingue les attributs globaux (des taxonomies comme pa_taille et pa_couleur, réutilisables sur tout le catalogue) des attributs personnalisés propres à un seul produit. Pour un catalogue migré, les attributs globaux évitent de recréer une taxonomie différente à chaque produit. Ils se créent une seule fois via wc_create_attribute() avant de lancer la commande d’import.
wc_create_attribute( array(
'name' => 'Taille',
'slug' => 'taille',
'type' => 'select',
'order_by' => 'menu_order',
'has_archives' => false,
) );
Étape 3 : créer le produit variable parent
Pour chaque groupe de lignes partageant le même Handle, la commande crée un produit avec wp_insert_post() et post_type réglé sur product, puis assigne le terme variable à la taxonomie product_type via wp_set_object_terms(). Les valeurs distinctes de taille et de couleur rencontrées dans le groupe sont ajoutées aux taxonomies pa_taille et pa_couleur, puis déclarées comme attributs de variation du produit parent.

Étape 4 : recréer chaque variante
Chaque ligne du groupe devient une variation, créée avec wp_insert_post() et post_type réglé sur product_variation, rattachée au produit parent via post_parent. Les valeurs d’attribut de la variation se stockent en meta sous la forme attribute_pa_taille et attribute_pa_couleur, avec le slug du terme correspondant.
$variation_id = wp_insert_post( array(
'post_title' => $produit_parent->post_title . ' - variation',
'post_name' => 'produit-' . $parent_id . '-variation',
'post_status' => 'publish',
'post_parent' => $parent_id,
'post_type' => 'product_variation',
) );
update_post_meta( $variation_id, 'attribute_pa_taille', sanitize_title( $ligne['Option1 Value'] ) );
update_post_meta( $variation_id, 'attribute_pa_couleur', sanitize_title( $ligne['Option2 Value'] ) );
$variation = new WC_Product_Variation( $variation_id );
$variation->set_regular_price( $ligne['Variant Price'] );
$variation->set_stock_quantity( (int) $ligne['Variant Inventory Qty'] );
$variation->set_manage_stock( true );
$variation->save();
Étape 5 : lier les variations au produit parent
Une fois toutes les variations créées pour un produit, l’objet WC_Product_Variable doit être rechargé et synchronisé pour que WooCommerce recalcule correctement la fourchette de prix affichée et le stock global du produit variable :
- Charger le produit parent avec
wc_get_product( $parent_id ) - Appeler
$produit->set_attributes()avec les attributs de variation déclarés - Sauvegarder avec
$produit->save() - Appeler
WC_Product_Variable::sync( $parent_id )pour recalculer les bornes de prix
Toujours lancer la commande sur un sous-ensemble de dix produits avant de traiter le catalogue complet : les erreurs de mapping d’attributs se voient tout de suite sur un petit lot.
Ce que cette migration ne couvre pas
Les abonnements de paiement récurrents gérés côté Shopify (les extensions de type abonnement mensuel) n’ont pas d’équivalent direct migré par ce script : ils demandent une reconstruction manuelle sur la passerelle de paiement choisie côté WooCommerce, souvent avec l’aide du support de l’extension d’abonnements retenue.
En résumé
Regrouper les lignes d’un export Shopify par Handle avant de les rejouer avec les fonctions natives de WooCommerce évite la duplication de fiches produits que provoquent la plupart des imports CSV génériques. La commande wp-cli développée pour ce catalogue de deux cents références a tourné en une dizaine de minutes, variations comprises, sans perte de stock ni de prix.