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();
}
Schreibe einen Kommentar