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

如何在WooCommerce中通过ACF修改属性下拉框的术语名称

我来帮你解决这个问题!你的代码出现所有术语显示同一个自定义字段值的原因,是逻辑遍历错误——你在循环所有属性的所有术语时,每次找到有external_name值的术语就直接覆盖$term_name变量,最后所有术语都会被最后一个匹配到的字段值替换。


解决WooCommerce属性下拉框术语名称统一替换问题

问题根源

你的filter_woocommerce_variation_option_name函数遍历了所有产品属性的所有术语,并且只要找到任意一个术语有external_name值,就直接修改全局的$term_name变量。这会导致所有下拉框里的术语名称,最终被最后一个带有external_name值的术语字段覆盖。

更关键的是,woocommerce_variation_option_name钩子本身会针对每个单独的术语调用一次,你完全不需要手动遍历所有术语,直接利用钩子提供的第二个参数就能获取当前处理的术语对象。

修正后的代码

把你原来的函数替换成下面这段:

function filter_woocommerce_variation_option_name( $term_name, $term ) {
    // 检查当前术语是否存在external_name自定义字段,且字段值非空
    $external_name = get_field('external_name', $term);
    if ( ! empty( $external_name ) ) {
        $term_name = $external_name;
    }
    return $term_name;
};
// 注意这里要添加第二个参数的声明(优先级10,接受2个参数)
add_filter( 'woocommerce_variation_option_name', 'filter_woocommerce_variation_option_name', 10, 2 );

关键修改点

  1. 添加钩子参数:在add_filter里最后一个参数设为2,表示函数接收2个参数(原名称$term_name和当前术语对象$term)
  2. 直接针对当前术语操作:不再遍历所有属性和术语,直接获取当前处理的术语的external_name字段
  3. 条件判断更严谨:只有当external_name字段非空时,才替换术语名称,保留无自定义字段的术语原名称

额外说明

  • ACF的get_field函数支持直接传入WP_Term对象,不需要手动拼接{$taxonomy}_{$term_id}的格式,代码更简洁可靠
  • 你的ACF字段组规则(自定义的WC Product Attribute规则)不需要修改,保持原样即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:00:45