# wp-cli et Shopify : migrer un catalogue sans perdre les variantes de produits

> Comment reconstruire les variantes WooCommerce (taille, couleur) depuis un export CSV Shopify avec une commande wp-cli, sans plugin d'import générique.

- Auteur : WordPress Développement
- Publié le : 2021-07-10
- Mis à jour le : 2021-07-10
- Catégorie : Outils &amp; workflow
- URL : https://www.wpmoderne.fr/outils/wp-cli-shopify-migrer-catalogue-variantes/

## L’essentiel

- Export CSV Shopify avec une ligne par variante, à regrouper par produit
- Commande wp-cli personnalisée pour recréer produits variables et variations
- Attributs déclarés en global avant l'import pour éviter les doublons de taxonomie

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.

> L'essentiel à retenir : Export CSV Shopify avec une ligne par variante, à regrouper par produit ; Commande wp-cli personnalisée pour recréer produits variables et variations ; Attributs déclarés en global avant l'import pour éviter les doublons de taxonomie

## É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 :

1. Charger le produit parent avec `wc_get_product( $parent_id )`
2. Appeler `$produit->set_attributes()` avec les attributs de variation déclarés
3. Sauvegarder avec `$produit->save()`
4. 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.
