You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
    }
}

关键说明

  1. 属性键的处理:WooCommerce变体的属性键格式是attribute_pa_{属性slug},比如颜色属性slug是color,键就是attribute_pa_color,所以需要用str_replace去掉前缀得到正确的分类法(taxonomy)。
  2. 术语对象的获取:用get_term_by('slug', $term_slug, $taxonomy)可以准确获取到对应的术语对象,然后直接访问$term->description就能拿到你设置的描述内容。
  3. 跳过手动SKU:代码里加了判断如果已经有手动设置的SKU就跳过自动生成,这样你可以保留某些变体的自定义SKU,这个逻辑可以根据你的需求调整。
  4. 兼容性:这个方案适用于WooCommerce 3.0+版本,因为我们用了面向对象的方式调用WC_Product_Variation的方法(比如get_attributes()、set_sku()),比直接操作数组更稳定。

你可以把代码添加到你的主题的functions.php文件里,或者用自定义插件来添加,测试一下变体的SKU是否正确生成——比如red+xl的变体应该会得到210,blue+m的变体得到120。

内容的提问来源于stack exchange,提问作者Yashar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:12:09