将WooCommerce虚拟产品排除在免费送货之外

时间:2017-12-12 21:38:56

标签: php wordpress woocommerce

在我的WordPress / WooCommerce网站上,我们为超过500丹麦克朗的所有订单提供免费送货服务。这工作得非常好。当我们以数字方式发送所有产品时,我们将礼品卡作为虚拟产品制作。问题是出于某种原因,虚拟产品计入此500 DKK免费送货限制。

我们尝试做的是将所有虚拟产品排除在免费送货上限之外。

我不知道如何解决这个问题。我们的网站是:http://detitalienskekoekken.dk.linux99.unoeuro-server.com

它的设置方式是我们有一个插件,提供各种传递方法。其中一种方法(送到商店)的成本为49丹麦克朗,但达到500丹麦克朗时,您可以免费获得此特定选项。

我还没有能够在网上找到这个代码,所以很抱歉没有提供此代码。

2 个答案:

答案 0 :(得分:1)

更新您的特定插件:

add_filter('woocommerce_package_rates', 'custom_free_shipping_option', 15, 2 );
function custom_free_shipping_option($rates, $package){

    // HERE set the "minimum order amount" for free shipping
    $limit = 500;

    $free_total = 0;

    // Get the cart content total excluding virtual products
    foreach( WC()->cart->get_cart() as $cart_item )
        if( ! $cart_item['data']->is_virtual( ) )
            $free_total += $cart_item['line_total'];

    // Set the cost to 0 based on specific cart content total
    if( $free_total > $limit )
        foreach ( $rates as $rate_key => $rate )
            if( 'pakkelabels_shipping_gls' === $rate->method_id )
                $rates[$rate->id]->cost = 0;

    return $rates;
}

代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。

它应该适用于您的特定运输方式。

原始回答 (适用于经典"免费送货"方法)

以下是必要的代码,将取代送货方式免费送货"最低订单金额"不包括虚拟产品的选项:

add_filter('woocommerce_package_rates', 'custom_free_shipping_option', 10, 2 );
function custom_free_shipping_option($rates, $package){

    // HERE set the "minimum order amount" for free shipping
    $limit = 500;

    $free_total = 0;

    // Get the cart content total excluding virtual products
    foreach( WC()->cart->get_cart() as $cart_item )
        if( ! $cart_item['data']->is_virtual( ) )
            $free_total += $cart_item['line_total'];

    // Disabling free shipping method based on specific cart content total
    if( $free_total < $limit )
        foreach ( $rates as $rate_key => $rate )
            if( 'free_shipping' == $rate->method_id )
                unset( $rates[ $rate_key ] );

    return $rates;
}

代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。

经过测试和工作

  

因此,您甚至可以在免费送货设置中删除此选项。

答案 1 :(得分:0)

我已更新代码,以便从总金额中排除虚拟产品,免运费。

此外,它只会在可用时显示免费送货,而隐藏其余部分。

function custom_free_shipping_option($rates, $package){
    // HERE set the "minimum order amount" for free shipping
    $limit = 100;
    $free_total = 0;

    // Get the cart content total excluding virtual products
    foreach( WC()->cart->get_cart() as $cart_item )
        if( ! $cart_item['data']->is_virtual( ) )
            $free_total += $cart_item['line_total'];

    //If the total reaches the minimum order, only the free shipping is shown
    if( $free_total > $limit ){
        $free = array();
        foreach ( $rates as $rate_id => $rate ) {
            if ( 'free_shipping' === $rate->method_id ) {
                $free[ $rate_id ] = $rate;
                break;
            }
        }
        return ! empty( $free ) ? $free : $rates;   
    }
    else{
        //If it does not reach the minimum order, the shipments that are NOT free are shown
        $free = array();
        foreach ( $rates as $rate_id => $rate ) {
            if ( 'free_shipping' != $rate->method_id ) {
                $free[ $rate_id ] = $rate;
            }
        }
        return ! empty( $free ) ? $free : $rates;   
    }
}
add_filter('woocommerce_package_rates', 'custom_free_shipping_option', 15, 2 );