Home WordpressWordPress cơ bản Tự động chuyển trạng thái đơn hàng trên WooCommerce

Tự động chuyển trạng thái đơn hàng trên WooCommerce

by admincp

Trang web thương mại điện tử yêu cầu theo dõi và quản lý các đơn đặt hàng, điều này có thể là một nhiệm vụ khó khăn cho người quản trị, tưởng tượng khi số lượng đơn đặt hàng gia tăng đồng nghĩa website có một lưu lượng truy cập cao mỗi ngày. Trong WooCommerce, một đơn hàng được tạo ra ngay sau khi quá trình Thanh toán được hoàn tất. Theo đó thứ tự trong giai đoạn từ thanh toán đến lúc giao hàng, đơn hàng được gán một trạng thái. Những trạng thái đơn hàng được thiết lập hoặc thay đổi bởi WooCommerce.

Mọi người khởi tạo kinh doanh và cửa hàng thương mại điện tử theo các lĩnh vực khác nhau. Đặc biệt là khi nói đến các sản phẩm số có link tải về, tất cả chúng ta có một cách tiếp cận khác nhau với mục đích cuối cùng là giao hàng đến khách hàng.

WooCommerce theo mặc định sản phẩm có sẵn để khách hàng tải về sau khi lệnh thanh toán được hoàn tất. Tuy nhiên có một tùy chọn trong mục WooCommerce > Settings > Products cho phép khách hàng có quyền tải link khi đơn đặt hàng đang trong giai đoạn sử lý:

Nhưng bạn có thể không muốn điều đó. Điều gì xẩy ra nếu bạn muốn tự động hoàn tất các đơn hàng

Sau khi thanh toán thành công cho đơn hàng, tình trạng sẽ được đánh dấu là “Processing” cho đến khi chủ cửa hàng tự tay thay đổi về trạng thái “Completed” .

Đây là một ý tưởng hay, đặc biệt trong trường hợp khối lượng đơn hàng trong ngày tăng cao. Một cách đơn giản để hiện thực hóa là tạo lệnh cho WooCommerce để tự động hoàn thành các đơn hàng khi chúng ở trạng thái đang sử lý.

Tự động kết thúc đơn hàng WooCommerce dựa trên phương thức thanh toán

Trong hầu hết các trường hợp, bạn sẽ cần phải làm điều này sau khi thanh toán đã được thực hiện thành công, và điều này chỉ có thể áp dụng khi người dùng không chọn thanh toán Cash-on-Delivery (COD). Chèn đoạn code dưới đây vào file functions.php của child theme, sẽ tự động chuyển đơn hàng về trạng thái Đã hoàn thành bất cứ khi nào thanh toán được thực hiện thành công. Do đó, trong mọi trường hợp trừ khi người sử dụng chọn hình thức giao hàng COD, các trạng thái đơn hàng sẽ tự động đánh dấu “Hoàn tất”.

add_action('woocommerce_order_status_changed', 'hoangweb_auto_complete_by_payment_method', 9999, 4);
function hoangweb_auto_complete_by_payment_method($order_id, $from, $to, $o)
{
	if ( ! $order_id ) {
		return;
	}
	global $product;
	$order = wc_get_order( $order_id );
	if ($order->data['status'] == 'onhold' ) {
		$payment_method=$order->get_payment_method();
		if ($payment_method!="paypal")	//cod
		{
			$order->update_status( 'completed' );
		}
	}
}

Ở đây, bạn sẽ sử dụng hook woocommerce_order_status_changed  để thay đổi tình trạng của một đơn hàng. Chỉ thay đổi tình trạng đơn hàng, khi khách hàng chọn phương thức thanh toán không phải là COD, trạng thái đơn hàng sẽ được đổi thành “Completed”. WooCommerce có bốn phương thức thanh toán mặc định: Chuyển khoản Ngân hàng (Bacs), Check payments (cheque), Cash on Delivery (cod) và PayPal. Tùy thuộc vào phương thức sử dụng, bạn sẽ cần phải sử dụng ID thích hợp ví dụ “cod” , “paypal” , “cod” , “paypal” .

Đoạn mã dưới đây sẽ tương thích với tất cả các phiên bản woocommerce ( WooCommerce 2.2 +).

/**
 * AUTO COMPLETE PAID ORDERS IN WOOCOMMERCE
 */
add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_paid_order', 10, 1 );
function custom_woocommerce_auto_complete_paid_order( $order_id ) {
    if ( ! $order_id )
    return;
    $order = wc_get_order( $order_id );
    // No updated status for orders delivered with Bank wire, Cash on delivery and Cheque payment methods.
    if ( ( 'bacs' == get_post_meta($order_id, '_payment_method', true) ) 
 ( 'cod' == get_post_meta($order_id, '_payment_method', true) ) 
 ( 'cheque' == get_post_meta($order_id, '_payment_method', true) ) ) {
        return;
    } 
    // For paid Orders with all others payment methods (with paid status "processing")
    elseif( $order->get_status()  === 'processing' ) {
        $order->update_status( 'completed' );
    }
}

Sử dụng đoạn mã dưới đây, nếu bạn chỉ muốn thay đổi trạng thái hoàn thành cho những đơn hàng đã trả tiền (được thiết lập bởi các cổng thanh toán):

add_action( 'woocommerce_payment_complete_order_status', 'wc_auto_complete_paid_order', 10, 3 );
function wc_auto_complete_paid_order( $status, $order_id, $order ) {
    return 'completed';
}

Vì hook, woocommerce_payment_complete_order_status chỉ được kích hoạt khi thanh toán trực tuyến được yêu cầu (không áp dụng đối với thanh toán “cheque” , “cod” hoặc “cod”). Vì vậy, không cần phải kiểm tra hoặc thêm điều kiện cho các cổng thanh toán nào.

Đây là cách duy nhất để tránh việc gửi 2 thông báo đến khách cùng một lúc. Một cho tình trạng đơn hàng đang sử lý “processing”, và một thông báo đơn hàng đã hoàn thành “completed”. Vì vậy, khách hàng chỉ nhận được 1 thông báo  vào thời điểm khi tình trạng đơn hàng đã hoàn tất “completed”.

Tự động kết thúc đơn hàng cho các sản phẩm số (vô hình)

Một trường hợp khác, bạn muốn tự động hoàn thành các đơn đặt hàng đối với các sản phẩm không hữu hình (vd sản phẩm số). Virtual product là những sản phẩm không nhìn thấy, hoặc sản phẩm số có thể tải về. Một trang web đăng ký thành viên hoặc phiếu giảm giá mà cung cấp mã giảm giá cho những người đã đăng ký.

Một cửa hàng cho dành cho những thành viên đăng ký (membership) có thể không có một hình thức hữu hình mà thay vào đó là một ngày hết hạn. Sản phẩm có thể tải về như phần mềm hoặc thậm chí là vé bộ phim, đó là những sản phẩm vô hình. Với hầu hết các sản phẩm vô hình, không có phương thức “Cash-on-Delivery” . Thanh toán được thực hiện ngay tại chỗ, vì vậy điều này không bao gồm điều kiện để kiểm tra các phương thức thanh toán được sử dụng ở đây, mà thay vào đó chỉ thêm một điều kiện để kiểm tra xem tất cả các sản phẩm trong đơn hàng có phải là các sản phẩm số hay không.

add_action('woocommerce_order_status_changed', 'hw_auto_complete_virtual', 9999,4);
function hw_auto_complete_virtual($order_id, $from, $to, $o)
{
	if ( ! $order_id ) {
		return;
	}
	global $product;
	$order = wc_get_order( $order_id );
	if ($order->data['status'] == 'processing') {
		$virtual_order = null;
		if ( count( $order->get_items() ) > 0 ) {
			foreach( $order->get_items() as $item ) {
				if ( 'line_item' == $item['type'] ) {
					$_product = $order->get_product_from_item( $item );
					if ( ! $_product->is_virtual() ) {
						// once we find one non-virtual product, break out of the loop
						$virtual_order = false;
						break;
					}
					else {
						$virtual_order = true;
					}
				}
			}
		}
		// if all are virtual products, mark as completed
		if ( $virtual_order ) {
			$order->update_status( 'completed' );
		}
	}
}

Sau khi kiểm tra nếu đơn hàng ở tình trạng đang sử lý, bạn cần phải check từng hạng mục theo thứ tự để xem nếu nó có phải là một SP virtual. Một đơn hàng có thể chứa nhiều mặt hàng như các sản phẩm, phí vận chuyển, vv. Trong đó, line_item đại diện cho sản phẩm. Nếu một item không phải là sản phẩm vô hình, tình trạng đơn hàng sẽ không được đánh dấu là hoàn thành.

Hãy cho mình biết suy nghĩ của bạn trong phần bình luận bên dưới bài viết này. Hãy theo dõi kênh chia sẻ kiến thức WordPress của Vinastar trên TwitterFacebook

Liên hệ

Công ty chuyên Thiết kế website uy tín nhất Miền Bắc: http://vinastar.net

Hotline tư vấn: 0989 48 3456

Nguồn: Sưu tầm trên internet

You may also like

Leave a Comment