当前位置: 首页 > 知识库问答 >
问题:

隐藏特定配送类别的免费配送,仅适用于Woocommerce

宋鸿德
2023-03-14

我们的商业产品种类繁多,其中一些不是我们自己的,也不是我们自己供应的。我正在尝试设置一个功能,如果购物车中的产品属于“额外”运输类别,则禁用免费运输。

如果有任何其他产品不属于运输类别“额外”,免费送货仍然适用。因此,如果购物车中有5种产品都属于运输类别“额外”,而没有其他产品,将收取5美元的费用。如果有任何其他产品不在该运输类别,免费送货再次适用。

我在互联网上搜寻解决方案,到目前为止,我得到的是:

function hide_shipping_methods( $available_shipping_methods, $package ) {
    $shipping_classes = array( 'Extra', 'some-shipping-class-2' );
    $excluded_methods = array( 'free_shipping' );
    $found = $others = false;
    $shipping_class_exists = false;
    
    foreach( $package['contents'] as $key => $value )
        if ( in_array( $value['data']->get_shipping_class(), $shipping_classes ) ) {
            $shipping_class_exists = true;
            break;
        }else {
            $others = true; // NOT the shipping class
            break;
        }
    if ( $shipping_class_exists && !others) {
        $methods_to_exclude = array();
        foreach( $available_shipping_methods as $method => $method_obj )
            if ( in_array( $method_obj->method_id, $excluded_methods ) )
                $methods_to_exclude[] = $method;
        if ( $methods_to_exclude )
            foreach ( $methods_to_exclude as $method )
                unset( $available_shipping_methods[$method] );
    }
    return $available_shipping_methods;
}
add_filter( 'woocommerce_package_rates', 'hide_shipping_methods', 10, 2 );

然而,它似乎不起作用。我的产品已经在运输类额外,但每当我把他们添加到购物车仍然是免费的运输。

共有1个答案

陈龙野
2023-03-14

有一些错误,你的代码可以简化。要以独占方式禁用特定配送类别的免费配送,请尝试以下重新访问的代码:

add_filter( 'woocommerce_package_rates', 'hide_free_shipping_conditionally', 10, 2 );
function hide_free_shipping_conditionally( $rates, $package ) {
    // Define the targeted shipping classes slugs (not names)
    $targeted_classes = array( 'extra' ); 
    
    $found = $others = false; // Initializing
    
    // Loop through cart items for current shipping package
    foreach( $package['contents'] as $item ) {
        if ( in_array( $item['data']->get_shipping_class(), $targeted_classes ) ) {
            $found = true;
        } else {
            $others = true;
        }
    }
    
    // When there are only items from specific shipping classes exclusively
    if ( $found && ! $others ) {
        // Loop through shipping methods for current shipping package
        foreach( $rates as $rate_key => $rate ) {
            // Targetting Free shipping methods
            if ( 'free_shipping' === $rate->method_id ) {
                unset($rates[$rate_key]); // Remove free shipping option(s)
            } 
        }
    }
    return $rates;
}

代码进入函数。活动子主题(或活动主题)的php文件。应该行得通。

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

 类似资料:
  • 问题内容: 有没有一种方法可以指定JAXB在XML模式中用于编组/解编对象的适配器? 例如,如果我想将以下内容解析为整数: 我可以在架构中使用以下内容: 当我通过XJC工具运行模式时,应使用Integer.decode()作为值为0x1234的Integer或十进制4660来解码字符串“ 0x1234”。生成的Adapter类正确反映了这一点: 但是,当我想将值编组回XML元素(这是String文

  • 我将nginx设置为一种静态文件服务器。出于某种原因,只有当我去123.123.123.123/或123.123.123.123时,它才会起作用。然而,当我去123.123.123.123/static/content/或123.123.123.123/static/content/another.mp3它返回404未找到。下面是位于中并链接到的配置文件。我真的很困惑为什么它不起作用。 如有任何指

  • 问题内容: 我有一个默认视图控制器是的地方。当我在中推某个视图时,我希望能够隐藏UITabBarController的UITabBar 。 我尝试添加: 在我提出观点之前,但这似乎并不能解决问题。 关于我应该做什么或什至可能的任何提示?提前致谢! 问题答案: 这个更好: 您必须在要推入视图的控制器上设置hidesBottomBarWhenPushed = YES …

  • 问题内容: 我对Spring框架很陌生,遇到了以下问题。 我有一个接口,由class 和实现。 我将以下bean定义添加到 我想自动连接以下两个实现类。 上面的代码抛出错误为 无法自动写入字段:com.abc.ClassA1 com.abc.SomeClass.classA1; 嵌套的异常是org.springframework.beans.factory.NoSuchBeanDefinition

  • 我的产品有两个基于类别的发货类。每次更新产品后,它都会丢失发货类,我不知道为什么。 然而,我试图通过编程方式为“保存时”的产品分配适当的装运类别: 指定类别= 这是我的代码: 但这并不像预期的那样工作。当我对任何产品(即使是特定类别的产品)进行更改时,装运类总是变成1002。 你能告诉我我做错了什么吗?

  • 我确实有一些独特的要求,我想隐藏要从特定角色用户中选择的角色。 例如,我有一个角色名称admin、部门1、部门2和部门3。作为管理员,我应该只能在门户中看到部门1、部门2和部门3的角色管理。 但如果我为管理员定义权限,他/她可以管理角色。管理员用户可以查看Liferay中可用OOTB的所有角色。 有人能帮我配置一下吗?