WordPress Twig模板渲染view-order页订单ID固定不更新问题
问题原因
- 参数键名不匹配:WooCommerce 不同页面端点的查询变量规则不一致,你在短代码里是通过
get_query_var('view-order')读取订单ID,但Twig代码里错误读取了system.get.order_id参数。my-orders、my-downloads页面路由本身用order_id作为参数键名所以能正常运行,view-order页面的订单ID参数键名是view-order,直接照搬旧逻辑拿不到正确的动态ID。 - 冗余嵌套循环导致渲染异常:你为了输出订单ID嵌套了
order.get_items、order.get_downloadable_items两层循环,当访问的订单没有可下载商品时,循环不会执行,内部的ID输出代码根本不会触发;如果订单有多个可下载商品,同一个ID还会重复输出多次。 - 全局对象取值不可靠:Twig代码里通过全局
$post对象拿ID,但view-order是依附于“我的账户”页面的路由端点,全局主查询返回的是“我的账户”页面对应的文章对象,不是订单对象,出现页面缓存或者主查询未重置的情况时,就会一直固定输出第一次加载拿到的ID,不会随访问的订单切换更新。
修复方案
把Twig模板代码替换为以下内容,取值逻辑和你正常运行的短代码完全对齐,去掉冗余逻辑:
{# 读取view-order查询变量中的订单ID,做整数校验和短代码逻辑一致 #} {% set order_id = system.get['view-order']|absint %} {% set order = order_id|php('wc_get_order') %} {# 先判断订单对象是否有效,直接输出ID,去掉多余循环 #} {% if order is not null %} <div>{{ order.get_id() }}</div> {% endif %}
注意事项
- 不要在WooCommerce账户端点页面依赖全局
$post对象拿订单相关数据,这类端点的主查询不是订单自定义文章类型,直接读全局对象很容易出现取值错误。 - 跨页面复用Twig逻辑时,要先确认对应页面的路由参数键名、全局对象规则是否一致,不要直接硬抄其他页面的代码。
内容的提问来源于stack exchange,提问作者Snorlax
相关产品推荐
相关产品推荐

