WooCommerce感谢页调用get_items()报错:布尔值上调用成员函数
解析WooCommerce感谢页订单摘要代码崩溃问题及修复方案
咱们先直击报错核心:Uncaught Error: Call to a member function get_items() on boolean,这说明你代码里的$order变量是个布尔值(具体是false),根本不是合法的WooCommerce订单对象,自然没法调用get_items()方法。
问题根源拆解
- 未定义的
$order_id:你的代码里直接用了$order_id,但这个变量完全没被赋值,wc_get_order()拿不到有效ID,只能返回false。 - 语法小疏漏:
$item->get_quantity少了函数调用的括号,应该是$item->get_quantity(),不然会输出函数本身的代码而非实际数量值。 - 不符合短代码规范:直接用
echo输出内容,WordPress短代码要求返回内容而非直接输出,否则可能导致页面渲染顺序错乱。
修复后的代码
结合WooCommerce感谢页的场景(订单完成后跳转的页面,URL带有order-received参数),我们可以这样修改代码:
function order_table_summary() { // 从感谢页URL获取订单ID $order_id = get_query_var('order-received'); // 验证订单ID有效性,获取合法订单对象 if ( ! $order_id || ! ($order = wc_get_order($order_id)) ) { return '<p>无法获取订单信息,请稍后重试。</p>'; } $output = '<table style="width:100%;border-collapse:collapse;"><thead><tr><th style="border:1px solid #ddd;padding:8px;">商品名称</th><th style="border:1px solid #ddd;padding:8px;">数量</th><th style="border:1px solid #ddd;padding:8px;">小计</th></tr></thead><tbody>'; // 循环遍历订单项 foreach ( $order->get_items() as $item_id => $item ) { // 获取商品名称、数量、格式化后的小计价格 $product_name = $item->get_name(); $quantity = $item->get_quantity(); $subtotal = wc_price($item->get_total()); $output .= "<tr><td style='border:1px solid #ddd;padding:8px;'>{$product_name}</td><td style='border:1px solid #ddd;padding:8px;'>{$quantity}</td><td style='border:1px solid #ddd;padding:8px;'>{$subtotal}</td></tr>"; } $output .= '</tbody></table>'; // 返回内容而非直接echo,符合WordPress短代码规范 return $output; } add_shortcode('order_table_summary', 'order_table_summary');
关键修改说明
- 正确获取订单ID:用
get_query_var('order-received')直接从感谢页URL参数里提取订单ID,这是WooCommerce官方推荐的方式。 - 增加容错验证:先检查订单ID是否存在,再验证
wc_get_order()是否返回合法对象,避免再次触发致命错误。 - 规范输出方式:把所有内容拼接到
$output变量后返回,符合WordPress短代码的运行逻辑。 - 优化展示效果:将纯文本输出改成带基础样式的表格,更符合订单摘要的展示需求,同时用
wc_price()自动适配商店的货币格式。
内容的提问来源于stack exchange,提问作者BruceyBandit
相关产品推荐
相关产品推荐

