WooCommerce重复下单短码问题:调用用户最后订单时网站白屏
问题分析与修复方案
你的代码存在几个致命问题,直接导致了网站白屏:
- 短码函数参数错误:短码回调函数的第一个参数是短码属性数组,不是订单对象,你错误地命名为
$order,后续调用$order->get_id()时会因为类型不匹配抛出致命错误。 - 未做空值判断:
$customer->get_last_order()可能返回null(用户无订单时),直接调用$last_order->has_status()会触发致命错误。 - 返回值类型错误:短码要求返回HTML字符串,你返回的是数组
$actions,WordPress无法解析这个数组,进而导致白屏。 - 分支遗漏返回:当用户未登录或订单不符合条件时,函数没有返回任何内容,可能引发输出异常。
修正后的代码
add_shortcode( 'order_again', 'matt_order_again' ); function matt_order_again( $atts ) { // 修正参数为短码属性数组 if ( ! is_user_logged_in() ) { return '<p>请先登录账号查看订单</p>'; // 未登录时返回提示 } $user_id = get_current_user_id(); $customer = new WC_Customer( $user_id ); $last_order = $customer->get_last_order(); // 先判断订单是否存在,再检查状态 if ( $last_order && $last_order->has_status( 'completed' ) ) { $order_again_url = wp_nonce_url( add_query_arg( 'order_again', $last_order->get_id(), wc_get_cart_url() ), 'woocommerce-order_again' ); // 返回可点击的HTML按钮/链接 return '<a href="' . esc_url( $order_again_url ) . '" class="button">' . __( '再次下单', 'woocommerce' ) . '</a>'; } else { return '<p>暂无可再次下单的历史订单</p>'; // 无符合条件订单时返回提示 } }
关键修改说明
- 修正短码函数参数为
$atts(WordPress短码标准参数),避免变量混淆。 - 增加
$last_order的空值判断,防止调用不存在的方法。 - 将返回值改为HTML字符串,符合短码的输出要求,同时用
esc_url()确保URL安全。 - 为所有分支添加明确的返回内容,避免输出异常。
- 替换
$order->get_id()为$last_order->get_id(),确保操作的是用户的最近订单。
内容的提问来源于stack exchange,提问作者Matt Kramer
相关产品推荐
相关产品推荐

