WooCommerce全局属性术语报错:首次运行提示Invalid Taxonomy
问题分析与解决方案
问题根源
首次运行脚本抛「Invalid Taxonomy」错误,第二次或Xdebug暂停时正常,核心原因是:
- 调用
wc_create_attribute创建全局属性后,WooCommerce不会立即将对应的pa_*分类法注册到WordPress系统 - 后续执行
get_term_by、wp_insert_term时,系统还未识别这个新分类法,因此报错 - 第二次运行时,分类法已在WordPress初始化阶段从数据库加载完成;Xdebug暂停则给了系统足够的初始化时间,因此都能正常执行
修复方案
在创建全局属性后,手动触发分类法注册操作,确保后续代码能识别新创建的pa_*分类法。
修改后的完整代码
// 创建全局属性 $global_attributes = ['Size', 'Colour']; foreach ($global_attributes as $global_attribute) { wc_create_attribute([ 'name' => $global_attribute, 'type' => 'text', ]); } // 关键修复:手动注册刚创建的属性分类法 foreach ($global_attributes as $global_attribute) { $taxonomy = wc_attribute_taxonomy_name($global_attribute); if (!taxonomy_exists($taxonomy)) { $attribute = wc_get_attribute_taxonomy_by_name($global_attribute); if ($attribute) { register_taxonomy( $taxonomy, apply_filters('woocommerce_taxonomy_objects_' . $taxonomy, ['product']), apply_filters('woocommerce_taxonomy_args_' . $taxonomy, [ 'labels' => ['name' => $global_attribute], 'hierarchical' => true, 'show_ui' => false, 'query_var' => true, 'rewrite' => false, ]) ); } } } // 处理产品与属性 $product_attributes = [ 'Size' => ['Small', 'Large', 'Medium'], 'Colour' => ['Red', 'Blue', 'Green'], 'Rating' => '5 Star!' ]; $product = new \WC_Product(); foreach ($product_attributes as $name => $value) { $attribute = new \WC_Product_Attribute(); $attribute->set_name($name); $attribute->set_options(is_array($value) ? $value : [$value]); if (in_array($name, $global_attributes)) { $term_name = wc_attribute_taxonomy_name($name); $options = []; $values = is_array($value) ? $value : [$value]; foreach($values as $option) { $term = get_term_by('name', $option, $term_name); if (!$term) { $insert_result = wp_insert_term($option, $term_name); // 检查插入结果,避免错误扩散 if (!is_wp_error($insert_result)) { $term = get_term_by('term_id', $insert_result['term_id'], $term_name); } } if ($term && !is_wp_error($term)) { $options[] = $term->term_id; } } $attribute->set_id(wc_attribute_taxonomy_id_by_name($name)); $attribute->set_name($term_name); $attribute->set_options($options); } // 原代码遗漏:将属性添加到产品属性集合 $product->set_attributes(array_merge($product->get_attributes(), [$attribute])); } $product->save();
额外修复点
- 补充了原代码遗漏的
$product->set_attributes()步骤,确保属性能被保存到产品中 - 增加
wp_insert_term结果校验,避免插入失败时后续代码因无效$term报错 - 简化了
$value的数组处理逻辑,减少冗余代码
补充说明
wc_create_attribute仅将属性信息写入数据库,不会即时触发分类法注册;必须手动调用register_taxonomy,让WordPress立刻识别这个新分类法,才能在当前脚本执行周期内使用。
内容的提问来源于stack exchange,提问作者Bankzilla
相关产品推荐
相关产品推荐

