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
相关产品推荐
相关产品推荐

