You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>'; // 无符合条件订单时返回提示
    }
}

关键修改说明

  1. 修正短码函数参数为$atts(WordPress短码标准参数),避免变量混淆。
  2. 增加$last_order的空值判断,防止调用不存在的方法。
  3. 将返回值改为HTML字符串,符合短码的输出要求,同时用esc_url()确保URL安全。
  4. 为所有分支添加明确的返回内容,避免输出异常。
  5. 替换$order->get_id()为$last_order->get_id(),确保操作的是用户的最近订单。

内容的提问来源于stack exchange,提问作者Matt Kramer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:05:27