Woocommerce create_product_cat钩子无法获取商品分类thumbnail_id问题咨询
问题根因
这是典型的钩子触发时序问题:create_product_cat 是WordPress核心在商品分类term创建完成后立刻触发的,此时Woocommerce还未完成display_type、thumbnail_id这类自定义分类字段的元数据写入操作,自然读取不到对应值。而edited_product_cat触发时元数据已经写入完成,所以可以正常获取。
解决方案
方案1(更推荐):使用Woocommerce原生后保存钩子
直接用woocommerce_after_product_cat_save钩子替换原来的两个钩子即可,这个钩子是Woocommerce在所有分类数据(包括自定义元数据)全部写入数据库后才触发的,新建、更新分类场景通用,不需要额外适配两个钩子。
修改后的代码参考:
function loader() { add_action('woocommerce_after_product_cat_save', [$this, 'onCategoryCreated'], 10, 1); } function onCategoryCreated ($categoryId){ $cat = get_term_by( 'id', $categoryId, 'product_cat', 'ARRAY_A' ); $catMeta = get_term_meta( $cat["term_id"] ); $thumbnailId = get_term_meta( $cat["term_id"], 'thumbnail_id', true ); $imageUrl = wp_get_attachment_url( $thumbnailId ); error_log(json_encode($cat)); error_log(json_encode($catMeta)); error_log($thumbnailId); error_log($imageUrl); }
方案2:调整原有钩子优先级
如果不想更换钩子,只需要把create_product_cat的优先级调到20以上,延迟回调函数的触发时机,等Woocommerce完成元数据写入后再执行读取逻辑即可:
function loader() { // 优先级从默认10调整为20,晚于Woocommerce的元数据写入逻辑 add_action('create_product_cat', [$this, 'onCategoryCreated'], 20, 2); add_action('edited_product_cat', [$this, 'onCategoryCreated'], 10, 2); }
两种方案都可以实现创建分类时正常读取thumbnail_id的需求,方案1的兼容性更强,不需要处理不同钩子的优先级差异。
内容的提问来源于stack exchange,提问作者VincentD
相关产品推荐
相关产品推荐

