基于服务自定义交付类型和 Woocommerce 中的项目总数的运费

Shipping rates based on service custom delivery type and items total in Woocommerce

我只需要一点帮助来在我的 WordPress 和 woocommerce 网站上显示正确的运费。

我将运费设置如下:

  1. 固定费率(送货):10 美元
  2. 免费送货(免费送货)
  3. 本地取件(Pickup):$0

当我下订单并进入结帐页面时,它为我提供了 select 从订单总计下方发货的选项。我不希望用户能够从选项中进行选择。

基本上我需要的是:

  1. 如果服务类型是自取,隐藏送货选项,只显示本地自取选项
  2. 如果服务类型是送货且订单总额为 60 美元或以下,则仅显示统一费率选项。
  3. 如果服务类型为送货且订单总额超过 60 美元,则仅 显示免费送货选项。

有人知道怎么设置吗?还有一点需要注意的是,当你加入购物车时,在菜单页面上,当你打开底部的订单审查容器时,它会自动添加一个运费,如果可以的话,最好不要在结账时才设置这个费用?

这是包含食品的网站:https://puffpastrydelights.com/order-online/

到目前为止我已经尝试过了,但它不起作用:

add_filter( 'woocommerce_package_rates', 'bbloomer_unset_shipping_when_free_is_available_in_zone');
   
function bbloomer_unset_shipping_when_free_is_available_in_zone( $rates ) {
    $service = $_POST['wfs_service_type']; 
    if ($service == 'pickup') {              
        unset( $rates['flat_rate:1'] );
        unset( $rates['free_shipping:3'] );
    }else if ($service == 'delivery'){
        unset( $rates['local_pickup:2'] );
        if ( isset( $rates['free_shipping:3'] )) {
        unset( $rates['flat_rate:1'] );
        }
    }
    return $rates;
}

您的 service_type 保存在 cookie 中。您可以通过 $_COOKIE 检索。试试下面的代码。

add_filter( 'woocommerce_package_rates', 'unset_shipping_based_on_service_type_cart_total', 99 );
function unset_shipping_based_on_service_type_cart_total( $rates ) {

    $total   = WC()->cart->get_cart_contents_total();
    
    $service = ( isset( $_COOKIE['service_type'] ) && $_COOKIE['service_type'] != '' ) ? $_COOKIE['service_type'] : 'pickup' ;

    if ($service == 'pickup') {              
        unset( $rates['flat_rate:1'] );
        unset( $rates['free_shipping:3'] );
    }else if ( $service == 'delivery' && $total <= 60 ){
        unset( $rates['local_pickup:2'] );
        unset( $rates['free_shipping:3'] );
    }else if ( $service == 'delivery' && $total > 60 ){
        unset( $rates['local_pickup:2'] );
        unset( $rates['flat_rate:1'] );
    }
    return $rates;
}

已更新

您需要先在 WC Session 变量中设置发布的交付类型。然后需要对您的代码进行如下更改:

add_action( 'init', 'set_service_type_in_a_wc_session' );
function set_service_type_in_a_wc_session() {
    // Check that user session is set
    if ( ! ( is_user_logged_in() || is_admin() )
    && isset(WC()->session) && ! WC()->session->has_session() ) {
        WC()->session->set_customer_session_cookie( true );
    }
    // Set a posted value in a WC Session variable
    if ( isset($_POST['wfs_service_type']) ) {
        WC()->session->set('service_type', sanitize_key($_POST['wfs_service_type']) );
    }
}

add_filter( 'woocommerce_package_rates', 'unset_shipping_based_on_service_type_cart_total', 100, 2 );
function unset_shipping_based_on_service_type_cart_total( $rates, $package ) {
    // Get discounted items subtotal for the current shipping package
    $total = array_sum( wp_list_pluck( $package['contents'], 'line_total' ) );
    $service = WC()->session->get('service_type');

    if ( 'pickup' === $service ) {
        unset($rates['flat_rate:1']);
        unset($rates['free_shipping:3']);
    }
    elseif ( 'delivery' === $service ) {
        unset($rates['local_pickup:2']);

        if ( $total < 60 ){
            unset($rates['free_shipping:3']);
        } else {
            unset($rates['flat_rate:1']);
        }
    }
    return $rates;
}

代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。

不要忘记清空购物车以刷新运输缓存数据。