Der richtige Weg, programmatisch ein WooCommerce-Produkt zu erzeugen

foto von tezos auf unsplash

Beim Anlegen eines Produkt in einer mehrsprachigen Multisite-Umgebung sollen beim Speichern eines neuen Produktes gleich auch die Produkte in den anderen Sprachen mit angelegt werden. Das eindeutige Erkennungszeichen jedes Produkts ist die Artikelnummer (SKU). Gibt es die SKU bereits in der anderen Sprache, wird das Produkt nur upgedated, ansonsten neu angelegt und sprachlich verknüpft.

SKU ist ein Wert in den Postmeta-Daten, und dort als Key Value Pair abgelegt. Die Artikelnummer kann also auch einfach als add_post_meta( $id, '_sku', {Artikelnummer}); angelegt werden (würde man meinen). Über die Funktion wc_get_product_id_by_sku( $sku ); käme man dann an die ID des Produkts…

Ja, also – NEIN. So schön die Abhandlung darüber war, die ich gelesen hatte, wie man mit wp_insert_post() auf programmatischem Weg Produkte erzeugt – als Ergebnis bekam ich mit dieser Methode immer auch ein Schattenprodukt. Dieses hatte zwar die richtige Artikelnummer, war aber falsch zugeordnet, und die Syncronisierung war unvollständig. Auch wenn bereits eine Übersetzung mit korrekter SKU vorhanden war (und dann das Produkt ja gar nicht mehr neu erzeugt hätte werden sollen), bekam ich beim nächsten Speichern ein weiteres neues Produkt. Und dann noch eins. Und alle hatten dieselbe Artikelnummer.

$p_id = wc_get_product_id_by_sku( $sku );

Nur wenn hier keine ID ermittelt werden kann, sollte ein neues Produkt generiert werden. Das funktionierte offenbar nicht zuverlässig, wenn ein Produkt mit wp_insert_post() erzeugt worden war. Nachdem ich neue Produkte new WC_Product() – Objekt anlegte, funktionierte es auch genau so. Gab es das Produkt in einer anderen Sprache, und es änderten sich nur Daten, wurde es in allen Sprachen upgedated, ansonsten neu erzeugt.

if ( !$p_id ) {
	$new_product = new WC_Product();
	$new_product->set_name($product_title);
	$new_product->set_status('private');
	$new_product->set_sku($sku);
	$new_product->set_slug($product_slug);
	$p_id = $new_product->save();
}

Bitte Kommentarfunktion nicht für Supportanfragen nutzen. Dem kann hier nicht entsprochen werden. Die Angabe einer E-Mail-Adresse und eines Namens ist nicht erforderlich. Einen (Spitz)-Namen zu nennen wäre aber doch nett.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Hinweis: Sowohl angegebener Name als auch E-Mail-Adresse (beides ist optional, dafür werden alle Kommentare vor Veröffentlichung geprüft) werden dauerhaft gespeichert. Du kannst jeder Zeit die Löschung Deiner Daten oder / und Kommentare einfordern, direkt über dieses Formular (wird nicht veröffentlicht, und im Anschluss gelöscht), und ich werde das umgehend erledigen. – Mit hinterlassenen Kommentaren hinterlegte IP-Adressen werden nach zwei Monaten automatisch gelöscht

publicly queryable