怎么在WooCommerce中实现「再来一单」的功能

在建设电子商务网站的时候,「于人方便就是于自己方便」,顾客觉得在你的网站上买东西方便快捷了,就会再此光临您的网站,并有可能把你的网站介绍给他们的朋友。在订单列表页面添加「再来一单」功能是一个方便客户的好时机。

这一点尤其适合快速消费品、耗材这些需要经常重复购买的电商网站,WooCommerce没有自带再来一单的功能,在这篇文章里,我将为大家介绍一下怎么实现再来一单的功能。

首先在订单列表页面添加「再来一单」按钮

首先,我们需要在用户的订单列表页面添加一个再来一单的按钮,这个比较好实现,WooCommerce 为我们提供了对应的 Hook,只需要把下面的代码添加的主题的 functions.php 中即可。

add_filter('woocommerce_my_account_my_orders_actions', 'wprs_add_reorder_button', 10, 2);
function wprs_add_reorder_button($actions, $order) {
    // 检查订单状态是否完成
    if ($order->has_status('completed')) {
        $actions['reorder'] = array(
            'url'  => wp_nonce_url(add_query_arg('reorder', $order->get_id()), 'woocommerce-reorder'),
            'name' => '再来一单'
        );
    }
    return $actions;
}

处理再来一单请求、实现再来一单功能

用户点击了再来一单的按钮后会提交请求到后端,我们需要分为几个步骤来处理这个请求,实现再来一单的功能。

  1. 安全验证,确认这个请求确实是用户提交的。
  2. 获取原始订单,根据前端发送过来的请求,也就是 reorder 这个参数中的订单ID获取原订单。
  3. 清空当前购物车(这一步根据您的逻辑,看是否需要)
  4. 添加原订单中的商品到购物车中,添加之前,我们需要先确认这些商品是否还有库存,有库存的添加到购物车,没有库存的通知用户。
  5. 前面几步处理完成后,跳转到购物车页面,一遍用户确认商品,方便结帐下单。
add_action('wp_loaded', 'wprs_handle_reorder_request', 20);
function wprs_handle_reorder_request() {
    if (!isset($_GET['reorder']) || !is_numeric($_GET['reorder'])) {
        return;
    }

    // 验证nonce
    if (!wp_verify_nonce($_GET['_wpnonce'], 'woocommerce-reorder')) {
        wc_add_notice('无效的请求', 'error');
        wp_safe_redirect(wc_get_page_permalink('myaccount'));
        exit;
    }

    // 获取原始订单
    $order_id = absint($_GET['reorder']);
    $order = wc_get_order($order_id);

    if (!$order) {
        wc_add_notice('订单不存在', 'error');
        wp_safe_redirect(wc_get_page_permalink('myaccount'));
        exit;
    }

    // 清空当前购物车
    WC()->cart->empty_cart();

    // 添加订单中的商品到购物车
    foreach ($order->get_items() as $item) {
        $product_id = $item->get_product_id();
        $variation_id = $item->get_variation_id();
        $quantity = $item->get_quantity();
        
        // 检查商品是否仍然存在且有库存
        $product = wc_get_product($product_id);
        if (!$product || !$product->is_purchasable() || !$product->is_in_stock()) {
            wc_add_notice(sprintf('商品 "%s" 已不可购买或缺货', $item->get_name()), 'error');
            continue;
        }

        // 添加到购物车
        if ($variation_id) {
            WC()->cart->add_to_cart($product_id, $quantity, $variation_id);
        } else {
            WC()->cart->add_to_cart($product_id, $quantity);
        }
    }

    // 跳转到购物车页面
    wp_safe_redirect(wc_get_cart_url());
    exit;
}

通过插件实现「再来一单」的功能

除了自定义代码,还有一些插件可以帮我们实现再来一单的功能,下面是两个不错的插件,有需要的朋友可以试用一下。

Related Posts

Leave a Reply

Your email address will not be published. Required fields are marked *