WooCommerce商品SKU更新失败:多种代码尝试均无效求助
解决WooCommerce商品SKU无法通过代码更新的问题
核心问题分析
你的代码存在两个关键问题:
- 使用了过时的钩子:
woocommerce_process_product_meta在WooCommerce 3.0+版本中已被官方逐步替代,该钩子的执行时机可能早于WooCommerce自身的产品最终保存逻辑,导致你的SKU更新被覆盖。 - 调用
set_sku()后未执行保存操作:WooCommerce的CRUD对象(如WC_Product)修改属性后,必须调用save()方法才能将更改持久化到数据库。
修复后的代码实现
使用官方推荐的woocommerce_admin_process_product_object钩子,直接操作产品对象,确保SKU更改生效:
add_action( 'woocommerce_admin_process_product_object', 'save_leadlovers_custom_fields_and_update_sku' ); function save_leadlovers_custom_fields_and_update_sku( $product ) { // 保存自定义字段(保留原有逻辑) if ( isset( $_POST['_leadlovers_integration_check'] ) ) { $product->update_meta_data( '_leadlovers_integration_check', esc_attr( $_POST['_leadlovers_integration_check'] ) ); } if ( isset( $_POST['_leadlovers_integration_product'] ) ) { $selected_value = esc_attr( $_POST['_leadlovers_integration_product'] ); $product->update_meta_data( '_leadlovers_integration_product', $selected_value ); // 更新SKU并绑定到产品对象 $product->set_sku( $selected_value ); } // 强制保存所有更改(包括自定义字段和SKU) $product->save(); }
额外说明
- 为什么不直接用
update_post_meta修改_sku?
WooCommerce的产品数据(包括SKU)现在通过CRUD对象统一管理,直接修改元数据可能绕过产品的验证逻辑,且后续的产品保存流程大概率会覆盖该值。 - 钩子优先级调整(可选)
如果仍然出现SKU被覆盖的情况,可以为钩子指定更高的优先级(如100),确保你的代码最后执行:add_action( 'woocommerce_admin_process_product_object', 'save_leadlovers_custom_fields_and_update_sku', 100 );
内容的提问来源于stack exchange,提问作者Daniel Weber
相关产品推荐
相关产品推荐

