Php 仅适用于英国和Woocommerce 3中的特定产品的免定制配送

Php 仅适用于英国和Woocommerce 3中的特定产品的免定制配送,php,wordpress,woocommerce,shipping,country,Php,Wordpress,Woocommerce,Shipping,Country,我一直在尝试为客户的促销产品创建一个免费送货选项,该产品将在全球范围内发货,但只对来自英国的订单提供免费送货选项。因此,当有人从美国或香港订购时,通常会采用税率。但不知何故,我不能把这些国家排除在航运类之外。(我没有使用免费送货方法,因为当我尝试时,它适用于所有产品,这就是为什么我为此创建了一个送货类) 有人能帮我吗 非常感谢 很抱歉看到了德国的屏幕截图,但是这是不可能设置装运区和装运类别的吗? 您可以设置2个配送区:英国和世界其他地区,并添加您想要的产品配送类别。如果您尝试了此方法,但仍然不起

我一直在尝试为客户的促销产品创建一个免费送货选项,该产品将在全球范围内发货,但只对来自英国的订单提供免费送货选项。因此,当有人从美国或香港订购时,通常会采用税率。但不知何故,我不能把这些国家排除在航运类之外。(我没有使用免费送货方法,因为当我尝试时,它适用于所有产品,这就是为什么我为此创建了一个送货类)

有人能帮我吗

非常感谢

很抱歉看到了德国的屏幕截图,但是这是不可能设置装运区和装运类别的吗?
您可以设置2个配送区:英国和世界其他地区,并添加您想要的产品配送类别。如果您尝试了此方法,但仍然不起作用,您可以附加一些代码示例吗?

对于特定情况,您不需要在特定产品上使用装运方法。取而代之的是,下面这个自定义函数将完成这项任务,在其中定义您的特定产品id

当来自英国的客户仅将您的特定产品添加到购物车时,该代码将您的固定费率配送方式重命名为“免费配送”,并将成本设置为零

要测试该代码,应首先在“配送选项”选项卡下的Woocommerce配送设置中启用调试模式

此外,您还必须重新设置“固定费率”装运方法,或从特定产品中删除装运类别

守则:

add_filter( 'woocommerce_package_rates', 'disable_shipping_methods', 20, 2 );
function disable_shipping_methods( $rates, $package ) {
    // ==> HERE set your targeted product IDs in a coma separated array
    $products_ids = array(37);

    if( ! ( isset($package['destination']['country']) && isset($package['contents']) ) )
        return $rates; // If 'destination' country is not defined, we exit

    // Only for United kingdom customers
    if( $package['destination']['country'] != 'GB' )
        return $rates; // Non UK customers we exit.

    // Loop through cart items and checking if there is any other products than the targeted ones
    $found = false;
    foreach( $package['contents'] as $item ) {
        if( in_array( $item['data']->get_id(), $products_ids ) ){
            $found = true;
        } else {
            return $rates; // Other items found in cart, we exit.
        }
    }

    // When the customer is in UK and the target product is alone in cart we set the flat rate price to zero.
    foreach ( $rates as $rate_key => $rate ){
        // Targetting flat rate method
        if( $rate->method_id == 'flat_rate' && $found ){
            // We change the shipping label name
            $rates[$rate_key]->label = __("Free shipping", "woocommerce");

            // Set the rate cost to zero
            $rates[$rate_key]->cost = 0;

            // Taxes rate cost (if enabled)
            $taxes = array();
            foreach ($rates[$rate_key]->taxes as $key => $tax){
                if( $rates[$rate_key]->taxes[$key] > 0 ){
                    $taxes[$key] = 0;
                    $has_taxes = true;
                }
            }
            if( isset($has_taxes) && $has_taxes )
                $rates[$rate_key]->taxes = $taxes;
        }
    }
    return $rates;
}
代码进入活动子主题(或活动主题)的function.php文件。测试和工作

来自英国的客户在购物车中携带此独特商品-免费送货

来自英国的客户将此商品和其他商品放在购物车中-正常配送

来自其他国家/地区的客户在购物车中有此独特商品-正常配送

一旦你开始工作,别忘了在“配送选项”选项卡下的Woocommerce配送设置中禁用调试模式


你能分享一些代码吗?如果可能,遵循Hi,no,这也为其他产品创建了免费送货选项。只有一种产品应具有免费送货选项,且该选项仅适用于英国。这就是为什么我创建了一个shipping类,并在functions.php中编写了一段代码,每当为产品启用该shipping类时,只有该产品才具有该选项。现在我还需要排除国家((如果您的数据库中没有很多产品,您应该为每个产品定义一个发货方法。也许这可以解决您的问题。或者尝试使用此示例代码?我有+30个产品,除了您共享的代码是将国家从发货列表中排除,而不是从发货方法中排除。)(再次感谢,我将尝试修改此代码:,如果运气好的话,我将与大家分享:)谢谢!我也将尝试,但现在刚刚更改了functions.php中的代码行,并且成功了($customerff,$qualified)){//此项没有正确的类。返回默认可用性打印(“console.log('gb free');”);返回$is_可用;(此行为://普通返回true;)