在建设电子商务网站的时候,「于人方便就是于自己方便」,顾客觉得在你的网站上买东西方便快捷了,就会再此光临您的网站,并有可能把你的网站介绍给他们的朋友。在订单列表页面添加「再来一单」功能是一个方便客户的好时机。
这一点尤其适合快速消费品、耗材这些需要经常重复购买的电商网站,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;
}
处理再来一单请求、实现再来一单功能
用户点击了再来一单的按钮后会提交请求到后端,我们需要分为几个步骤来处理这个请求,实现再来一单的功能。
- 安全验证,确认这个请求确实是用户提交的。
- 获取原始订单,根据前端发送过来的请求,也就是 reorder 这个参数中的订单ID获取原订单。
- 清空当前购物车(这一步根据您的逻辑,看是否需要)
- 添加原订单中的商品到购物车中,添加之前,我们需要先确认这些商品是否还有库存,有库存的添加到购物车,没有库存的通知用户。
- 前面几步处理完成后,跳转到购物车页面,一遍用户确认商品,方便结帐下单。
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;
}
通过插件实现「再来一单」的功能
除了自定义代码,还有一些插件可以帮我们实现再来一单的功能,下面是两个不错的插件,有需要的朋友可以试用一下。