导读:本期聚焦于小伙伴创作的《如何在WooCommerce中获取当前订单和客户历史订单信息?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何在WooCommerce中获取当前订单和客户历史订单信息?》有用,将其分享出去将是对创作者最好的鼓励。

获取 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,此时我们跳过历史订单查询逻辑,避免无效的查询操作。实际业务中也可以根据需求,为游客订单添加其他的处理逻辑。

常见扩展场景

除了基础的订单信息获取,还可以基于这个逻辑做更多扩展:

  • 如果用户历史订单总额达到一定阈值,给当前订单自动添加专属优惠券。
  • 当客户下单时,自动发送包含历史购买记录的邮件通知。
  • 统计客户历史订单中购买过的产品,在当前订单页面推荐相关商品。

只需要根据自己的业务需求,替换代码中记录日志的部分,加入对应的业务逻辑即可实现。

WooCommerce订单获取wc_get_orders钩子用户历史订单

免责声明:已尽一切努力确保本网站所含信息的准确性。网站部分内容来源于网络或由用户自行发表,内容观点不代表本站立场。本站是个人网站免费分享,内容仅供个人学习、研究或参考使用,如内容中引用了第三方作品,其版权归原作者所有。若内容触犯了您的权益,请联系我们进行处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。前端、网络、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握网站开发与运维所需的核心技术栈。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端逻辑,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。