
本文详解如何使用 wc_get_orders() 正确、安全地获取当前登录用户的全部订单编号与订单名称,并封装为可复用的短代码,避免原始代码中变量未定义、逻辑错误及潜在数据泄露风险。
本文详解如何使用 wc_get_orders() 正确、安全地获取当前登录用户的全部订单编号与订单名称,并封装为可复用的短代码,避免原始代码中变量未定义、逻辑错误及潜在数据泄露风险。
在 WooCommerce 开发中,常需在自定义页面(如重写的 orders.php)中动态展示当前用户的历史订单信息。但直接实例化 WC_Order 或误用未声明变量(如 $customer_order、$customer_orders)会导致返回空值、0 或 PHP 致命错误——正如原始代码中两个短代码均无法正常工作的原因:第一个因传入无效 ID 而构造失败,第二个则因循环内提前 return 且引用了根本不存在的对象属性而彻底失效。
✅ 正确做法是使用 WooCommerce 官方推荐的查询接口 wc_get_orders(),它支持按用户 ID、状态、日期等条件高效检索订单集合,返回的是已初始化的 WC_Order 对象数组,无需手动构造,也天然兼容权限与缓存机制。
以下是两个健壮、安全、可直接部署的短代码实现:
// 【短代码】[prcsed_order_numb] —— 返回当前用户所有订单号,以逗号分隔
function wpse_get_customer_order_numbers() {
// 检查用户是否已登录,防止未授权访问敏感数据
if ( ! is_user_logged_in() ) {
return '<span class="error">请先登录以查看您的订单</span>';
}
// 查询当前用户的所有有效订单(排除已取消、待支付等非完成状态可选)
$orders = wc_get_orders( array(
'customer' => get_current_user_id(),
'status' => array('wc-completed', 'wc-processing', 'wc-on-hold'), // 可按需调整
'limit' => 50, // 防止海量订单导致性能问题
) );
// 提取订单号并拼接为字符串
$order_numbers = array_map( function( $order ) {
return $order->get_order_number();
}, $orders );
return ! empty( $order_numbers )
? implode( ', ', $order_numbers )
: '暂无订单';
}
add_shortcode( 'prcsed_order_numb', 'wpse_get_customer_order_numbers' );// 【短代码】[prcsed_order_name] —— 返回当前用户所有订单的“客户姓名”(billing_first_name + billing_last_name)
function wpse_get_customer_order_names() {
if ( ! is_user_logged_in() ) {
return '<span class="error">请先登录以查看您的订单</span>';
}
$orders = wc_get_orders( array(
'customer' => get_current_user_id(),
'limit' => 50,
) );
$full_names = array_map( function( $order ) {
$first = $order->get_billing_first_name();
$last = $order->get_billing_last_name();
return trim( "$first $last" ) ?: '未知客户';
}, $orders );
return ! empty( $full_names )
? implode( ' | ', $full_names )
: '暂无订单';
}
add_shortcode( 'prcsed_order_name', 'wpse_get_customer_order_names' );⚠️ 重要注意事项:
- 安全性优先:始终校验 is_user_logged_in(),禁止向访客暴露任何用户订单数据;若需管理员调试,应额外增加 current_user_can('manage_woocommerce') 权限判断。
- 性能防护:设置 limit 参数限制最大返回数量,避免高并发下数据库压力激增;如需分页展示,请改用 AJAX + WP_Query 分批加载。
- 字段可靠性:$order->name 并非标准属性(原始答案中存在误导),应使用 $order->get_billing_first_name() 等明确方法获取客户信息。
- 状态过滤:生产环境建议显式指定 'status' 参数,避免返回已取消或待确认订单造成混淆。
通过以上方式,您不仅能准确渲染订单数据,更构建了一套符合 WooCommerce 最佳实践、兼顾安全与性能的短代码解决方案。

















