WooCommerce选中变体自定义字段条件展示的实现问题
为什么之前的PHP写法不生效
这个模板块根本不是给服务端PHP渲染用的:
- WooCommerce的变体选择展示逻辑全在前端跑,所有变体数据存在页面加载时就塞到JS全局变量里,等用户选了具体变体才动态渲染对应的内容
- 你改的这个
<script type="text/template" id="tmpl-variation-template">块,是给前端Underscore模板引擎用的纯文本,整个块的执行环境是浏览器的JavaScript,不是PHP解析器 - 服务端渲染这个PHP文件的时候,根本不知道用户最终会选哪个变体,自然不会有你要的
$data变量,写在块里的PHP判断逻辑完全没有执行上下文,自然不会生效。
可直接使用的实现代码
直接在你标注的插入位置,写模板引擎支持的原生JS判断逻辑即可,和模板里已经在用的{{{ data.variation.custom_field }}}语法共享同一个运行上下文,代码如下:
{{ if (Number(data.variation.custom_field) > 10) { }} Yes {{ } }}
落地注意事项
- 必须做类型转换:从模板上下文读取的
custom_field值默认是字符串类型,直接做大小比较会触发字典序判断(比如字符串"2"会被判定为比"10"大,完全不符合数值预期),用Number()转成数值类型再判断才能保证逻辑正确 - 空值兜底:当
custom_field为空、未定义时,转换得到的数值为0或NaN,判断结果会自动为false,不会错误输出"Yes" - 特殊值兼容:如果你的
custom_field值带非数字字符(比如单位"件"、货币符号"¥"),可以先提取纯数字再做判断,替换后的判断代码如下:{{ const fieldNum = parseFloat(String(data.variation.custom_field || '').match(/\d+(\.\d+)?/)?.[0] || 0); }} {{ if (fieldNum > 10) { }} Yes {{ } }} - 兼容性调整:如果需要兼容IE这类不支持可选链语法的老浏览器,把特殊值提取的代码替换为传统写法:
{{ const customFieldStr = String(data.variation.custom_field || ''); const matchedNum = customFieldStr.match(/\d+(\.\d+)?/); const fieldNum = matchedNum ? parseFloat(matchedNum[0]) : 0; }} {{ if (fieldNum > 10) { }} Yes {{ } }} - 调试方法:可以临时在模板里插入
{{ console.log('当前变体自定义字段值:', data.variation.custom_field) }},选择变体后打开浏览器控制台,核对实际读取到的值类型和内容,避免因为字段没有正确传入导致逻辑失效 - 语法兼容性:当前模板用的
{{{ 输出值 }}}是Underscore模板的HTML渲染语法,直接在大括号包裹的区域写原生JS判断、变量定义都是引擎原生支持的,不需要额外引入其他依赖。
修改后完整模板参考
<script type="text/template" id="tmpl-variation-template"> <div class="woocommerce-variation-description"> {{{ data.variation.variation_description }}} </div> <div class="woocommerce-variation-price"> {{{ data.variation.price_html }}} </div> <div class="woocommerce-variation-custom_field"> {{{ data.variation.custom_field}}} ///////// HERE MY CODE ///////// {{ if (Number(data.variation.custom_field) > 10) { }} Yes {{ } }} </div> <div class="woocommerce-variation-availability"> {{{ data.variation.availability_html }}} </div> </script>
内容的提问来源于stack exchange,提问作者JPashs
相关产品推荐
相关产品推荐

