woocommerce offtopic – Jak zaktualizować wszystkie produkty z tymi samymi prefiksami SKU podczas aktualizacji zapasów za pomocą CSV?
![woocommerce offtopic – Jak zaktualizować wszystkie produkty z tymi samymi prefiksami SKU podczas aktualizacji zapasów za pomocą CSV?](https://oen.pl/wp-content/uploads/2023/01/apple-touch-icon@2.png)
W moim sklepie WooCommerce jest kilka przypadków, w których pokazuję ten sam zmienny produkt z różnymi nazwami i opisami (ze względów SEO). Ponieważ WooCommerce nie pozwala na używanie tego samego SKU dla kilku produktów, do zduplikowanych produktów dodaję sufiks „_2”, „_3” itp. Na przykład, jeśli główny produkt zmienny ma SKU „12345678” dla odmiany, zduplikowany produkt będzie miał SKU „12345678_2” dla tej samej odmiany. Ustawiłem również niestandardowe pole „tri_produits” z tą samą wartością dla wszystkich zduplikowanych produktów, aby łatwo je znaleźć.
Teraz chcę zaktualizować zapasy i ceny wszystkich zduplikowanych produktów, gdy aktualizuję cenę z pliku CSV (za pomocą przycisku Produkty WooCommerce -> Importuj). Napisałem więc poniższy kod:
function update_imported_product($object, $data)
{
// Update variable products with same SKU + suffix.
if ($object->get_type() === 'variation'){
$product_id = wp_get_post_parent_id($object->get_id());
}
else
{
$product_id = $object->get_id();
}
// Looking for other products with same value for custom field tri_produits (these are the duplicated products)
if(isset($product_id))
{
$tri_produits = get_post_meta($product_id, 'tri_produits', true);
$ugs = get_post_meta($product_id, '_sku', true); //$object->get_sku();
if(isset($tri_produits))
{
$args = array(
'post_type' => 'product',
'meta_query' => array(
array(
'key' => 'tri_produits',
'value' => $tri_produits,
)
)
);
// Get the products
$products = get_posts( $args);
if(!empty($products))
{
if(count($products) > 1)
{
foreach ( $products as $product )
{
// Check if this is another product
if($product->ID != $product_id)
{
// Loop on variations and check if same sku prefix
$product_variations = get_posts( [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'fields' => 'ids',
'post_parent' => $product->ID,
] );
if ( !empty( $product_variations ) ) {
foreach ( $product_variations as $product_variation_id ) {
$sku = get_post_meta( $product_variation_id, '_sku', true );
if(str_starts_with($sku,$ugs.'_') || str_starts_with($sku,$ugs.'-'))
{
// Update stock
$product_variation = new WC_Product_Variation($product_variation_id);
if ($object->get_type() === 'variation'){
$pr=new WC_Product_Variation($object->get_id());
}
else{
$pr=new WC_Product($object->get_id());
}
/*if($pr->get_stock_quantity() != $product_variation->get_stock_quantity())*/
$product_variation->set_stock_quantity($pr->get_stock_quantity());
$product_variation->set_weight($pr->get_weight());
$product_variation->set_regular_price($pr->get_regular_price());
$product_variation->save();
}
}
}
}
}
}
}
}
}
return $object;
}
//add_filter('woocommerce_product_import_pre_insert_product_object', 'update_product_at_import', 10, 2);
add_action( 'woocommerce_product_import_inserted_product_object', 'update_imported_product', 10, 2 );
Ale to nie działa. Znajduje zduplikowane produkty poprawnie, ale kiedy kod edytuje i zapisuje je, produkty się nie zmieniają. Co powinienem zmienić w moim kodzie?