WooCommerce获取变体属性术语描述生成SKU的方案求助
解决WooCommerce变体SKU自动生成(基于属性术语描述)
我明白你想要实现的功能——根据变体所使用的每个属性术语的描述字段,自动拼接生成SKU。之前用$variation['attributes']的方式没成功,大概率是因为没有正确获取到术语对象的描述信息,或者处理属性键的方式不对。下面给你一个可行的方案,用WooCommerce的钩子来实现自动生成:
方案一:实时生成SKU(通过过滤器钩子)
这个方案会在每次获取变体SKU的时候自动生成,适合不需要持久化保存SKU,或者希望随时根据属性描述变化更新SKU的场景:
add_filter('woocommerce_product_variation_get_sku', 'generate_variation_sku_from_term_descriptions', 10, 2); function generate_variation_sku_from_term_descriptions($sku, $variation) { // 如果已经有手动设置的SKU,跳过自动生成(可选,根据需求调整) if (!empty($sku)) { return $sku; } $sku_parts = []; // 获取变体的所有属性(返回的是键为attribute_pa_{slug},值为术语slug的数组) $attributes = $variation->get_attributes(); foreach ($attributes as $attr_key => $term_slug) { // 提取属性的 taxonomy(比如从attribute_pa_color得到pa_color) $taxonomy = str_replace('attribute_', '', $attr_key); // 通过属性taxonomy和术语slug获取术语对象 $term = get_term_by('slug', $term_slug, $taxonomy); // 如果术语存在且描述不为空,添加到SKU部分 if ($term && !is_wp_error($term) && !empty($term->description)) { $sku_parts[] = $term->description; } } // 拼接所有描述部分作为SKU,如果没有则返回原SKU return !empty($sku_parts) ? implode('', $sku_parts) : $sku; }
方案二:保存变体时生成并持久化SKU
如果你希望在变体保存的时候就把SKU写入数据库,而不是每次实时生成,可以用这个钩子:
add_action('woocommerce_admin_process_variation_object', 'save_variation_sku_from_term_descriptions', 10, 2); function save_variation_sku_from_term_descriptions($variation, $data) { // 如果已经有手动设置的SKU,跳过(可选) if (!empty($variation->get_sku())) { return; } $sku_parts = []; $attributes = $variation->get_attributes(); foreach ($attributes as $attr_key => $term_slug) { $taxonomy = str_replace('attribute_', '', $attr_key); $term = get_term_by('slug', $term_slug, $taxonomy); if ($term && !is_wp_error($term) && !empty($term->description)) { $sku_parts[] = $term->description; } } if (!empty($sku_parts)) { $variation->set_sku(implode('', $sku_parts)); $variation->save(); } }
关键说明
- 属性键的处理:WooCommerce变体的属性键格式是
attribute_pa_{属性slug},比如颜色属性slug是color,键就是attribute_pa_color,所以需要用str_replace去掉前缀得到正确的分类法(taxonomy)。 - 术语对象的获取:用
get_term_by('slug', $term_slug, $taxonomy)可以准确获取到对应的术语对象,然后直接访问$term->description就能拿到你设置的描述内容。 - 跳过手动SKU:代码里加了判断如果已经有手动设置的SKU就跳过自动生成,这样你可以保留某些变体的自定义SKU,这个逻辑可以根据你的需求调整。
- 兼容性:这个方案适用于WooCommerce 3.0+版本,因为我们用了面向对象的方式调用
WC_Product_Variation的方法(比如get_attributes()、set_sku()),比直接操作数组更稳定。
你可以把代码添加到你的主题的functions.php文件里,或者用自定义插件来添加,测试一下变体的SKU是否正确生成——比如red+xl的变体应该会得到210,blue+m的变体得到120。
内容的提问来源于stack exchange,提问作者Yashar
相关产品推荐
相关产品推荐

