Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 仅允许在WooCommerce的特定装运区之外的特定产品在本地提货_Php_Wordpress_Woocommerce_Cart_Shipping Method - Fatal编程技术网

Php 仅允许在WooCommerce的特定装运区之外的特定产品在本地提货

Php 仅允许在WooCommerce的特定装运区之外的特定产品在本地提货,php,wordpress,woocommerce,cart,shipping-method,Php,Wordpress,Woocommerce,Cart,Shipping Method,我在商店里有几种产品,但是一种产品(易燃品)只能通过特定的运输公司运输;不幸的是,那家公司无法覆盖全国。因此,如果客户购买了易燃产品,并且该产品不在唯一可以装运该产品的公司的承保范围内,则除了本地提货,他不应看到任何其他装运选项 到目前为止,我有以下代码(由不同的答案提供): 但是我不知道为什么它不工作。甚至“echo”也不起作用。已更新-请尝试以下操作(代码已注释): //下面的设置:处理设置的自定义函数 功能自定义装运设置(){ 返回数组( 'product_ids'=>array(2267

我在商店里有几种产品,但是一种产品(易燃品)只能通过特定的运输公司运输;不幸的是,那家公司无法覆盖全国。因此,如果客户购买了易燃产品,并且该产品不在唯一可以装运该产品的公司的承保范围内,则除了本地提货,他不应看到任何其他装运选项

到目前为止,我有以下代码(由不同的答案提供):


但是我不知道为什么它不工作。甚至“echo”也不起作用。

已更新-请尝试以下操作(代码已注释):

//下面的设置:处理设置的自定义函数
功能自定义装运设置(){
返回数组(
'product_ids'=>array(2267),//定义需要在单独装运包装中的产品(本地提货)
'allowed_zones_id'=>数组(8),//定义允许的分区ID
);
}
//将购物车项目拆分为2个装运包
添加_过滤器(“woocommerce_cart_shipping_packages”、“split_shipping_packages”);
功能拆分\装运\包($packages){
提取(自定义设置());//加载和提取设置
$customer=WC()->customer;
$destination=array(
'country'=>$customer->get\u shipping\u country(),
'state'=>$customer->get_shipping_state(),
'邮政编码'=>$customer->get\u shipping\u postcode(),
“城市”=>$customer->get_shipping_city(),
“地址”=>$customer->get_shipping_address(),
'address_2'=>$customer->get_shipping_address_2()
);
$package_dest=数组('destination'=>$destination);
$zone=wc\u get\u shipping\u zone($package\u dest);
如果(!在数组中($zone->get\u id(),$allowed\u zones\u id)){
//重置包并初始化变量
$packages=$splitted_cart_items=array();
//循环浏览购物车项目
foreach(WC()->cart->get_cart()作为$item_key=>$item){
如果(是($item['data'],'WC\u Product')&&$item['data']->需要配送()){
如果(!array_intersect(数组($item['product_id'],$item['variation_id']),$product_id)){
$splitted\u cart\u items[0][$item\u key]=$item;//普通商品
}否则{
$splitted\u cart\u items[1][$item\u key]=$item;//特殊分隔项
}
}
}
if(计数($splitted\u cart\u items)<2)
退回$packages;
//循环浏览购物车上的物品
foreach($key=>$items的拆分购物车项目){
//在装运包中设置每个购物车项目组
$packages[$key]=数组(
“内容”=>$items,
“内容成本”=>array\u sum(wp\u list\u pull($items,'line\u total'),
“应用的优惠券”=>WC()->cart->get\u applicated\u优惠券(),
'user'=>array('ID'=>get\u current\u user\u ID()),
“目的地”=>$destination,
);
}
}
退回$packages;
}
//针对特定拆分的装运包装强制本地提货(针对定义的产品)
添加_过滤器('woocommerce_package_rates','filter_wc_package_rates',10,2);
函数筛选器\u wc\u包\u费率($rates,$package){
提取(自定义设置());//加载和提取设置
$zone=wc_get_shipping_zone($package);//获取当前装运区
$found=false;
//对于允许区域以外的所有其他装运区域
如果(!在数组中($zone->get\u id(),$allowed\u zones\u id)){
//循环查看当前装运包的购物车项目
foreach($package['contents']作为$item){
//查找已定义的特定产品ID
if(数组相交(数组($item['product\u id'],$item['variation\u id']),$product\u id)){
$found=true;//标记为已找到
break;//停止循环
}
}
//如果购物车中有任何已定义的产品
如有($已找到){
//循环运费
foreach($rate作为$rate\u key=>$rate的费率){
//隐藏所有运输方式,保持“本地提货”
如果('local_pickup'!==$rate->method_id){
未设置($rates[$rate_key]);
}
}
}
}
返回美元汇率;
}
代码进入活动子主题(或活动主题)的functions.php文件。测试和工作

刷新发货缓存:

  • 此代码已保存在functions.php文件中
  • 在配送区域设置中,禁用/保存任何配送方法,然后启用“返回/保存”

    您已经完成了,您可以进行测试

  • 已更新-请尝试以下内容(代码已注释):

    //下面的设置:处理设置的自定义函数
    功能自定义装运设置(){
    返回数组(
    'product_ids'=>array(2267),//定义需要在单独装运包装中的产品(本地提货)
    'allowed_zones_id'=>数组(8),//定义允许的分区ID
    );
    }
    //将购物车项目拆分为2个装运包
    添加_过滤器(“woocommerce_cart_shipping_packages”、“split_shipping_packages”);
    功能拆分\装运\包($packages){
    提取(自定义设置());//加载和提取设置
    $customer=WC()->customer;
    $destination=array(
    'country'=>$customer->get\u shipping\u country(),
    'state'=>$customer->get_shipping_state(),
    '邮政编码'=>$customer->get\u shipping\u postcode(),
    “城市”=>$customer->get_shipping_city(),
    “地址”=>$customer->get_shipping_address(),
    'address_2'=>$customer->get_shipping_address_2()
    );
    $package\u dest=ar
    
    function filter_woocommerce_package_rates( $rates, $package ) {
        // Shipping zone
        //echo 'entrando';
        $shipping_zone = wc_get_shipping_zone( $package );
    
        $product_ids = array( 2267 ); // HERE set the product IDs in the array
        $method_id = 'weight_based_shipping:38'; // HERE set the shipping method ID that I want to hide
        $found = false;
        
        // Get zone ID
        $zone_id = $shipping_zone->get_id();
        
        //echo $shipping_zone;
        //echo $zone_id;
        
        // NOT equal
        if ( $zone_id != 8 ) {
            // Unset a single rate/method for a specific product
            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;
    }
    add_filter( 'woocommerce_package_rates', 'filter_woocommerce_package_rates', 10, 2 );
    
    
    // SETTINGS BELOW: Custom function that handle your settings
    function custom_shipping_settings() {
        return array(
            'product_ids' => array(2267), // Define the products that need to be in a separated shipping package (local pickup)
            'allowed_zones_ids' => array(8), // Define the allowed zones IDs
        );
    }
    
    
    // Splitting cart items into 2 shipping packages
    add_filter( 'woocommerce_cart_shipping_packages', 'split_shipping_packages' );
    function split_shipping_packages( $packages ) {
        extract(custom_shipping_settings()); // Load and extract settings
    
        $customer       = WC()->customer;
        $destination    = array(
            'country'   => $customer->get_shipping_country(),
            'state'     => $customer->get_shipping_state(),
            'postcode'  => $customer->get_shipping_postcode(),
            'city'      => $customer->get_shipping_city(),
            'address'   => $customer->get_shipping_address(),
            'address_2' => $customer->get_shipping_address_2()
        );
        $package_dest   = array( 'destination' => $destination );
        $zone           = wc_get_shipping_zone( $package_dest );
    
        if ( ! in_array( $zone->get_id(), $allowed_zones_ids ) ) {
    
            // Reset packages and initialize variables
            $packages = $splitted_cart_items = array();
    
            // Loop through cart items
            foreach ( WC()->cart->get_cart() as $item_key => $item ) {
                if ( is_a($item['data'], 'WC_Product') && $item['data']->needs_shipping() ) {
                    if ( ! array_intersect( array($item['product_id'], $item['variation_id']), $product_ids ) ) {
                        $splitted_cart_items[0][$item_key] = $item; // Regular items
                    } else {
                        $splitted_cart_items[1][$item_key] = $item; // Special separated items
                    }
                }
            }
    
            if ( count($splitted_cart_items) < 2 )
                return $packages;
    
            // Loop through spitted cart items
            foreach ( $splitted_cart_items as $key => $items ) {
                // Set each cart items group in a shipping package
                $packages[$key] = array(
                    'contents'        => $items,
                    'contents_cost'   => array_sum( wp_list_pluck( $items, 'line_total' ) ),
                    'applied_coupons' => WC()->cart->get_applied_coupons(),
                    'user'            => array( 'ID' => get_current_user_id() ),
                    'destination'     => $destination,
                );
            }
        }
        return $packages;
    }
    
    // Force local pickup for specific splitted shipping package (for the defined products)
    add_filter( 'woocommerce_package_rates', 'filter_wc_package_rates', 10, 2 );
    function filter_wc_package_rates( $rates, $package ) {
        extract(custom_shipping_settings()); // Load and extract settings
    
        $zone  = wc_get_shipping_zone( $package ); // Get current shipping zone
        $found = false;
    
        // For all others shipping zones than allowed zones
        if ( ! in_array( $zone->get_id(), $allowed_zones_ids ) ) {
            // Loop through cart items for current shipping package
            foreach( $package['contents'] as $item ) {
                // Look for defined specific product Ids
                if ( array_intersect( array($item['product_id'], $item['variation_id']), $product_ids ) ) {
                    $found = true; // Flag as found
                    break; // Stop the loop
                }
            }
    
            // If any defined product is in cart
            if ( $found ) {
                // Loop through shipping rates
                foreach ( $rates as $rate_key => $rate ) {
                    // Hide all shipping methods keeping "Local pickup"
                    if ( 'local_pickup' !== $rate->method_id ) {
                        unset( $rates[$rate_key] );
                    }
                }
            }
        }
        return $rates;
    }