BEAR - WooCommerce Bulk Editor and Products Manager Professional

Convertir en masse des produits simples WooCommerce en variables (et inversement)

Pour convertir en masse des produits simples WooCommerce en produits variables, vous modifiez un seul champ : le type de produit. Dans l'éditeur en masse, cela prend une minute, même pour des milliers de produits. Que les produits convertis restent vendables dépend de tout ce qui entoure ce champ : le type n'est qu'une étiquette, et les prix, le stock, les attributs et les variations dont un produit variable a besoin ne viennent pas avec. Vous verrez ci-dessous ce qui arrive à chaque champ dans les deux sens, l'ordre des étapes qui préserve vos prix, comment fusionner plusieurs produits simples en un seul produit variable, et pourquoi un changement de type ne tient parfois pas.

Ce que fait un changement de type de produit, et ce qu'il laisse derrière lui

WooCommerce enregistre le type de produit comme un terme d'une taxonomie cachée, product_type, avec les termes simple, grouped, external et variable. La colonne Type du tableau des produits et le champ Type de produit (product type) de l'onglet Modification groupée (Bulk Edit) définissent ce terme, et rien d'autre. Les prix, le stock, l'UGS (SKU) et les attributs restent exactement tels qu'ils étaient enregistrés, et ce que cela implique dépend du sens :

Simple vers variableVariable vers simple
Prix régulier et prix promoRestent enregistrés sur le produit, mais WooCommerce vend un produit variable selon les prix de ses variations ; les cellules de prix de la ligne passent en lecture seuleVides : WooCommerce conserve les prix d'un produit variable sur ses variations, pas sur le produit
VariationsAucune, donc le produit ne peut pas être ajouté au panier tant qu'il n'en a pasNon supprimées : elles restent dans la base de données, masquées, avec leurs prix, leur stock et leurs UGS
StockLa gestion du stock reste sur le produit ; les variations sans stock propre utilisent sa quantitéLes réglages de stock enregistrés sur le parent deviennent le stock du produit
UGS (SKU)Reste sur le produitReste sur le produit ; les variations masquées gardent la leur

La deuxième ligne est la principale différence avec l'éditeur de produit de WooCommerce. Lorsque vous y faites passer un produit de Variable à un autre type, WooCommerce supprime les variations à l'enregistrement. L'éditeur en masse ne modifie que le terme de type, donc les variations survivent. C'est utile si vous revenez en arrière, car elles réapparaissent avec tout ce qu'elles avaient. C'est un piège si vous vouliez vous en débarrasser, et c'est pourquoi l'ordre des étapes ci-dessous compte.

Convertir en masse des produits simples en variables sans perdre les prix

  1. Sélectionnez les produits. Dans l'onglet Filtres (Filters), choisissez Type de produit (Product type) : Simple, ajoutez une catégorie, une étiquette ou tout autre critère qui isole les produits, puis appuyez sur Filtrer (Filter). Vous pouvez aussi cocher des produits dans le tableau ; les produits cochés ont priorité sur le filtre. Laissez l'interrupteur variations (variations) au-dessus du tableau désactivé : lorsqu'il est activé, les modifications en masse ignorent les produits parents.
  2. Changez le type. Ouvrez l'onglet Modification groupée (Bulk Edit), cochez la case à côté de Définir : type de produit (Set: product type), choisissez variable (Variable) et appuyez sur Effectuer la modification groupée (Do Bulk Edit). Pour quelques produits, modifiez directement la cellule Type dans le tableau ; la ligne est redessinée avec les cellules d'un produit variable.
  3. Ajoutez les attributs. Les variations sont construites à partir d'attributs globaux (Produits, Attributs) marqués Utilisé pour les variations (Used for variations) sur le produit. La manière de les ajouter en masse avec les bons indicateurs est décrite dans l'ajout d'attributs aux produits en masse.
  4. Créez tout de suite les variations avec Opérations groupées avancées sur les variations (Variations Advanced Bulk Operations), onglet Création (Creating) : sélectionnez les attributs et les termes, générez les combinaisons et appuyez sur Démarrer l'ajout en masse ! (Start BULK Adding!). La procédure complète se trouve dans la création de variations en masse.

C'est à l'étape 4 que le prix est conservé. Lorsque le générateur crée une variation, il y copie le prix régulier et le prix promo enregistrés sur le produit parent. Un produit qui était simple une minute plus tôt a encore ses anciens prix enregistrés, donc chaque nouvelle variation démarre avec le prix qu'avait le produit simple. Cela ne fonctionne qu'une fois par produit : dès qu'un produit a des variations, WooCommerce le synchronise et efface les champs de prix du parent, et les variations créées par une exécution ultérieure n'ont pas de prix. Seuls les prix sont copiés, pas une programmation de promotion : une promotion planifiée sur le produit simple pour le mois prochain démarre aussitôt sur ses variations ; replanifiez-la comme dans la programmation des prix promo en masse. Créez en une seule exécution toutes les combinaisons dont un produit a besoin, puis modifiez les prix qui diffèrent, par exemple un prix plus élevé pour le XXL, comme dans des prix différents pour des variations différentes. La raison pour laquelle la ligne du parent n'a plus de prix modifiable est expliquée dans champ de prix d'un produit variable désactivé.

Le stock suit la même logique. Les nouvelles variations sont créées sans gestion de stock propre. Si le produit simple gérait son stock, ce réglage reste sur le parent, et WooCommerce laisse chaque variation sans stock propre se vendre à partir de la quantité du parent : 50 unités de l'ancien produit deviennent 50 unités partagées par toutes les tailles. Pour compter chaque variation séparément, activez l'interrupteur variations (variations) et réglez Gérer le stock (Manage stock) sur Oui dans une exécution de Modification groupée, puis les quantités dans une seconde exécution ; la raison de ces deux exécutions est expliquée dans le statut de stock qui ne change pas.

Convertir en masse des produits variables en produits simples

L'ordre compte ici, car l'outil qui supprime les variations ne fonctionne que sur les produits encore variables :

  1. Filtrez les produits par Type de produit (Product type) : Variable, plus la catégorie ou l'étiquette qui les sélectionne. Si vous voulez conserver un prix, notez-le maintenant : activez l'interrupteur variations (variations) pour voir les prix des variations, puis désactivez-le de nouveau.
  2. Supprimez les variations dans Opérations groupées avancées sur les variations (Variations Advanced Bulk Operations), onglet Suppression (Deleting) : choisissez Supprimer toutes les variations des produits (Delete all products variations) et appuyez sur Démarrer la suppression (Start deleting). Lisez d'abord la ligne qui indique à quoi l'opération sera appliquée (will be applied to) : sans filtre ni produit coché, elle indique tous les produits de la boutique (all the products on the site). Les variations supprimées ne peuvent pas être restaurées et ne sont pas enregistrées dans l'Historique (History). La FAQ sur la suppression de toutes les variations montre cet écran.
  3. Changez le type : onglet Modification groupée (Bulk Edit), Définir : type de produit (Set: product type), Simple, Effectuer la modification groupée (Do Bulk Edit).
  4. Définissez les prix. Les cellules Tarif régulier (Regular price) et Tarif promo (Sale price) sont de nouveau modifiables. Filtrez par Type de produit (Product type) : Simple, plus la même catégorie, et définissez le prix de tous dans l'onglet Modification groupée, ou cellule par cellule lorsque les prix diffèrent.

Si vous changez d'abord le type, l'onglet Suppression ignore les produits car ils ne sont plus variables, et les variations restent en place. Les clients ne les voient jamais, mais leurs UGS comptent toujours : WooCommerce refuse une UGS que possède déjà un autre produit ou une autre variation, donc le produit simple ne peut pas reprendre l'UGS d'une de ses anciennes variations. Pour nettoyer, repassez les produits en Variable (les variations réapparaissent), supprimez les variations, puis repassez en Simple.

Conserver automatiquement le prix de la variation

Lorsque chaque produit variable n'a qu'une seule variation, ou que toutes ses variations partagent un même prix, un extrait de code ponctuel fait la conversion comme le fait l'éditeur WooCommerce et conserve le prix. Il charge chaque produit comme produit simple, copie le prix régulier, le prix promo et le stock de sa première variation, puis l'enregistre ; pendant cet enregistrement, WooCommerce change le type et supprime lui-même les variations. Faites d'abord une sauvegarde de la base de données, placez vos ID de produits dans la liste, ouvrez une fois /wp-admin/?woo_variable_to_simple=1 en tant qu'administrateur, puis retirez le code.

/*
 * One-off: convert variable products to simple products and keep the
 * price and stock of their first variation. WooCommerce deletes the variations.
 * Child theme functions.php or a code snippets plugin; remove after use.
 */
add_action( 'admin_init', function () {
    if ( empty( $_GET['woo_variable_to_simple'] ) || ! current_user_can( 'manage_woocommerce' ) ) {
        return;
    }

    $product_ids = array( 101, 102, 103 ); // IDs of the variable products

    foreach ( $product_ids as $product_id ) {
        $variable = wc_get_product( $product_id );
        if ( ! $variable || ! $variable->is_type( 'variable' ) ) {
            continue;
        }
        $children  = $variable->get_children();
        $variation = $children ? wc_get_product( $children[0] ) : null;

        $simple = new WC_Product_Simple( $product_id );
        if ( $variation ) {
            $simple->set_regular_price( $variation->get_regular_price( 'edit' ) );
            $simple->set_sale_price( $variation->get_sale_price( 'edit' ) );
            if ( $variation->get_manage_stock( 'edit' ) ) {
                $simple->set_manage_stock( true );
                $simple->set_stock_quantity( $variation->get_stock_quantity( 'edit' ) );
            } elseif ( ! $simple->get_manage_stock( 'edit' ) ) {
                $simple->set_stock_status( $variation->get_stock_status( 'edit' ) );
            }
        }
        $simple->save(); // WooCommerce switches the type and deletes the variations here
    }

    wp_die( 'Done. Remove the code now.' );
} );

Le produit conserve sa propre UGS. Vérifiez deux ou trois produits convertis dans la boutique avant de retirer le code.

Fusionner plusieurs produits simples en un seul produit variable

Souvent, les produits simples sont déjà les variations : T-shirt S, T-shirt M, T-shirt L. Les convertir n'aide pas, car chacun deviendrait un produit variable à part entière. Il vous faut un nouveau produit variable dont les variations reprennent le prix, l'UGS et le stock des anciens produits. L'éditeur en masse ne peut pas le faire seul : rien dans un produit n'indique quelle valeur d'attribut il représente, la taille n'est qu'un texte dans le titre.

Pour quelques groupes, faites-le dans l'éditeur : créez le produit variable, ajoutez l'attribut, générez les variations avec Opérations groupées avancées sur les variations, puis activez l'interrupteur variations (variations) et saisissez prix, UGS et stock dans les lignes de variations. Retirez l'UGS de l'ancien produit simple avant de la donner à une variation, car WooCommerce n'autorise pas deux fois la même UGS.

Pour de nombreux produits, l'extrait ci-dessous construit un produit variable à partir d'une liste d'ID de produits simples et de leurs valeurs d'attribut. Il copie la description, les catégories et l'image du premier produit vers le nouveau parent, crée une variation par produit simple avec ses prix, son UGS, son stock, son poids et son image, et passe les anciens produits en brouillon. Exécutez-le une fois par groupe : modifiez les trois réglages, ouvrez /wp-admin/?woo_merge_simple=1 en tant qu'administrateur, et vous arrivez dans l'éditeur du nouveau produit, qui reste un brouillon jusqu'à sa publication.

/*
 * One-off: merge simple products into one new variable product.
 * Child theme functions.php or a code snippets plugin; remove after use.
 */
add_action( 'admin_init', function () {
    if ( empty( $_GET['woo_merge_simple'] ) || ! current_user_can( 'manage_woocommerce' ) ) {
        return;
    }

    $title     = 'Classic T-shirt';                                // name of the new product
    $attribute = 'Size';                                           // what the variations differ by
    $map       = array( 101 => 'S', 102 => 'M', 103 => 'L' ); // simple product ID => value

    $first = wc_get_product( array_key_first( $map ) );
    if ( ! $first ) {
        wp_die( 'Check the product IDs.' );
    }

    $parent = new WC_Product_Variable();
    $parent->set_name( $title );
    $parent->set_status( 'draft' );
    $parent->set_description( $first->get_description( 'edit' ) );
    $parent->set_short_description( $first->get_short_description( 'edit' ) );
    $parent->set_category_ids( $first->get_category_ids( 'edit' ) );
    $parent->set_image_id( $first->get_image_id( 'edit' ) );

    $attr = new WC_Product_Attribute();
    $attr->set_name( $attribute );
    $attr->set_options( array_values( $map ) );
    $attr->set_visible( true );
    $attr->set_variation( true );
    $parent->set_attributes( array( $attr ) );
    $parent_id = $parent->save();

    foreach ( $map as $simple_id => $value ) {
        $simple = wc_get_product( $simple_id );
        if ( ! $simple || ! $simple->is_type( 'simple' ) ) {
            continue;
        }
        $sku = $simple->get_sku( 'edit' );

        // free the SKU and take the old product offline
        $simple->set_sku( '' );
        $simple->set_status( 'draft' );
        $simple->save();

        $variation = new WC_Product_Variation();
        $variation->set_parent_id( $parent_id );
        $variation->set_attributes( array( sanitize_title( $attribute ) => $value ) );
        $variation->set_regular_price( $simple->get_regular_price( 'edit' ) );
        $variation->set_sale_price( $simple->get_sale_price( 'edit' ) );
        $variation->set_sku( $sku );
        $variation->set_manage_stock( $simple->get_manage_stock( 'edit' ) );
        $variation->set_stock_quantity( $simple->get_stock_quantity( 'edit' ) );
        $variation->set_stock_status( $simple->get_stock_status( 'edit' ) );
        $variation->set_weight( $simple->get_weight( 'edit' ) );
        $variation->set_image_id( $simple->get_image_id( 'edit' ) );
        $variation->save();
    }

    WC_Product_Variable::sync( $parent_id );
    wp_safe_redirect( admin_url( 'post.php?post=' . $parent_id . '&action=edit' ) );
    exit;
} );

L'attribut est créé sur le produit lui-même, et non sous Produits, Attributs. Cela suffit pour que les variations fonctionnent. Si vous voulez filtrer la boutique avec lui ou le réutiliser sur d'autres produits, transformez-le ensuite en attribut global, comme décrit dans la conversion des attributs personnalisés en attributs globaux. Les anciennes URL des produits ne mènent plus nulle part ; redirigez-les vers le nouveau produit avec une extension de redirection ou une règle serveur.

Le changement de type est signalé, mais le produit reste simple

Après une modification dans la cellule Type, l'éditeur affiche Enregistré (Saved) et redessine la ligne avec des données relues depuis le serveur. Le message signifie seulement que la requête s'est terminée ; ce qui est réellement enregistré apparaît dans la ligne redessinée et dans l'éditeur de produit WooCommerce, dans la liste déroulante Données du produit (Product data). Comparez les deux avec la boutique :

  • Variable dans l'éditeur de produit, simple dans la boutique. La page de la boutique vient d'un cache de pages ou d'un CDN. Videz-le ; les modifications qui n'apparaissent pas côté boutique énumère les couches de cache à vérifier.
  • Modifié dans le tableau, redevenu simple après rechargement. Quelque chose sert d'anciennes données à l'administration. Les causes habituelles sont un cache serveur au niveau de l'hébergeur qui met aussi en cache /wp-admin/ ou admin-ajax.php, et des extensions de cache qui conservent les résultats de la base de données dans un cache d'objets persistant. Excluez l'administration et admin-ajax.php du cache de pages et videz le cache d'objets. Exclure le JavaScript et le CSS de l'extension de l'optimisation n'aide pas, car les données périmées se trouvent sur le serveur.
  • Certains produits d'une exécution de Modification groupée n'ont pas changé. Ils étaient en dehors du filtre ou de l'ensemble coché, ou l'interrupteur variations (variations) était activé et l'exécution a ignoré tous les produits parents.

Pour annuler un changement de type fait dans une cellule, annulez-le dans l'Historique (History). Une exécution de Modification groupée est différente : dans la version 2.2.4, annuler une exécution qui a changé le type de produit laisse le nouveau type en place. Annulez-la en sélectionnant de nouveau les mêmes produits et en lançant l'onglet Modification groupée avec l'ancien type.

Liste de contrôle

  • Sauvegardez la base de données : les variations supprimées et les exécutions de code ne peuvent pas être annulées.
  • De simple à variable : type, attributs, toutes les variations en une seule exécution, puis prix et stock par variation.
  • De variable à simple : d'abord les variations, puis le type, puis les prix ; l'interrupteur variations (variations) reste désactivé pour les changements de type.
  • Vérifiez un produit converti dans l'éditeur WooCommerce et dans la boutique avant de passer à la catégorie suivante.

Si une conversion se comporte différemment sur votre boutique, décrivez les étapes effectuées sur le forum d'assistance de BEAR.