On my WooCommerce store, there are several cases where I show a same variable product with different names and descriptions (for SEO reasons). As WooCommerce doesn't allow to use a same SKU for several products, I add a suffix "_2", "_3", etc to the duplicated products. For example if the main variable product has a SKU "12345678" for a variation, the duplicated product will have a SKU "12345678_2" for the same variation. I also set a custom field 'tri_produits' with the same value for all duplicated products to find them easily.
Now I want to update the stock and price of all duplicated products when I update the price from a CSV file (using WooCommerce Products -> Import button). So I have written the below code:
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 );
But it doesn't work. It finds the duplicate products correctly but when the code edits and saves them, the products don't change. What should I change in my code?