返回

在 WooCommerce 结账时向客户展示自定义消息:处理中订单的产品

php

在 WooCommerce 结帐时向客户显示自定义消息:过去购买了订单状态为“处理中”的产品

介绍

网上购物正变得越来越普遍,电子商务平台也不断完善,为消费者提供无缝的购物体验。WooCommerce 是一个流行的 WordPress 插件,用于创建和管理在线商店。虽然 WooCommerce 提供了一系列强大的功能,但有时需要对现有功能进行定制以满足特定的业务需求。

挑战

一位 WooCommerce 店主希望向在结账时购买了订单状态为“处理中”的产品的客户显示一条自定义消息。该消息应仅在满足以下条件时显示:

  • 客户已登录
  • 用户角色为管理员或客户
  • 过去购买的产品的订单状态仍为“处理中”

解决方案

为了解决此挑战,我们需要修改 WooCommerce 结帐流程,在满足特定条件时动态显示自定义消息。这是实现此功能的分步指南:

步骤 1:检查用户登录状态和角色

在处理自定义消息之前,我们需要验证用户是否已登录并具有正确的角色。以下是检查用户状态的代码:

function user_logged_in_product_already_bought() {
    if (!is_user_logged_in()) {
        return; // 用户未登录,退出函数
    }

    $user = wp_get_current_user();
    $allowed_roles = ['administrator', 'customer']; // 允许查看消息的角色

    if (!array_intersect($allowed_roles, $user->roles)) {
        return; // 用户角色不在允许范围内,退出函数
    }

    // 用户已登录并具有适当的角色,继续处理
}

步骤 2:检查过去购买的产品订单状态

接下来,我们需要检查用户过去购买的特定产品当前的订单状态。以下是查询数据库以获取订单状态信息的代码:

global $woocommerce;

$items = $woocommerce->cart->get_cart();

foreach ($items as $item => $values) {
    $product_id = $values['data']->get_id();

    $order_query = new WP_Query([
        'post_type' => 'shop_order',
        'meta_query' => [
            [
                'key' => '_customer_user',
                'value' => get_current_user_id(),
            ],
            [
                'key' => '_product_id',
                'value' => $product_id,
            ],
            [
                'key' => '_order_status',
                'value' => 'processing',
            ],
        ],
    ]);

    if ($order_query->have_posts()) {
        // 产品订单状态为“处理中”,显示自定义消息
        wc_print_notice('您过去购买过此商品。是否要再次购买?', 'success');
        break; // 找到一个匹配的订单,退出循环
    }
}

步骤 3:注册 WooCommerce 钩子

现在我们有了必要的函数来检查用户状态和订单状态,我们需要在 WooCommerce 结帐流程中注册一个钩子。以下是注册钩子的代码:

add_action('woocommerce_before_checkout_form', 'user_logged_in_product_already_bought');

这将确保我们的函数在结帐流程的“结帐表单之前”阶段运行。

完整代码

以下是如何将上述代码段合并到最终解决方案中的完整代码:

function user_logged_in_product_already_bought() {
    if (!is_user_logged_in()) {
        return;
    }

    $user = wp_get_current_user();
    $allowed_roles = ['administrator', 'customer'];

    if (!array_intersect($allowed_roles, $user->roles)) {
        return;
    }

    global $woocommerce;

    $items = $woocommerce->cart->get_cart();

    foreach ($items as $item => $values) {
        $product_id = $values['data']->get_id();

        $order_query = new WP_Query([
            'post_type' => 'shop_order',
            'meta_query' => [
                [
                    'key' => '_customer_user',
                    'value' => get_current_user_id(),
                ],
                [
                    'key' => '_product_id',
                    'value' => $product_id,
                ],
                [
                    'key' => '_order_status',
                    'value' => 'processing',
                ],
            ],
        ]);

        if ($order_query->have_posts()) {
            wc_print_notice('您过去购买过此商品。是否要再次购买?', 'success');
            break;
        }
    }
}

add_action('woocommerce_before_checkout_form', 'user_logged_in_product_already_bought');

结论

通过实现上述解决方案,WooCommerce 店主现在可以在结帐时向特定客户显示自定义消息,告知他们过去购买了订单状态为“处理中”的产品。这将有助于增强客户体验,并为店主提供一个机会来鼓励再次购买。

常见问题解答

1. 此解决方案是否适用于任何类型的 WooCommerce 产品?

  • 是的,此解决方案适用于 WooCommerce 销售的任何类型的产品。

2. 我可以在自定义消息中包含什么信息?

  • 您可以根据需要在自定义消息中包含任何相关信息,例如产品名称、购买日期或任何其他相关详细信息。

3. 此解决方案是否与 WooCommerce 的所有版本兼容?

  • 此解决方案已针对 WooCommerce 的最新版本进行测试,但它也可能与较旧的版本兼容。

4. 我可以在哪里找到有关 WooCommerce 钩子和函数的更多信息?

5. 如果我需要其他自定义,我可以修改此解决方案吗?

  • 当然,此解决方案是一个起点,您可以根据您的特定需求进行修改和调整。