Woocommerce自定义导入产品时新创建全局属性值未添加至产品问题
问题原因
你遇到的是WooCommerce全局属性缓存未及时更新的问题:首次调用wc_create_attribute创建完全局属性后,WooCommerce的全局属性缓存(默认存在wc_attribute_taxonomies临时缓存中)不会自动刷新,你紧接着调用wc_attribute_taxonomy_id_by_name拿不到新建属性的正确ID,返回无效值,导致产品关联的属性对象ID错误,属性值无法正常存储。第二次导入时全局属性已存在、缓存也已更新,所以运行正常。
另外注意你当前代码里两个方法重名,都叫createAttribute,会引发逻辑冲突,需要先重命名区分。
修复方案
1. 重命名并修改全局属性创建方法,新增缓存清理逻辑
// 重命名为createGlobalAttribute,避免和后续方法冲突 private function createGlobalAttribute($attribute_name) { $attributes = array_values(wc_get_attribute_taxonomy_labels()); if (!in_array($attribute_name, $attributes)) { wc_create_attribute([ 'name' => $attribute_name, 'slug' => IM_Helper::translit($attribute_name) ]); // 核心修复:清理旧的属性缓存,重新加载属性列表 delete_transient('wc_attribute_taxonomies'); wc_get_attribute_taxonomies(); } }
2. 重命名产品属性构建方法,新增ID合法性校验
// 重命名为buildProductAttribute private function buildProductAttribute($property) { $attribute_id = wc_attribute_taxonomy_id_by_name($property['name']); // 新增校验,跳过无效属性 if (empty($attribute_id)) { return false; } $attribute = new WC_Product_Attribute(); $attribute->set_id($attribute_id); $attribute->set_name( 'pa_'.$property['name'] ); $attribute->set_visible( true ); $attribute->set_variation( false ); $attribute->set_options([$property['value']]); return $attribute; }
3. 修改调用逻辑,先创建全局属性再构建产品属性
$attributes_array = array(); foreach ($this->properties as $property) { // 先确保全局属性已创建、缓存已更新 $this->createGlobalAttribute($property['name']); // 再构建产品属性对象 $attribute = $this->buildProductAttribute($property); if ($attribute) { $attributes_array[] = $attribute; } } $product->set_attributes($attributes_array); $product->save();
内容的提问来源于stack exchange,提问作者Максим Жукович
相关产品推荐
相关产品推荐

