在使用CSV更新产品库存时,如何使用相同的SKU前缀更新所有WooCommerce产品变体?



在我的WooCommerce商店中,有几种情况下,我用不同的名称和描述显示相同的可变产品(出于SEO原因)。由于WooCommerce不允许对多个产品使用相同的SKU,所以我在重复的产品后面加上了后缀"_;_2_;"、"_;_3_;"等。例如,如果主要变量产品具有SKU"12345678";对于变体,复制产品将具有SKU"12345678_2";对于相同的变异。我还为所有重复的产品设置了一个具有相同值的自定义字段' tri_producits ',以便轻松找到它们。

现在我想在从CSV文件更新价格时更新所有重复产品的库存和价格(使用WooCommerce products ->导入按钮)。所以我写了下面的代码:

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 );

但是它不起作用。它可以正确地找到重复的产品,但是当代码编辑并保存它们时,产品不会改变。我应该在代码中修改什么?

当使用CSV更新产品库存和价格时,我最终使用'-2' SKU后缀更新重复的产品变化:

function update_imported_product($object, $data)
{
if ($object->get_type() === 'variation'){
$product_id = wp_get_post_parent_id($object->get_id());
}
else
{
$product_id = $object->get_id();    
}


if(isset($product_id))
{
$sku_in = get_post_meta($product_id, '_sku', true);

// Search and update variations with suffix -2      
$args = array(
'post_type'  => 'product_variation',
'meta_query' => array(
array(
'key'   => '_sku',
'value' => $sku_in.'-2',
)));            
$variations = get_posts( $args);

if(!empty($variations))
{
if(count($variations) > 0)
{
foreach ( $variations as $variation ) 
{                       

// Get input product data                   
if ($object->get_type() === 'variation'){
$pr=new WC_Product_Variation($object->get_id());
}
else{
$pr=new WC_Product($object->get_id());
}                   

// Update variation
$product_variation = new WC_Product_Variation($variation);      
$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_action( 'woocommerce_product_import_inserted_product_object', 'update_imported_product', 10, 2 );

最新更新