CSV更新WooCommerce库存时,同SKU前缀变体同步代码失效如何修复
WooCommerce CSV导入同步副本商品问题修复方案
你的代码能找到副本商品但无法生效,核心问题出在SKU逻辑错误和对象处理冗余,以下是具体修改点和修正后的代码:
主要问题分析
- SKU获取错误:导入变体时,你错误获取了父商品的SKU,而非当前变体的SKU,导致无法匹配副本中对应的变体(副本变体SKU是主变体SKU加后缀)。
- 冗余对象实例化:重复创建
$pr对象,而传入的$object已经是当前导入的商品/变体对象,直接使用即可避免状态不一致。 - 缺失库存状态同步:仅更新库存数量但未同步状态,可能导致前端显示与实际库存不符。
- 查询条件不严谨:未限定商品发布状态,可能处理草稿或已删除的无效商品。
修正后的代码
function update_imported_product($object, $data) { // 仅处理可变商品和变体 if (!in_array($object->get_type(), ['variable', 'variation'])) { return $object; } $current_sku = $object->get_sku(); // 无SKU的商品直接跳过 if (empty($current_sku)) { return $object; } $product_id = $object->get_type() === 'variation' ? wp_get_post_parent_id($object->get_id()) : $object->get_id(); $tri_produits = get_post_meta($product_id, 'tri_produits', true); if (empty($tri_produits)) { return $object; } // 查询所有同组的已发布商品 $args = array( 'post_type' => 'product', 'post_status' => 'publish', 'meta_query' => array( array( 'key' => 'tri_produits', 'value' => $tri_produits, ) ), 'posts_per_page' => -1, ); $products = get_posts($args); if (empty($products) || count($products) <= 1) { return $object; } foreach ($products as $product) { // 跳过当前导入的商品 if ($product->ID === $product_id) { continue; } // 获取副本商品的所有变体 $product_variations = get_posts([ 'post_type' => 'product_variation', 'posts_per_page' => -1, 'fields' => 'ids', 'post_parent' => $product->ID, 'post_status' => 'publish', ]); if (empty($product_variations)) { continue; } foreach ($product_variations as $variation_id) { $variation_sku = get_post_meta($variation_id, '_sku', true); // 匹配副本变体SKU:主SKU+_/-后缀 if (str_starts_with($variation_sku, $current_sku . '_') || str_starts_with($variation_sku, $current_sku . '-')) { $target_variation = new WC_Product_Variation($variation_id); // 同步库存数量与状态 $stock_qty = $object->get_stock_quantity(); $target_variation->set_stock_quantity($stock_qty); $target_variation->set_stock_status($stock_qty > 0 ? 'instock' : 'outofstock'); // 同步重量与常规价格 $target_variation->set_weight($object->get_weight()); $target_variation->set_regular_price($object->get_regular_price()); // 保存修改 $target_variation->save(); } } } return $object; } add_action('woocommerce_product_import_inserted_product_object', 'update_imported_product', 10, 2);
额外说明
- 建议CSV导入时直接针对变体SKU更新,因为可变父商品通常不会设置SKU,匹配更准确。
- 若需支持父商品导入时同步所有变体,可添加遍历父商品变体的逻辑,针对每个变体单独处理匹配。
内容的提问来源于stack exchange,提问作者JulienVan
相关产品推荐
相关产品推荐

