获取 WooCommerce 客户订单:获取当前订单和之前的订单信息
在 WooCommerce 开发中,我们经常需要获取客户的订单信息,比如区分当前提交的订单和历史订单,或者统计客户的历史购买记录。本文将详细说明如何通过 WooCommerce 提供的钩子和函数,获取当前订单以及客户之前的订单信息,并给出完整的代码示例。
核心思路说明
WooCommerce 的订单流程中,当订单创建、保存或者状态更新时,会触发对应的钩子,比如 woocommerce_checkout_order_processed(结账流程创建订单时触发)、woocommerce_order_status_changed(订单状态变更时触发)。我们可以在这些钩子的回调函数中,先获取当前订单的信息,再通过当前订单关联的用户 ID,查询该用户之前的所有订单,实现当前订单和历史订单的区分与获取。
获取当前订单与历史订单的实现步骤
- 第一步:选择合适的 WooCommerce 钩子,绑定自定义回调函数,确保订单创建或状态变更时能触发我们的逻辑。
- 第二步:在回调函数中,通过钩子传递的参数获取当前订单对象。
- 第三步:从当前订单对象中获取下单用户的 ID,排除游客订单的情况。
- 第四步:使用
wc_get_orders函数,传入用户 ID 作为查询条件,获取该用户的所有历史订单,同时排除当前正在处理的订单,避免重复统计。 - 第五步:对获取到的订单信息进行业务逻辑处理,比如记录日志、发送通知、计算历史消费总额等。
完整代码示例
以下代码实现了在订单创建完成后,获取当前订单信息,同时查询该用户之前的所有订单,并输出基础信息到日志中:
add_action('woocommerce_checkout_order_processed', 'get_current_and_previous_orders', 10, 3);
function get_current_and_previous_orders($order_id, $posted_data, $order) {
// 1. 获取当前订单对象,若未传入则通过订单ID获取
if (!$order instanceof WC_Order) {
$order = wc_get_order($order_id);
}
if (!$order) {
return;
}
// 2. 获取当前订单的基础信息
$current_order_data = array(
'order_id' => $order->get_id(),
'order_total' => $order->get_total(),
'order_status' => $order->get_status(),
'order_date' => $order->get_date_created()->date('Y-m-d H:i:s')
);
// 3. 获取下单用户ID,游客订单跳过历史订单查询
$user_id = $order->get_user_id();
if (!$user_id) {
error_log('当前订单为游客订单,无历史订单信息。当前订单ID:' . $order_id);
return;
}
// 4. 查询该用户的所有历史订单,排除当前订单
$previous_orders = wc_get_orders(array(
'customer_id' => $user_id,
'exclude' => array($order_id), // 排除当前订单
'limit' => -1, // 获取所有历史订单,无数量限制
'orderby' => 'date_created',
'order' => 'DESC' // 按创建时间倒序排列,最新的历史订单在前
));
// 5. 处理历史订单信息
$previous_order_list = array();
$total_previous_spent = 0;
foreach ($previous_orders as $prev_order) {
$previous_order_list[] = array(
'order_id' => $prev_order->get_id(),
'order_total' => $prev_order->get_total(),
'order_status' => $prev_order->get_status(),
'order_date' => $prev_order->get_date_created()->date('Y-m-d H:i:s')
);
$total_previous_spent += floatval($prev_order->get_total());
}
// 6. 组合信息并记录日志(实际业务中可替换为发邮件、存数据库等操作)
$log_content = sprintf(
'当前订单信息:ID %d,金额 %s,状态 %s,下单时间 %s。用户ID:%d,历史订单总数:%d,历史消费总额:%s。',
$current_order_data['order_id'],
$current_order_data['order_total'],
$current_order_data['order_status'],
$current_order_data['order_date'],
$user_id,
count($previous_order_list),
$total_previous_spent
);
error_log($log_content);
}代码说明
上述代码使用了 woocommerce_checkout_order_processed 钩子,该钩子在用户完成结账、订单创建成功后触发,会传递订单 ID、提交的结账数据、订单对象三个参数给回调函数,我们不需要额外再查询当前订单,直接使用传入的订单对象即可提升效率。
在获取用户历史订单时,使用了 WooCommerce 内置的 wc_get_orders 函数,这是 WooCommerce 官方推荐的订单查询方式,比直接操作数据库更安全,也兼容后续的版本更新。其中 exclude 参数用来排除当前订单,避免把刚创建的订单也算入历史订单中。
如果用户是未登录的游客,get_user_id 会返回 0,此时我们跳过历史订单查询逻辑,避免无效的查询操作。实际业务中也可以根据需求,为游客订单添加其他的处理逻辑。
常见扩展场景
除了基础的订单信息获取,还可以基于这个逻辑做更多扩展:
- 如果用户历史订单总额达到一定阈值,给当前订单自动添加专属优惠券。
- 当客户下单时,自动发送包含历史购买记录的邮件通知。
- 统计客户历史订单中购买过的产品,在当前订单页面推荐相关商品。
只需要根据自己的业务需求,替换代码中记录日志的部分,加入对应的业务逻辑即可实现。