Liquid循环中if contains语句失效问题求助
解决方案:修正Liquid条件判断中的过滤器优先级问题
哦,我太懂这个坑了!这是Liquid模板里很常见的表达式解析顺序问题——你写的canonical_url contains tag | handle并没有按照你预期的逻辑执行。
问题根源
Liquid会优先解析运算符而非过滤器,当你写canonical_url contains tag | handle时,它会先计算canonical_url contains tag这个布尔判断,再把得到的true/false结果传给handle过滤器,这完全偏离了你想要的“先把tag转成handle,再判断URL是否包含它”的逻辑。
修正后的代码
只需要给tag | handle加上括号,明确让Liquid先处理过滤器,再执行contains判断:
{% for tag in collections.all.tags %} <li class="mb-1 "> <a class="text-white" title="{{ tag }}" href="#"> {{ tag | handle }} {% if canonical_url contains (tag | handle) %} active {% endif %} </a> </li> {% endfor %}
为什么这样有效?
括号在Liquid里可以强制改变表达式的执行顺序。用(tag | handle)包裹后,Liquid会先把tag转换为对应的handle值(也就是你测试的"dodge"),再去检查这个值是否存在于canonical_url中,逻辑就和你硬写'dodge'时完全一致了。
内容的提问来源于stack exchange,提问作者brunouno
相关产品推荐
相关产品推荐

