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

从装运选项中排除产品类别

祁建业
2023-03-14

在woocommerce中,我有两种发货方式,统一费率标准(方法1)和统一费率特快专递(方法2)。两个产品类别,X和Z,只能使用方法1,所以如果购物车包含任何来自类别X或Z的物品,我想在结帐时从发货选项中隐藏方法2。

我搜索了Stackoverflow,发现这篇文章隐藏了Woocommerce中特定产品的特定运输方法,并试图应用答案,但没有成功。我相信下面的代码是合适的。

function specific_products_shipping_methods( $rates, $package ) {

   $product_ids = array( 39 ); // HERE set the product IDs in the array
   $method_id = 'Express_Post:5'; // HERE set the shipping method ID
   $found = false;

   // Loop through cart items Checking for defined product IDs
   foreach( $package['contents'] as $cart_item ) {
       if ( in_array( $cart_item['product_id'], $product_ids ) ){
           $found = true;
           break;
       }
   }
   if ( $found )
       unset( $rates[$method_id] );

   return $rates;
}

运输方式2的id为5,产品类别X的id为39。我禁用、保存、启用和保存了运输方法2。当我将上述内容作为代码片段添加到php文件中时,它要么会破坏网站(“您的网站遇到技术困难”),要么在输入发货地址后,我会被卡住(纺车),因此无法前往购物车检查代码是否正常工作。

[更新]

非常感谢@Kelvin Mariano的回复。我尝试了你的代码很多次,有几个版本,以防我出了什么问题。我不再收到任何错误,但即使购物车包含不合格的商品,这两种运送方法仍然会出现。

相关运输方法的回声输出如下:

  [flat_rate:5] => WC_Shipping_Rate Object
  (
  [data:protected] => Array
    (`

        [id] => flat_rate:5
        [method_id] => flat_rate
        [instance_id] => 5
        [label] => Express Post

我尝试的代码是这样的:

    function bz_specific_products_shipping_methods( $rates, $package )  {

    $product_ids = array( 39 ); // HERE set the product IDs in the array
    //$method_id = 'flat_rate:5'; // HERE html" target="_blank">set the shipping method ID
    $method_id = 'flat_rate:5'; // HERE set the shipping method ID
    $found = false;

    /*
    //please remove this comment to view all shipping methods and  their   information
   `echo "<pre>";
    print_r( $rates );
    echo "</pre>";
    exit();*/`

    // Loop through cart items Checking for defined product IDs
    foreach( $package['contents'] as $cart_item ) {
    if ( in_array( $cart_item['product_id'], $product_ids ) ){
       $found = true;
       break;
    }
    }

    if ( $found ){
    if( isset( $rates[$method_id] ) ){
        unset( $rates[$method_id] );
    }
    }

    return $rates;
    }

    //use the filter this is important
    add_filter( 'woocommerce_package_rates','bz_specific_products_shipping_methods', 10, 2 );

更新二

Array
(
[flat_rate:1] => WC_Shipping_Rate Object
    (
        [data:protected] => Array
            (
                [id] => flat_rate:1
                [method_id] => flat_rate
                [instance_id] => 1
                [label] => Flat rate Standard
                [cost] => 9.00

            )


    )

[flat_rate:5] => WC_Shipping_Rate Object
    (
        [data:protected] => Array
            (
                [id] => flat_rate:5
                [method_id] => flat_rate
                [instance_id] => 5
                [label] => Express Post
                [cost] => 11.77

共有2个答案

严阳成
2023-03-14

我做了两个重要的更改,更改了函数的名称以避免冲突,并更改了为特定测试而删除的方法。

请注意,我看到的方法都是小写字母,确保你的方法是第一个大写字母,这会有所不同;

请注意,我留下了一个注释,您可以使用它来正确查看id。

注意,我在unset之前放了一个if,以避免php错误

function bz_specific_products_shipping_methods( $rates, $package ) {

   $product_ids = array( 149 ); // HERE set the product IDs in the array
   //$method_id = 'Express_Post:5'; // HERE set the shipping method ID
   $method_id = 'free_shipping:2'; // HERE set the shipping method ID
   $found = false;

   /*
    //please remove this comment to view all shipping methods and their information
   echo "<pre>";
   print_r( $rates );
   echo "</pre>";
   exit();*/

    // Loop through cart items Checking for defined product IDs
    foreach( $package['contents'] as $cart_item ) {
       if ( in_array( $cart_item['product_id'], $product_ids ) ){
           $found = true;
           break;
       }
    }

    if ( $found ){
        if( isset( $rates[$method_id] ) ){
            unset( $rates[$method_id] );
        }
    }

   return $rates;
}

//use the filter this is important
add_filter( 'woocommerce_package_rates', 'bz_specific_products_shipping_methods', 10, 2 );

这在我这里的测试中非常有效,您可能没有正确给出名称,或者您的woocommerce或php已经过时,因此站点消息遇到了困难,或者出现了白色屏幕的循环

东门茂实
2023-03-14

我发现上面的代码干扰了插件WooCommerce高级免费送货的操作。我停用了那个插件并删除了上面的代码。然后我安装了WooCommerce的高级平价送货,那个插件允许我设置参数,阻止这两个产品类别符合送货方法2。

 类似资料:
  • 我用wordpress 4.2.2和woocommerce 2.3.11建立了销售葡萄酒的电子商务。我创建了一个自定义函数,用于在6的倍数上仅使用瓶子结束订单。在此之前,我没有任何问题,但我有两个类别,包装为6瓶,所以我想避免这两个类别将计入数量合计项目购物车。我不是php专家,所以我尝试创建一个函数来检查每个项目是否在类别内,如果属于一个包类别,则减去一个项目。只有当这两个类别中有一个项目时,这

  • 问题内容: 我有一个项目,该项目依赖于由供应商控制的工件。该工件包含一些我依赖的类,其中一些类较旧并且会引起问题。有没有办法让Maven自动扩展jar,删除类并将它们重新打包为依赖项?我会举一个例子。 所以- 我需要使用在项目网站,但我需要使用从神器。我无法修改Supplier:artifact或us:dependency。 有任何想法吗?! 问题答案: 从版本2.0.9开始,maven保留了类路

  • 在WooCommerce中,基于“WooCommerce获取变体产品价格”回答代码,我一直在使用以下内容显示我的变量产品下拉列表中每个变体旁边的价格: 它适用于所有产品,除了一个(我使用一个单独的插件作为礼品卡)。 是否可以排除一个特定的产品ID或一个产品类别,或仅适用于特定的产品类别?如果是,应向代码中添加哪些内容,以及在何处应用这些内容? 我还使用Woo折扣规则插件进行价格折扣,代码如下:

  • 灵感来自于获取与子类别的WooCommerce类别,我正在创建一个下拉部分,我想知道是否有任何方法从父类别中删除永久链接,如果它有一个子类别。 下面是我的代码示例: 只有在没有子术语的情况下,如何显示顶级产品类别术语的链接?

  • 我正在建立一个电子商务网站。我的产品有点问题。 “添加到购物车”按钮对简单的产品效果很好,但对可变的产品不起作用。它给出了一个通知。 我到处找,在网上试了几条建议,但都不管用。所以我查看了WooCommerce源文件:。 在函数: 所以我尝试回声,和。它们都没有任何内容,因为当我回声时:它不会输出任何内容。 有什么建议吗?

  • 我有以下代码,用于从WooCommerce产品类别小部件中删除除管理员和批发客户(自定义用户级别)之外的所有用户的“批发类别”(通过slug)。 这非常好,但是它只删除了父类别,留下了所有的子类别。我如何也删除“批发类别”的子类别? 谢啦