TỔNG QUÁT
Mặt định woocommerce sẽ hiển thị toàn bộ các phương thức ship hiện có phù hợp với khách hàng và nội dung giỏ hàng. Như vậy có nghĩa là phương thức “Free shipping” và “Flat rate” và các phương thức khác sẽ cùng hiển thị. Để ẩn các phương thức ship khác khi “Free shipping” tồn tại ta sẽ thao tác một chút PHP hoặc dùng plugin.
Trong nội dung bài viết này mình sẽ không giới thiệu plugin mà chỉ chú trọng đến các đoạn code để thực hiện đều này thôi nhé.
Trước khi thêm code vào
Một chú ý quan trọng là để cho các đoạn code hoạt động chính xác thì trước khi thêm vào chúng ta cần xóa các cache của Woocommerce bằng cách như sau: vào
WooCommerce > System Status > Tools > WooCommerce Transients > Clear transients
Sau khi xóa ta thêm đoạn code bên dưới vào function.php để thực hiện việc ẩn các phương thức thanh toán khác nhé
Code ẩn các phương thức khác trừ Free Shipping
Chỉ hiển thị Free Shipping
Ẩn tất cả chỉ hiển thị free_shipping nếu nó tồn tại trong khu vực ship hiện tại.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/** * 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 ); |
Chỉ hiển thị Free ship và Local Pickup (tự đến lấy hàng)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
/** * 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 ); |
Hiển thị duy nhất Free shipping cho khu vực này (states hay phường xã) trừ khu vực này…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
/** * 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 ) { // các khu vực trừ ra $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; } |
Chúc các bạn tùy chỉnh thành công để mang lại trãi nghiệm tốt nhất cho khách hàng của mình nhé
Dịch từ: https://docs.woocommerce.com/document/hide-other-shipping-methods-when-free-shipping-is-available/