Ẩn các phương thức giao hàng khác khi có "Giao hàng miễn phí"

Tổng quat

Theo mặc định, WooCommerce sẽ hiển thị tất cả các phương thức vận chuyển phù hợp với khách hàng và nội dung giỏ hàng. Điều này có nghĩa là Giao hàng miễn phí cũng sẽ hiển thị cùng với Giá cố định và các Phương thức vận chuyển khác. Chức năng ẩn tất cả các phương thức khác và chỉ hiển thị Giao hàng miễn phí yêu cầu mã PHP tùy chỉnh hoặc plugin / tiện ích mở rộng.

Nếu bạn muốn thấy tính năng này được thêm vào lõi WooCommerce, hãy truy cập Bảng ý tưởng của chúng tôi và thêm phiếu bầu của bạn vào đó. Ý tưởng càng trở nên phổ biến thì các nhà phát triển của chúng tôi càng được ưu tiên xem xét.

Thêm mã

Trước khi thêm đoạn mã, hãy xóa bộ nhớ cache WooCommerce của bạn. Đi tới WooCommerce> Trạng thái hệ thống> Công cụ> Chuyển tiếp WooCommerce> Xóa chuyển tiếp

Thêm mã này vào tệp chủ đề con của bạn hoặc thông qua một plugin cho phép thêm các chức năng tùy chỉnh, chẳng hạn như plugin Đoạn mã. Vui lòng không thêm mã tùy chỉnh trực tiếp vào tệp chủ đề mẹ của bạn vì mã này sẽ bị xóa hoàn toàn khi bạn cập nhật chủ đề.functions.php functions.php

Đoạn mã PHP

Làm cách nào để chỉ hiển thị Giao hàng Miễn phí?

Ẩn mọi thứ nhưng free_shipping nếu nó có sẵn và tương thích với các Vùng vận chuyển.

/**
 * Hide shipping rates when free shipping is available.
 * Updated to support WooCommerce 2.6 Shipping Zones.
 *
 * @param array $rates Array of rates found for the package.
 * @return array
 */
function my_hide_shipping_when_free_is_available( $rates ) {
	$free = array();
	foreach ( $rates as $rate_id => $rate ) {
		if ( 'free_shipping' === $rate->method_id ) {
			$free[ $rate_id ] = $rate;
			break;
		}
	}
	return ! empty( $free ) ? $free : $rates;
}
add_filter( 'woocommerce_package_rates', 'my_hide_shipping_when_free_is_available', 100 );

Làm cách nào để chỉ hiển thị Nhận hàng tại địa phương và Giao hàng miễn phí?

Ẩn tất cả mọi thứ nhưng free_shippinglocal_pickup nếu nó có sẵn và tương thích với Vận Chuyển Khu.

/**
 * Hide shipping rates when free shipping is available, but keep "Local pickup" 
 * Updated to support WooCommerce 2.6 Shipping Zones
 */

function hide_shipping_when_free_is_available( $rates, $package ) {
	$new_rates = array();
	foreach ( $rates as $rate_id => $rate ) {
		// Only modify rates if free_shipping is present.
		if ( 'free_shipping' === $rate->method_id ) {
			$new_rates[ $rate_id ] = $rate;
			break;
		}
	}

	if ( ! empty( $new_rates ) ) {
		//Save local pickup if it's present.
		foreach ( $rates as $rate_id => $rate ) {
			if ('local_pickup' === $rate->method_id ) {
				$new_rates[ $rate_id ] = $rate;
				break;
			}
		}
		return $new_rates;
	}

	return $rates;
}

add_filter( 'woocommerce_package_rates', 'hide_shipping_when_free_is_available', 10, 2 );

Chỉ hiển thị giao hàng miễn phí ở tất cả các tiểu bang ngoại trừ…

Chỉ hiển thị giao hàng miễn phí ở tất cả các tiểu bang ngoại trừ danh sách loại trừ. Ẩn giao hàng miễn phí nếu khách hàng ở một trong các trạng thái được liệt kê:

/**
 * Hide ALL shipping options when free shipping is available and customer is NOT in certain states
 *
 * Change $excluded_states = array( 'AK','HI','GU','PR' ); to include all the states that DO NOT have free shipping
 */
add_filter( 'woocommerce_package_rates', 'hide_all_shipping_when_free_is_available' , 10, 2 );

/**
 * Hide ALL Shipping option when free shipping is available
 *
 * @param array $available_methods
 */
function hide_all_shipping_when_free_is_available( $rates, $package ) {
 
	$excluded_states = array( 'AK','HI','GU','PR' );
	if( isset( $rates['free_shipping'] ) AND !in_array( WC()->customer->shipping_state, $excluded_states ) ) :
		// Get Free Shipping array into a new array
		$freeshipping = array();
		$freeshipping = $rates['free_shipping'];
 
		// Empty the $available_methods array
		unset( $rates );
 
		// Add Free Shipping back into $avaialble_methods
		$rates = array();
		$rates[] = $freeshipping;
 
	endif;
 
	if( isset( $rates['free_shipping'] ) AND in_array( WC()->customer->shipping_state, $excluded_states ) ) {
 
		// remove free shipping option
		unset( $rates['free_shipping'] );
 
	}

	return $rates;
}

Có một plugin nào có sẵn cho việc này không?

Có, bạn cũng có thể sử dụng plugin miễn phí này thay vì hai đoạn mã đầu tiên: WC Hide Shipping Methods – WordPress plugin | WordPress.org