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

WooCommerce我的账户Edit address页展示账单邮箱元数据代码报错排查

原代码运行报错的核心原因
  • 钩子参数与实际传参不匹配
    woocommerce_before_edit_account_address_form 钩子触发时不会传递任何参数,你在add_action中声明的1个接收参数$user_id实际永远为空值,后续用空值查询客户订单自然无法得到正确结果。获取当前登录用户ID不需要依赖钩子传参,直接调用get_current_user_id()即可。
  • foreach遍历的取值逻辑完全颠倒
    WooCommerce订单查询返回的结果是“订单ID为键、WC_Order对象为值”的数组结构。你写的遍历逻辑foreach($orders as $ro => $inn)中,$ro是整数类型的订单ID,$inn才是单条订单对象。你尝试对整数类型的$ro做数组键值访问$ro['email'],会直接触发PHP致命错误。
  • 订单账单邮箱的获取方式错误
    WC_Order对象不支持数组式的属性访问,也不存在名为email的直接可访问键。就算遍历逻辑正确,错误的键名也无法取到账单邮箱值。正确的获取方式是调用订单内置方法get_billing_email(),或是读取订单私有元数据_billing_email。
  • 订单查询缺少分页限制配置
    WooCommerce订单查询默认仅返回10条分页结果,没有手动设置查询参数的情况下,就算前面的逻辑全部修正,也只能拿到客户最新的10条订单,无法遍历全部历史订单。
可正常运行的修正代码
add_action( 'woocommerce_before_edit_account_address_form', 'show_customer_order_billing_emails' );
function show_customer_order_billing_emails() {
    $current_user_id = get_current_user_id();
    // 未登录状态跳过查询逻辑
    if ( ! $current_user_id ) {
        return;
    }

    $order_query = new WC_Order_Query( array(
        'customer_id' => $current_user_id,
        'limit' => -1, // 取消分页限制,返回客户全部订单
    ) );
    $orders = $order_query->get_orders();

    if ( empty( $orders ) ) {
        echo '<p>暂无历史订单记录</p>';
        return;
    }

    // 输出展示内容
    echo '<div class="customer-order-email-list">';
    echo '<h4>历史订单账单邮箱:</h4>';
    echo '<ul>';
    foreach ( $orders as $order_id => $order ) {
        $billing_email = $order->get_billing_email();
        echo '<li>订单 #' . esc_html( $order_id ) . ':' . esc_html( $billing_email ) . '</li>';
    }
    echo '</ul>';
    echo '</div>';
}
代码优化提示
  • 所有输出到页面的动态内容必须通过esc_html()做转义处理,避免引发XSS安全风险。
  • 原函数命名为save_billing_email_to_user,但实际没有保存数据的逻辑,建议修改为和展示功能匹配的函数名,避免后续维护时混淆。

内容的提问来源于stack exchange,提问作者Muhammad Adnan Bashir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 03:15:05