在建設(shè)電子商務(wù)網(wǎng)站的時候,「于人方便就是于自己方便」,顧客覺得在你的網(wǎng)站上買東西方便快捷了,就會再此光臨您的網(wǎng)站,并有可能把你的網(wǎng)站介紹給他們的朋友。在訂單列表頁面添加「再來一單」功能是一個方便客戶的好時機(jī)。
這一點(diǎn)尤其適合快速消費(fèi)品、耗材這些需要經(jīng)常重復(fù)購買的電商網(wǎng)站,WooCommerce沒有自帶再來一單的功能,在這篇文章里,我將為大家介紹一下怎么實(shí)現(xiàn)再來一單的功能。
首先在訂單列表頁面添加「再來一單」按鈕
首先,我們需要在用戶的訂單列表頁面添加一個再來一單的按鈕,這個比較好實(shí)現(xiàn),WooCommerce 為我們提供了對應(yīng)的 Hook,只需要把下面的代碼添加的主題的 functions.php 中即可。
add_filter('woocommerce_my_account_my_orders_actions', 'wprs_add_reorder_button', 10, 2);
function wprs_add_reorder_button($actions, $order) {
// 檢查訂單狀態(tài)是否完成
if ($order->has_status('completed')) {
$actions['reorder'] = array(
'url' => wp_nonce_url(add_query_arg('reorder', $order->get_id()), 'woocommerce-reorder'),
'name' => '再來一單'
);
}
return $actions;
}
處理再來一單請求、實(shí)現(xiàn)再來一單功能
用戶點(diǎn)擊了再來一單的按鈕后會提交請求到后端,我們需要分為幾個步驟來處理這個請求,實(shí)現(xiàn)再來一單的功能。
- 安全驗(yàn)證,確認(rèn)這個請求確實(shí)是用戶提交的。
- 獲取原始訂單,根據(jù)前端發(fā)送過來的請求,也就是 reorder 這個參數(shù)中的訂單ID獲取原訂單。
- 清空當(dāng)前購物車(這一步根據(jù)您的邏輯,看是否需要)
- 添加原訂單中的商品到購物車中,添加之前,我們需要先確認(rèn)這些商品是否還有庫存,有庫存的添加到購物車,沒有庫存的通知用戶。
- 前面幾步處理完成后,跳轉(zhuǎn)到購物車頁面,一遍用戶確認(rèn)商品,方便結(jié)帳下單。
add_action('wp_loaded', 'wprs_handle_reorder_request', 20);
function wprs_handle_reorder_request() {
if (!isset($_GET['reorder']) || !is_numeric($_GET['reorder'])) {
return;
}
// 驗(yàn)證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;
}
// 清空當(dāng)前購物車
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);
}
}
// 跳轉(zhuǎn)到購物車頁面
wp_safe_redirect(wc_get_cart_url());
exit;
}
通過插件實(shí)現(xiàn)「再來一單」的功能
除了自定義代碼,還有一些插件可以幫我們實(shí)現(xiàn)再來一單的功能,下面是兩個不錯的插件,有需要的朋友可以試用一下。


