提问者:小点点

WooCommerce公告:地址变更如何重新触发?


受这个回答代码的启发,我写了下面的代码,在WooCommerce结账时添加一个错误通知,条件是(他们将不可运输的产品(通过运输类别标识)添加到购物车,并且不在我的本地交付区(即他们的邮政)代码属于世界其他地区),并且只有皮卡可用(仅通过可用的运输方式标识)。

add_action('woocommerce_after_checkout_validation', 'get_zone_info', 10 );
function get_zone_info( ) {
    // Get cart shipping packages
    $shipping_packages =  WC()->cart->get_shipping_packages();

    // Get the WC_Shipping_Zones instance object for the first package
    $shipping_zone = wc_get_shipping_zone( reset( $shipping_packages ) );

    $zone_id   = $shipping_zone->get_id(); // Get the zone ID
    $zone_name = $shipping_zone->get_zone_name(); // Get the zone name

    $shipping_class_target = 87;
    $in_cart = 0;
    foreach ( WC()->cart->get_cart_contents() as $key => $values ) {
        if ( $values[ 'data' ]->get_shipping_class_id() == $shipping_class_target ) {
            $in_cart = 1;
            break;
        }
    }

    if ( $zone_name=='Locations not covered by your other zones' && $in_cart==1 || $zone_id==0 && $in_cart==1 ) {
        //wc_print_notice( __( '<p>Count_ships: ' .$counter_ship. ' Cart id: ' . $in_cart .  ' | Zone id: ' . $zone_id . ' | Zone name: ' . $zone_name . '</p>', 'woocommerce' ), 'success' );
        wc_print_notice( __( '<b>ONLY PICKUP IS AVAILABLE</b><br>To have courier delivery, please goto your cart and remove products which cannot be shipped', 'woocommerce' ), 'success' );
    } else {
        //donothing
    }
}

我有两个问题:

1-通知检查不会在每次地址更改时重新触发

2.我使用Silkypress的WooCommerce多步结账专业版,希望在订单部分出现此通知...然而,当我激活此插件时,上述通知根本不起作用。
我已经联系他们寻求支持,但感谢任何帮助。


共1个答案

匿名用户

或者,您可以换一种方式思考,自动禁用除本地取货之外的所有装运方法(如果购物车中至少有一种产品的装运类别id等于指定的装运类别id)。

基于:

  • 在WooCommerce中隐藏特定运输类别的运输方式
  • 在WooCommerce中隐藏特定运输类别的运输方式

然后,您可以使用自定义函数检查购物车中是否有具有特定运输类别标识的产品:

// check if the products in the cart have a specific shipping class id
function check_product_in_cart_according_shipping_class_id() {

    $shipping_class_target = 87;
    $in_cart = false;

    // check if in the cart there is at least one product with the shipping class id equal to "87"
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $product = $cart_item['data'];
        $shipping_class = $product->get_shipping_class_id();
        if ( $shipping_class == $shipping_class_target ) {
            $in_cart = true;
            return $in_cart;
        }
    }
    return $in_cart;
}

通过另一个自定义函数,您可以获得无法发货的产品列表(因此发货类id等于87的产品):

// gets products that have a specific shipping class
function get_product_in_cart_according_shipping_class_id() {

    $shipping_class_target = 87;
    $product_list = '<ul>';
    
    // check if in the cart there is at least one product with the shipping class id equal to "87"
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $product = $cart_item['data'];
        $shipping_class = $product->get_shipping_class_id();
        if ( $shipping_class == $shipping_class_target ) {
            $sku = $product->get_sku();
            $name = $product->get_name();
            $qty = $cart_item['quantity'];
            $product_list .= '<li>' . $qty . ' x ' . $name . ' (' . $sku . ')</li>';
        }
    }
    $product_list .= '</ul>';
    return $product_list;
}

然后禁用除本地提货以外的所有运输方式:

// disable all shipping methods except local pickup based on product shipping class
add_filter( 'woocommerce_package_rates', 'disable_shipping_methods_based_on_product_shipping_class', 10, 2 );
function disable_shipping_methods_based_on_product_shipping_class( $rates, $package ) {

    $in_cart = check_product_in_cart_according_shipping_class_id();

    // if it is present, all shipping methods are disabled except local pickup
    if ( $in_cart ) {
        foreach( $rates as $rate_key => $rate ) {
            if ( $rate->method_id != 'local_pickup' ) {
                unset($rates[$rate_key]);
            }
        }
    }
    
    return $rates;

}

最后,它在购物车和结帐页面上添加了自定义通知
我创建了两个函数,因为在购物车页面上,当添加或删除产品时,通知需要更新,并且使用woocommerce\u-before\u-calculate\u-totals钩子会在结帐时引起多个通知。

在购物车中:

// add custom notice in cart
add_action( 'woocommerce_before_calculate_totals', 'add_custom_notice_in_cart' );
function add_custom_notice_in_cart() {
    // only on the cart page
    if ( ! is_cart() ) {
        return;
    }
    $in_cart = check_product_in_cart_according_shipping_class_id();
    if ( $in_cart ) {
        $products = get_product_in_cart_according_shipping_class_id();
        wc_clear_notices();
        wc_add_notice( sprintf( __( 'Only <strong>Local Pickup</strong> shipping method is available. These products cannot be shipped:<br>%s', 'woocommerce' ), $products ), 'notice' );
    }
}

在结账:

// add custom notice in checkout
add_action( 'woocommerce_checkout_before_customer_details', 'add_custom_notice_in_checkout' );
function add_custom_notice_in_checkout() {
    $in_cart = check_product_in_cart_according_shipping_class_id();
    if ( $in_cart ) {
        $products = get_product_in_cart_according_shipping_class_id();
        wc_clear_notices();
        wc_add_notice( sprintf( __( 'Only <strong>Local Pickup</strong> shipping method is available. These products cannot be shipped:<br>%s', 'woocommerce' ), $products ), 'notice' );
    }
}

代码已经过测试并有效。将其添加到活动主题的functions.php.