You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 01:24:04