最低订单金额取决于 WooCommerce 上的邮政编码和运输方式

问题描述 投票:0回答:2

如何根据特定邮政编码设置仅适用于送货/发货(但不适用于本地取货)的最低订单金额?

用例:一家餐厅在当地村庄送货,没有最低金额限制。但邻村应该有订单量。取货始终没有任何最低金额。

基于 WooCommerce 中除特定运输方式之外的最低订单金额答案代码,这是我的尝试:

add_action( 'woocommerce_check_cart_items', 'wc_minimum_required_order_amount' );
function wc_minimum_required_order_amount() {

// HERE Your settings
$minimum_amount     = 50; // The minimum cart total amount
$shipping_method_id = 'local_pickup'; // The targeted shipping method Id (exception)
$postcodes = array('82065', '82057', '82067'); // Define your targeted postcodes in the array
$postcode  = '82069'; // Initializing

// Get some variables
$cart_total     = (float) WC()->cart->total; // Total cart amount
$chosen_methods = (array) WC()->session->get( 'chosen_shipping_methods' ); // Chosen shipping method rate Ids (array)

// Only when a shipping method has been chosen
if ( ! empty($chosen_methods) ) {
    $chosen_method  = explode(':', reset($chosen_methods)); // Get the chosen shipping method Id (array)
    $chosen_method_id = reset($chosen_method); // Get the chosen shipping method Id
}

// If "Local pickup" shipping method is chosen, exit (no minimun is required)
if ( isset($chosen_method_id) && $chosen_method_id === $shipping_method_id ) {
    return; // exit
}

if ( isset($_POST['shipping_postcode']) && ! empty($_POST['shipping_postcode']) ) {
    $postcode = $_POST['shipping_postcode'];
    if ( empty($postcode) && isset($_POST['billing_postcode']) && ! empty($_POST['billing_postcode']) ) {
        $postcode = $_POST['billing_postcode'];
    }
} elseif ( $postcode = WC()->customer->get_shipping_postcode() ) {
    if ( empty($postcode) ) {
        $postcode = WC()->customer->get_billing_postcode();
    }
}

// Add an error notice is cart total is less than the minimum required
if ( $cart_total < $minimum_amount && ! empty($postcode) && in_array( $postcode, $postcodes ) ) {
    wc_add_notice( sprintf(
        __("The minimum required order amount is %s (your current order amount is %s).", "woocommerce"), // Text message
        wc_price( $minimum_amount ),
        wc_price( $cart_total )
    ), 'error' );
}
}
php wordpress woocommerce cart shipping-method
2个回答
2
投票

您的解决方案已经很接近了,但是缺少的是使用 in_array(),您可以使用它来检查邮政编码

所以你得到:

function action_woocommerce_check_cart_items() {
    // HERE Your settings
    $minimum_amount = 50; // The minimum cart total amount
    $shipping_method_id = 'local_pickup'; // The targeted shipping method Id (exception)
    $postcodes = array( 82065, 82057, 82067, 9800 ); // Define your targeted postcodes in the array

    // Get some variables
    $cart_total     = (float) WC()->cart->total; // Total cart amount
    $chosen_methods = (array) WC()->session->get( 'chosen_shipping_methods' ); // Chosen shipping method rate Ids (array)
    
    // Initialize
    $postcode = '';

    // Only when a shipping method has been chosen
    if ( ! empty($chosen_methods) ) {
        $chosen_method  = explode( ':', reset( $chosen_methods ) ); // Get the chosen shipping method Id (array)
        $chosen_method_id = reset( $chosen_method ); // Get the chosen shipping method Id
    }

    // If "Local pickup" shipping method is chosen, exit (no minimun is required)
    if ( isset($chosen_method_id) && $chosen_method_id === $shipping_method_id ) {
        return; // exit
    }
    
    // Get shipping postode
    $postcode = WC()->customer->get_shipping_postcode();
    
    // When empty
    if ( empty ( $postcode ) ) {
        if ( isset( $_POST['shipping_postcode'] ) ) {
            $postcode = $_POST['shipping_postcode'];
        } else {
            if ( isset( $_POST['billing_postcode'] ) ) {
                $postcode = $_POST['billing_postcode'];
            } else {
                $postcode = WC()->customer->get_billing_postcode();
            }
        }
    }
    
    // Still empty, exit
    if ( empty ( $postcode ) ) return;

    // Add an error notice is cart total is less than the minimum required and postcode occurs in the array
    if ( $cart_total < $minimum_amount && in_array( $postcode, $postcodes ) ) {
        // Your error message
        wc_add_notice( sprintf(
            __( 'The minimum required order amount is %s (your current order amount is %s).', 'woocommerce' ), // Text message
            wc_price( $minimum_amount ),
            wc_price( $cart_total )
        ), 'error' );
        
        // Optional: remove proceed to checkout button
        remove_action( 'woocommerce_proceed_to_checkout', 'woocommerce_button_proceed_to_checkout', 20 );
    }
}
add_action( 'woocommerce_check_cart_items' , 'action_woocommerce_check_cart_items', 10, 0 );

0
投票

是否可以为多个邮政编码组重复此操作?非常感谢您的代码。我尝试复制此内容以应用于不同的邮政编码,但它不允许我运行该操作两次。

© www.soinside.com 2019 - 2024. All rights reserved.