WooCommerce einfache Produkte in Masse in variable umwandeln (und zurück)
Wenn Sie in WooCommerce einfache Produkte in Masse in variable Produkte umwandeln, ändern Sie ein einziges Feld: den Produkttyp. Im Bulk-Editor dauert das eine Minute, selbst bei Tausenden von Produkten. Ob die umgewandelten Produkte weiterhin verkauft werden können, hängt von allem ab, was um dieses Feld herum liegt: Der Typ ist nur eine Bezeichnung, und die Preise, der Lagerbestand, die Attribute und die Variationen, die ein variables Produkt braucht, kommen nicht mit. Im Folgenden steht, was in beiden Richtungen mit jedem Feld passiert, in welcher Reihenfolge Sie vorgehen, damit Ihre Preise erhalten bleiben, wie Sie mehrere einfache Produkte zu einem variablen Produkt zusammenführen und warum eine Typänderung manchmal nicht hält.
Was eine Änderung des Produkttyps bewirkt und was sie zurücklässt
WooCommerce speichert den Produkttyp als Begriff einer versteckten Taxonomie, product_type, mit den Begriffen simple, grouped, external und variable. Die Spalte Typ (Type) der Produkttabelle und das Feld Produkttyp (product type) im Massenbearbeitung (Bulk Edit)-Tab setzen diesen Begriff und nichts sonst. Preise, Lagerbestand, SKU und Attribute bleiben genau so gespeichert, wie sie waren, und was das bedeutet, hängt von der Richtung ab:
| Einfach zu variabel | Variabel zu einfach | |
|---|---|---|
| Regulärer Preis und Angebotspreis | Bleiben am Produkt gespeichert, aber WooCommerce verkauft ein variables Produkt zu den Preisen seiner Variationen; die Preiszellen der Zeile werden schreibgeschützt | Leer: WooCommerce hält die Preise eines variablen Produkts an seinen Variationen, nicht am Produkt |
| Variationen | Keine, das Produkt lässt sich daher erst in den Warenkorb legen, wenn es welche bekommt | Nicht gelöscht: Sie bleiben ausgeblendet in der Datenbank, mit ihren Preisen, Beständen und SKUs |
| Lagerbestand | Die Lagerverwaltung bleibt am Produkt; Variationen ohne eigenen Bestand verwenden dessen Menge | Die am übergeordneten Produkt gespeicherten Bestandseinstellungen werden zum Bestand des Produkts |
| SKU | Bleibt am Produkt | Bleibt am Produkt; die ausgeblendeten Variationen behalten ihre eigene |
Die zweite Zeile ist der wichtigste Unterschied zum WooCommerce-Produkteditor. Wenn Sie dort ein Produkt von „Variabel“ auf einen anderen Typ umstellen, löscht WooCommerce beim Speichern die Variationen. Der Bulk-Editor ändert nur den Typ-Begriff, die Variationen bleiben also erhalten. Das ist nützlich, wenn Sie zurückwechseln, denn sie erscheinen mit allem wieder, was sie hatten. Es ist eine Falle, wenn Sie sie loswerden wollten, weshalb die Reihenfolge der Schritte unten wichtig ist.
Einfache Produkte in Masse in variable umwandeln, ohne Preise zu verlieren
- Produkte auswählen. Wählen Sie im Tab Filter (Filters) unter Produkttyp „Einfaches Produkt“, ergänzen Sie eine Kategorie, ein Schlagwort oder ein anderes Kriterium, das die Produkte eingrenzt, und klicken Sie auf Filtern (Filter). Sie können auch Produkte in der Tabelle markieren; markierte Produkte haben Vorrang vor dem Filter. Lassen Sie den Schalter Variationen (variations) über der Tabelle ausgeschaltet: Solange er eingeschaltet ist, überspringen Massenbearbeitungen übergeordnete Produkte.
- Den Typ ändern. Öffnen Sie den Tab Massenbearbeitung, haken Sie das Kontrollkästchen neben Setzen: Produkttyp (Set: product type) an, wählen Sie Variables Produkt (Variable) und klicken Sie auf Massenbearbeitung durchführen (Do Bulk Edit). Bei einigen wenigen Produkten ändern Sie die Zelle Typ direkt in der Tabelle; die Zeile wird mit den Zellen eines variablen Produkts neu gezeichnet.
- Die Attribute hinzufügen. Variationen werden aus globalen Attributen (Produkte → Attribute) aufgebaut, die am Produkt als Für Varianten verwendet (Used for variations) markiert sind. Wie Sie sie in Masse mit den richtigen Markierungen hinzufügen, steht unter Attribute in Masse zu Produkten hinzufügen.
- Die Variationen sofort erstellen mit Erweiterte Massenvorgänge für Variationen (Variations Advanced Bulk Operations), Tab Erstellen (Creating): Wählen Sie die Attribute und Begriffe aus, erzeugen Sie die Kombinationen und klicken Sie auf Massenhinzufügen starten! (Start BULK Adding!). Das vollständige Vorgehen steht unter Variationen in Masse erstellen.
Schritt 4 ist der Punkt, an dem der Preis erhalten bleibt. Wenn der Generator eine Variation erstellt, kopiert er den am übergeordneten Produkt gespeicherten regulären Preis und Angebotspreis in sie. Ein Produkt, das vor einer Minute noch einfach war, hat seine alten Preise noch gespeichert, sodass jede neue Variation mit dem Preis beginnt, den das einfache Produkt hatte. Das funktioniert einmal pro Produkt: Sobald ein Produkt Variationen hat, synchronisiert WooCommerce es und leert die eigenen Preisfelder des übergeordneten Produkts, und Variationen, die ein späterer Lauf erstellt, erhalten keinen Preis. Kopiert werden nur die Preise, kein Angebotszeitplan: Ein für nächsten Monat am einfachen Produkt geplantes Angebot beginnt bei seinen Variationen sofort, planen Sie es daher neu, wie unter Angebotspreise in Masse planen beschrieben. Erstellen Sie alle Kombinationen, die ein Produkt braucht, in einem Lauf und ändern Sie dann die Preise, die abweichen, zum Beispiel einen höheren Preis für XXL, wie unter unterschiedliche Preise für verschiedene Variationen gezeigt. Warum die übergeordnete Zeile ab jetzt keinen bearbeitbaren Preis mehr hat, erklärt Preisfeld eines variablen Produkts deaktiviert.
Beim Lagerbestand gilt dieselbe Logik. Neue Variationen werden ohne eigene Lagerverwaltung erstellt. Hat das einfache Produkt seinen Bestand verwaltet, bleibt diese Einstellung am übergeordneten Produkt, und WooCommerce lässt jede Variation ohne eigenen Bestand aus der Menge des übergeordneten Produkts verkaufen: Aus 50 Stück des alten Produkts werden 50 Stück, die sich alle Größen teilen. Um jede Variation getrennt zu zählen, schalten Sie den Schalter Variationen ein und setzen in einem Lauf des Massenbearbeitung-Tabs Lagerbestand verwalten (Manage stock) auf „Ja“, danach in einem zweiten Lauf die Mengen; der Grund für zwei Läufe steht unter Lagerstatus ändert sich nicht.
Variable Produkte in Masse in einfache umwandeln
Die Reihenfolge ist hier wichtig, denn das Werkzeug, das Variationen löscht, funktioniert nur bei Produkten, die noch variabel sind:
- Filtern Sie die Produkte nach Produkttyp „Variables Produkt“ plus der Kategorie oder dem Schlagwort, die sie auswählen. Wenn Sie einen Preis behalten wollen, notieren Sie ihn jetzt: Schalten Sie den Schalter Variationen ein, um die Variationspreise zu sehen, und danach wieder aus.
- Löschen Sie die Variationen unter Erweiterte Massenvorgänge für Variationen, Tab Löschen (Deleting): Wählen Sie Alle Produktvariationen löschen (Delete all products variations) und klicken Sie auf Löschen starten (Start deleting). Lesen Sie zuerst die Zeile mit wird angewendet auf (will be applied to), die angibt, worauf der Vorgang wirkt: Ist nichts gefiltert oder markiert, steht dort alle Produkte auf der Website (all the products on the site). Gelöschte Variationen lassen sich nicht wiederherstellen und werden nicht im Verlauf erfasst. Die FAQ zum Entfernen aller Variationen zeigt den Bildschirm.
- Ändern Sie den Typ: Tab Massenbearbeitung, Setzen: Produkttyp, Einfaches Produkt (Simple), Massenbearbeitung durchführen.
- Legen Sie die Preise fest. Die Zellen Regulärer Preis (Regular price) und Angebotspreis (Sale price) sind wieder bearbeitbar. Filtern Sie nach Produkttyp „Einfaches Produkt“ plus derselben Kategorie und setzen Sie den Preis für alle im Massenbearbeitung-Tab, oder Zelle für Zelle, wo die Preise abweichen.
Ändern Sie zuerst den Typ, überspringt der Tab Löschen die Produkte, weil sie nicht mehr variabel sind, und die Variationen bleiben zurück. Kunden sehen sie nie, aber ihre SKUs zählen weiterhin: WooCommerce lehnt eine SKU ab, die ein anderes Produkt oder eine andere Variation bereits hat, das einfache Produkt kann also nicht die SKU einer seiner früheren Variationen übernehmen. Zum Aufräumen stellen Sie die Produkte wieder auf „Variables Produkt“ um (die Variationen erscheinen wieder), löschen die Variationen und stellen erneut auf „Einfaches Produkt“ um.
Den Preis der Variation automatisch behalten
Hat jedes variable Produkt nur eine Variation oder teilen alle seine Variationen einen Preis, erledigt ein einmaliges Snippet die Umwandlung so, wie es der WooCommerce-Editor tut, und behält den Preis. Es lädt jedes Produkt als einfaches Produkt, kopiert regulären Preis, Angebotspreis und Bestand seiner ersten Variation und speichert es; beim Speichern ändert WooCommerce selbst den Typ und löscht die Variationen. Sichern Sie zuerst die Datenbank, tragen Sie Ihre Produkt-IDs in die Liste ein, öffnen Sie einmal als Administrator /wp-admin/?woo_variable_to_simple=1 und entfernen Sie danach den 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.' );
} );
Das Produkt behält seine eigene SKU. Prüfen Sie zwei oder drei umgewandelte Produkte im Shop, bevor Sie den Code entfernen.
Mehrere einfache Produkte zu einem variablen Produkt zusammenführen
Oft sind die einfachen Produkte bereits die Variationen: T-Shirt S, T-Shirt M, T-Shirt L. Sie umzuwandeln hilft nicht, denn jedes würde ein eigenes variables Produkt. Sie brauchen ein neues variables Produkt, dessen Variationen Preis, SKU und Bestand der alten Produkte übernehmen. Der Bulk-Editor kann das nicht von selbst: Nichts an einem Produkt sagt, für welchen Attributwert es steht, die Größe ist nur Text im Titel.
Bei wenigen Gruppen erledigen Sie das im Editor: Erstellen Sie das variable Produkt, fügen Sie das Attribut hinzu, erzeugen Sie die Variationen mit den Erweiterten Massenvorgängen für Variationen, schalten Sie dann den Schalter Variationen ein und tragen Sie Preise, SKUs und Bestand in die Variationszeilen ein. Entfernen Sie die SKU vom alten einfachen Produkt, bevor Sie sie einer Variation geben, da WooCommerce dieselbe SKU nicht zweimal erlaubt.
Bei vielen Produkten baut das folgende Snippet aus einer Liste einfacher Produkt-IDs und ihrer Attributwerte ein variables Produkt auf. Es kopiert Beschreibung, Kategorien und Bild des ersten Produkts in das neue übergeordnete Produkt, erstellt pro einfachem Produkt eine Variation mit dessen Preisen, SKU, Bestand, Gewicht und Bild und setzt die alten Produkte auf „Entwurf“. Führen Sie es einmal pro Gruppe aus: Passen Sie die drei Einstellungen an, öffnen Sie als Administrator /wp-admin/?woo_merge_simple=1, und Sie landen im Editor des neuen Produkts, das ein Entwurf bleibt, bis Sie es veröffentlichen.
/*
* 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;
} );
Das Attribut wird am Produkt selbst erstellt, nicht unter Produkte → Attribute. Das reicht, damit die Variationen funktionieren. Möchten Sie den Shop danach filtern oder es bei anderen Produkten wiederverwenden, wandeln Sie es anschließend in ein globales Attribut um, wie unter benutzerdefinierte Attribute in globale umwandeln beschrieben. Die alten Produkt-URLs führen nun ins Leere; leiten Sie sie mit einem Redirect-Plugin oder einer Server-Regel auf das neue Produkt um.
Die Typänderung wird gemeldet, aber das Produkt bleibt einfach
Nach einer Änderung in der Zelle Typ zeigt der Editor Gespeichert (Saved) und zeichnet die Zeile mit vom Server zurückgelesenen Daten neu. Die Meldung bedeutet nur, dass die Anfrage abgeschlossen ist; was tatsächlich gespeichert ist, zeigen die neu gezeichnete Zeile und der WooCommerce-Produkteditor im Dropdown Produktdaten (Product data). Vergleichen Sie beides mit dem Shop:
- Im Produkteditor variabel, im Shop einfach. Die Shop-Seite stammt aus einem Seiten-Cache oder einem CDN. Leeren Sie ihn; Änderungen erscheinen nicht im Frontend listet die Cache-Schichten auf, die Sie prüfen sollten.
- In der Tabelle geändert, nach dem Neuladen wieder einfach. Etwas liefert dem Admin-Bereich alte Daten. Übliche Ursachen sind ein Server-Cache auf Hosting-Ebene, der auch
/wp-admin/oderadmin-ajax.phpzwischenspeichert, und Caching-Plugins, die Datenbankergebnisse in einem persistenten Objekt-Cache halten. Nehmen Sie den Admin-Bereich undadmin-ajax.phpvom Seiten-Caching aus und leeren Sie den Objekt-Cache. Das Ausschließen des JavaScripts und CSS des Plugins von der Optimierung hilft nicht, denn die veralteten Daten liegen auf dem Server. - Einige Produkte eines Laufs im Massenbearbeitung-Tab haben sich nicht geändert. Sie lagen außerhalb des Filters oder der markierten Menge, oder der Schalter Variationen war eingeschaltet und der Lauf hat alle übergeordneten Produkte übersprungen.
Um eine in einer Zelle vorgenommene Typänderung rückgängig zu machen, setzen Sie sie im Verlauf (History) zurück. Ein Lauf im Massenbearbeitung-Tab ist anders: In Version 2.2.4 lässt das Zurücksetzen eines Laufs, der den Produkttyp geändert hat, den neuen Typ bestehen. Machen Sie ihn rückgängig, indem Sie dieselben Produkte erneut auswählen und den Massenbearbeitung-Tab mit dem alten Typ ausführen.
Checkliste
- Sichern Sie die Datenbank: Gelöschte Variationen und Code-Läufe lassen sich nicht zurückrollen.
- Einfach zu variabel: Typ, Attribute, alle Variationen in einem Lauf, danach Preise und Bestand pro Variation.
- Variabel zu einfach: zuerst die Variationen, dann der Typ, dann die Preise; der Schalter Variationen bleibt bei Typänderungen ausgeschaltet.
- Prüfen Sie ein umgewandeltes Produkt im WooCommerce-Editor und im Shop, bevor Sie die nächste Kategorie angehen.
Verhält sich eine Umwandlung in Ihrem Shop anders, beschreiben Sie im BEAR-Support-Forum die Schritte, die Sie ausgeführt haben.