woocommerce_update_product钩子首次保存产品无法获取wcpv_product_vendors术语问题
问题原因
wcpv_product_vendors 是 WC Vendors 插件注册的自定义分类法,它的关联数据保存动作执行时机晚于 WooCommerce 核心自带的 product_cat 分类。你当前设置的 woocommerce_update_product 钩子优先级为50,执行时机早于 WC Vendors 保存供应商分类数据的时机,首次保存草稿时供应商关联还未写入数据库,所以 get_the_terms 返回空,第二次保存时数据已经在上次操作中写入,因此可以正常读取。
此外你现有代码存在两个明显问题:
- 回调函数没有接收钩子传入的产品ID参数,
$product_id为未定义变量,会导致读取逻辑异常 - 没有对
get_the_terms的返回结果做错误判断,当查询出错返回WP_Error对象时,后续逻辑会报错
解决方法
调整钩子优先级到1000(优先级数值越大执行越晚),同时修正代码问题即可,修改后参考代码如下:
// 调整优先级到1000,确保晚于WC Vendors的分类保存动作,同时声明接收1个参数 add_action( 'woocommerce_update_product', [$this, 'dcgsql_update_product'], 1000, 1); public function dcgsql_update_product( $product_id ){ $vendors = ''; $get_vendors = get_the_terms($product_id, 'wcpv_product_vendors'); // 增加WP_Error判断,同时提前初始化数组避免警告 if (!empty($get_vendors) && !is_wp_error($get_vendors)) { $vendorsarray = []; foreach ($get_vendors as $vendor) { $vendorsarray[] = $vendor->term_id; } $vendors = implode(',',$vendorsarray); } // 后续处理$vendors的逻辑 }
如果调整优先级后仍然无法读取,可以换用 save_post_product 钩子,该钩子在所有产品关联数据(包括自定义分类)写入完成后触发,兼容性更好:
add_action( 'save_post_product', [$this, 'dcgsql_update_product'], 20, 1);
内容的提问来源于stack exchange,提问作者Alex Knopp
相关产品推荐
相关产品推荐

