Multi-Inventory-Bestände mit WP All Import aktualisieren
Neben unserer REST API können Sie auch WP All Import nutzen, um mehrere Lagerbestände in Ihre WooCommerce-Produkte zu importieren. Wir unterscheiden zwischen einer Bestandsdatei und mehreren Dateien.
Eine Bestandsdatei importieren
Für den Import einer Bestandsdatei nutzen Sie in WP All Import eigene Felder (Custom Fields). Setzen Sie den Namen auf „woocommerce_multi_inventory_inventories_stock“. Stellen Sie sicher, dass es ein Array ist, und legen Sie Schlüssel und Wert wie im Bild unten fest.
Hinweis: Der Schlüssel ist die ID des Lager-Terms.
Fügen Sie dann den folgenden Code in die Datei functions.php Ihres Child-Themes ein. So werden Lager-Terms und Taxonomien beim Import korrekt aktualisiert.
function welaunch_update_inventory_stock( $post_id, $meta_key, $meta_value) {
if($meta_key == "woocommerce_multi_inventory_inventories_stock") {
$product = wc_get_product($post_id);
if(!$product) {
return false;
}
if(!is_array($meta_value)) {
die('Inventories data must be an array');
}
$meta_value = array_filter($meta_value);
$productId = $product->get_id();
if($product->get_type() == "variation") {
$parentProduct = wc_get_product( $product->get_parent_id() );
if(!$parentProduct) {
return false;
}
$product = $parentProduct;
}
$existingTerms = get_the_terms($product->get_id(), 'inventories');
if(!empty($existingTerms)) {
$existingTerms = wp_list_pluck($existingTerms, 'term_id');
$existingTerms = array_combine($existingTerms, $existingTerms);
foreach($meta_value as $inventory_id => $inventory_stock) {
if(empty($inventory_stock) && isset($existingTerms[$inventory_id]) ) {
unset($existingTerms[$inventory_id]);
} elseif($inventory_stock > 0 && !isset($existingTerms[$inventory_id]) ) {
$existingTerms[$inventory_id] = $inventory_id;
}
}
} else {
$existingTerms = array_keys($meta_value);
}
wp_set_post_terms($productId, $existingTerms, 'inventories');
$product->save();
}
}
add_action( 'pmxi_update_post_meta', 'welaunch_update_inventory_stock', 10, 3 );
Mehrere Bestandsdateien importieren
Bei mehreren Importen und Bestandsdateien steuern Sie die Lager-ID manuell. Siehe Code unten. Passen Sie im Skript diese Parameter an:
- import id (die ID des WP-All-Import-Jobs)
- inventoryId (die ID des Lager-Terms unter Produkte > Inventories)
- stockKey (der Bestandsschlüssel in Ihrer XML- bzw. CSV-Datei)
function welaunch_update_inventory_stock( $post_id, $xml_node, $is_update ) {
// Retrieve the import ID.
$import_id = (int) wp_all_import_get_import_id();
$inventoryId = 0;
$stockKey = '';
// inventory import ONE
// import id 359 = inventory 5957
if ( $import_id == 359 ) {
$inventoryId = 5957;
$stockKey = 'stock_amount';
// inventory import TWO
// import id 335 = inventory 5956
} elseif ( $import_id == 335 ) {
$inventoryId = 5956;
$stockKey = 'free_stock';
}
if(empty($inventoryId)) {
return;
}
// Convert SimpleXml object to array for easier use.
$record = json_decode( json_encode( ( array ) $xml_node ), 1 );
if(!isset($record[$stockKey])) {
return;
}
$stock = (int) $record[$stockKey];
$product = wc_get_product($post_id);
if(!$product) {
return false;
}
$existingInventoryStock = $product->get_meta('woocommerce_multi_inventory_inventories_stock');
if(empty($existingInventoryStock)) {
$existingInventoryStock = array(
$inventoryId => $stock
);
} else {
$existingInventoryStock[$inventoryId] = $stock;
}
// var_dump($existingInventoryStock);
// die();
$newTotalFrontendStock = 0;
foreach($existingInventoryStock as $inventoryId => $stockAmount) {
$frontend = get_term_meta($inventoryId, 'woocommerce_multi_inventory_frontend', true);
if($frontend) {
$newTotalFrontendStock += (int) $stockAmount;
}
}
$product->set_stock_quantity($newTotalFrontendStock);
$product->update_meta_data('woocommerce_multi_inventory_inventories_stock', $existingInventoryStock);
$product->save();
// Update Terms
$productToGetTermsFrom = $product;
$productId = $product->get_id();
if($product->get_type() == "variation") {
$productToGetTermsFrom = wc_get_product( $product->get_parent_id() );
if(!$productToGetTermsFrom) {
return false;
}
}
$existingTerms = get_the_terms($productToGetTermsFrom->get_id(), 'inventories');
if(!empty($existingTerms)) {
$existingTerms = wp_list_pluck($existingTerms, 'term_id');
$existingTerms = array_combine($existingTerms, $existingTerms);
foreach($existingInventoryStock as $inventory_id => $inventory_stock) {
if(empty($inventory_stock) && isset($existingTerms[$inventory_id]) ) {
unset($existingTerms[$inventory_id]);
} elseif($inventory_stock > 0 && !isset($existingTerms[$inventory_id]) ) {
$existingTerms[$inventory_id] = $inventory_id;
}
}
} else {
$existingTerms = array_keys($existingInventoryStock);
}
wp_set_post_terms($productToGetTermsFrom->get_id(), $existingTerms, 'inventories');
$product->save();
}
add_action( 'pmxi_saved_post', 'welaunch_update_inventory_stock', 10, 3 );
WP All Import überschreibt standardmäßig alle eigenen Meta-Felder. Um das zu vermeiden, wählen Sie: alle Metas aktualisieren außer „woocommerce_multi_inventory_inventories_stock“. Siehe Beispielkonfiguration unten.
