如何为WooCommerce商品新增属性且保留原有属性及变体
WooCommerce 商品新增属性且保留原有属性的解决方案
需求背景
需要为已存在X个属性的WooCommerce商品,新增一个带指定值的属性,同时完整保留原有所有属性。之前尝试的方案需要手动构建包含全部现有属性的数组,通用性差且不符合最佳实践;自行编写的代码中$product->get_attributes()返回空值,执行后反而清空了商品的所有属性及变体。
尝试过的问题代码
$modelagem = "desconhecida"; // 新属性值 $attribute_pa_at_modelagem_id = wc_attribute_taxonomy_id_by_name('at-modelagem'); // 已在WordPress注册但未添加到商品的属性 $modelagem_attribute = new WC_Product_Attribute(); // 新建属性对象 $modelagem_attribute->set_id($attribute_pa_at_modelagem_id); // 设置属性配置 $modelagem_attribute->set_name('pa_at-modelagem'); // 设置属性配置 $modelagem_attribute->set_options([$modelagem]); // 设置属性配置 $modelagem_attribute->set_visible(true); // 设置属性配置 $modelagem_attribute->set_variation(false); // 设置属性配置 $modelagem_attribute->set_position(0); // 设置属性配置 $existing_attributes = $product->get_attributes(); // 获取现有属性(此处返回空值) $existing_attributes[] = $modelagem_attribute; // 将新属性追加到数组 $product->set_attributes($existing_attributes); // 清空了所有属性 $product->save();
正确实现方案
无需手动处理原有属性数组,直接使用WooCommerce内置的add_attribute()方法即可安全追加新属性,该方法会自动保留原有属性:
$modelagem = "desconhecida"; // 获取已注册的属性分类ID $attribute_id = wc_attribute_taxonomy_id_by_name('at-modelagem'); // 构建新属性对象 $new_attribute = new WC_Product_Attribute(); $new_attribute->set_id($attribute_id); $new_attribute->set_name('pa_at-modelagem'); $new_attribute->set_options([$modelagem]); $new_attribute->set_visible(true); $new_attribute->set_variation(false); // 将新属性位置设为现有属性的最后一位,避免覆盖原有位置排序 $new_attribute->set_position(count($product->get_attributes())); // 直接添加属性,自动保留原有属性 $product->add_attribute($new_attribute); $product->save();
补充说明
如果$product->get_attributes()仍然返回空值,可尝试先通过$product->get_meta('_product_attributes')获取原始属性元数据,再转换为WC_Product_Attribute对象数组,但add_attribute()是官方推荐的更简洁、不易出错的方式,优先使用此方法。
内容的提问来源于stack exchange,提问作者Davi Davi
相关产品推荐
相关产品推荐

