【问题标题】:Disable some states if specific products are in cart in Woocommerce如果 Woocommerce 中的购物车中有特定产品,则禁用某些状态
【发布时间】:2018-02-19 12:45:20
【问题描述】:

使用 woocommerce,我设法将州更改为爱尔兰的县,包括 function.php 中的以下代码

function  wc_ie_counties_add_counties( $states ) {
    $states['IE'] = array(
        'Carlow' => 'Carlow',
        'Cavan' => 'Cavan',
        'Clare' => 'Clare',
        'Cork' => 'Cork',
        'Donegal' => 'Donegal',
        'Dublin' => 'Dublin',
        'Galway' => 'Galway',
        'Kerry' => 'Kerry',
        'Kildare' => 'Kildare',
        'Kilkenny' => 'Kilkenny',
        'Laois' => 'Laois',
        'Leitrim' => 'Leitrim',
        'Limerick' => 'Limerick',
        'Longford' => 'Longford',
        'Louth' => 'Louth',
        'Mayo' => 'Mayo',
        'Meath' => 'Meath',
        'Monaghan' => 'Monaghan',
        'Offaly' => 'Offaly',
        'Roscommon' => 'Roscommon',
        'Sligo' => 'Sligo',
        'Tipperary' => 'Tipperary',
        'Waterford' => 'Waterford',
        'Westmeath' => 'Westmeath',
        'Wexford' => 'Wexford',
        'Wicklow' => 'Wicklow',
    );
    return $states;
}
add_filter( 'woocommerce_states', 'wc_ie_counties_add_counties' );

但如果购物车中有特定的产品 ID,我想删除几个县。

示例:如果产品 id 581 和/或 590 在购物车中,则仅显示 Dublin、Cavan 和 Carlow 州。

谢谢,

【问题讨论】:

    标签: php wordpress woocommerce product states


    【解决方案1】:

    使用您的实际代码,您需要设置 2 个状态数组,一个受限制,一个已完成。我们还需要检查产品 ID 为 581 和/或 590 的购物车项目。如果其中一个产品在购物车中,我们设置受限状态数组,否则设置完整状态数组。

    代码:

    add_filter( 'woocommerce_states', 'wc_ie_counties_add_counties' );
    function  wc_ie_counties_add_counties( $states ) {
        // HERE your product IDS
        $products_ids = array( 581, 590 );
    
        $cart = WC()->cart; // The Cart object
        $found = false;
    
        $states_partial = array(
            'Carlow' => 'Carlow',
            'Cavan' => 'Cavan',
            'Dublin' => 'Dublin'
        );
    
        $states_complete = array(
            'Carlow' => 'Carlow',
            'Cavan' => 'Cavan',
            'Clare' => 'Clare',
            'Cork' => 'Cork',
            'Donegal' => 'Donegal',
            'Dublin' => 'Dublin',
            'Galway' => 'Galway',
            'Kerry' => 'Kerry',
            'Kildare' => 'Kildare',
            'Kilkenny' => 'Kilkenny',
            'Laois' => 'Laois',
            'Leitrim' => 'Leitrim',
            'Limerick' => 'Limerick',
            'Longford' => 'Longford',
            'Louth' => 'Louth',
            'Mayo' => 'Mayo',
            'Meath' => 'Meath',
            'Monaghan' => 'Monaghan',
            'Offaly' => 'Offaly',
            'Roscommon' => 'Roscommon',
            'Sligo' => 'Sligo',
            'Tipperary' => 'Tipperary',
            'Waterford' => 'Waterford',
            'Westmeath' => 'Westmeath',
            'Wexford' => 'Wexford',
            'Wicklow' => 'Wicklow'
        );
    
        // Checking cart items
        foreach( $cart->get_cart() as $cart_item ) {
            if( in_array( $cart_item['product_id'], $products_ids ) ){
                $found = true;
                break;
            }
        }
    
        $states['IE'] = $found ? $states_partial : $states_complete;
    
        return $states;
    }
    

    代码进入活动子主题(或活动主题)的 function.php 文件中。

    它应该可以工作......


    与产品类别而不是产品 ID 相同(基于作者的代码):

    add_action('woocommerce_states', 'my_check_category_in_cart');
    function my_check_category_in_cart( $states ) {
        // HERE your product categories
        $products_categories = array( 'baths','curved-radiators','cabinets','mirrors','sinks',
            'storage-units','toilets','vanity-units','column-radiators','curved-radiators',
            'designer-radiators','flat-panel-radiators','heated-towel-radiators');
    
        $is_in_cart = false;
    
        // Loop through all products in the Cart
        foreach ( WC()->cart->get_cart() as $cart_item ) {
            // Check for product categories
            if ( has_term( $products_categories, 'product_cat', $cart_item['product_id'] )  ) {
                $is_in_cart = true;
                break;
            }
        }
    
        if ( $is_in_cart ) {
    
            $states['IE']  = array(
                'Carlow' => 'Carlow',
                'Dublin' => 'Dublin',
                'Kildare' => 'Kildare',
                'Kilkenny' => 'Kilkenny',
                'Laois' => 'Laois',
                'Longford' => 'Longford',
                'Louth' => 'Louth',
                'Meath' => 'Meath',
                'Offaly' => 'Offaly',
                'Westmeath' => 'Westmeath',
                'Wexford' => 'Wexford',
                'Wicklow' => 'Wicklow'
            );
            // Display a custom notice
            if( is_checkout() && WC()->customer->get_billing_country() == 'IE' )
                wc_add_notice( 'One of the products below can only be delivered inside Leinster area', 'notice' );
    
        } else {
            $states['IE'] = array(
                'Carlow' => 'Carlow',
                'Cavan' => 'Cavan',
                'Clare' => 'Clare',
                'Cork' => 'Cork',
                'Donegal' => 'Donegal',
                'Dublin' => 'Dublin',
                'Galway' => 'Galway',
                'Kerry' => 'Kerry',
                'Kildare' => 'Kildare',
                'Kilkenny' => 'Kilkenny',
                'Laois' => 'Laois',
                'Leitrim' => 'Leitrim',
                'Limerick' => 'Limerick',
                'Longford' => 'Longford',
                'Louth' => 'Louth',
                'Mayo' => 'Mayo',
                'Meath' => 'Meath',
                'Monaghan' => 'Monaghan',
                'Offaly' => 'Offaly',
                'Roscommon' => 'Roscommon',
                'Sligo' => 'Sligo',
                'Tipperary' => 'Tipperary',
                'Waterford' => 'Waterford',
                'Westmeath' => 'Westmeath',
                'Wexford' => 'Wexford',
                'Wicklow' => 'Wicklow'
            );
        }
        return $states;
    }
    

    代码进入活动子主题(或活动主题)的 function.php 文件中。

    现在它应该也适用于产品变体(在可变产品上)

    【讨论】:

    • @LeandroAndrade 我在此处添加了产品类别的更新(第二个代码),它也适用于产品变体(可变产品)......
    • 我的英雄!!!是的,它现在可以工作,包括可变产品,我刚刚收到与 wc_add_notice 相关的错误,但我已修复。再一次,你拯救了我的一天。非常感谢!
    • 很抱歉再次打扰您,但由于某种原因,此功能会破坏管理员订单页面。它变得一片空白。我看到错误来自 foreach ( WC()->cart->get_cart() as $cart_item )
    【解决方案2】:

    我使用了您的代码 LoicTheAztec,它运行良好,但后来我意识到添加所有产品并在添加新产品时一直更新它需要很长时间。

    所以使用您的代码和我发现的其他代码。我想出了这个做某事但基于类别的东西。

    add_action('woocommerce_states', 'my_check_category_in_cart');
    
        function my_check_category_in_cart($states) {
    
        // Set $cat_in_cart to false
        $cat_in_cart = false;
    
        // Loop through all products in the Cart        
        foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
    
            $product = $cart_item['data'];
    
            $products_categ = array( 'baths','curved-radiators','cabinets','mirrors','sinks','storage-units','toilets','vanity-units','column-radiators','curved-radiators','designer-radiators','flat-panel-radiators','heated-towel-radiators');
    
            // If Cart has category "download", set $cat_in_cart to true
            if ( has_term( $products_categ, 'product_cat', $product->get_id() )  ) {
                $prod_id = $product_id;
                $cat_in_cart = true;
                break;
            }
        }
    
        // Do something if category "download" is in the Cart      
        if ( $cat_in_cart ) {
    
            add_action('woocommerce_before_checkout_form', 'my_check_category_in_cart_msg');
    
        function my_check_category_in_cart_msg() {
         wc_print_notice( 'One of the products below can only be delivered inside Leinster area', 'notice' );
        }
           $states_complete = array(
                'Carlow' => 'Carlow',
                'Dublin' => 'Dublin',
                'Kildare' => 'Kildare',
                'Kilkenny' => 'Kilkenny',
                'Laois' => 'Laois',
                'Longford' => 'Longford',
                'Louth' => 'Louth',
                'Meath' => 'Meath',
                'Offaly' => 'Offaly',
                'Westmeath' => 'Westmeath',
                'Wexford' => 'Wexford',
                'Wicklow' => 'Wicklow'
            );
    
    
    
        }
    
            else{
    
                $states_complete = array(
                'Carlow' => 'Carlow',
                'Cavan' => 'Cavan',
                'Clare' => 'Clare',
                'Cork' => 'Cork',
                'Donegal' => 'Donegal',
                'Dublin' => 'Dublin',
                'Galway' => 'Galway',
                'Kerry' => 'Kerry',
                'Kildare' => 'Kildare',
                'Kilkenny' => 'Kilkenny',
                'Laois' => 'Laois',
                'Leitrim' => 'Leitrim',
                'Limerick' => 'Limerick',
                'Longford' => 'Longford',
                'Louth' => 'Louth',
                'Mayo' => 'Mayo',
                'Meath' => 'Meath',
                'Monaghan' => 'Monaghan',
                'Offaly' => 'Offaly',
                'Roscommon' => 'Roscommon',
                'Sligo' => 'Sligo',
                'Tipperary' => 'Tipperary',
                'Waterford' => 'Waterford',
                'Westmeath' => 'Westmeath',
                'Wexford' => 'Wexford',
                'Wicklow' => 'Wicklow'
            );
    
            }
    
                $states['IE'] = $states_complete;
    
            return $states;
    
        }
    

    我不知道这是否是正确的方法,但它也有效。

    非常感谢你

    【讨论】:

    • 是的,这就是使用产品类别的方式......但是当你要求产品 ID 时......我已经回答了产品 ID
    • 你做得很好,我只是没有注意网站的产品数量。很抱歉再次打扰您,但我的代码运行得不太好。似乎它不适用于具有变量的产品。那么你有什么想法吗?
    猜你喜欢
    • 2020-11-15
    • 2018-09-30
    • 2021-01-31
    • 2019-01-27
    • 2016-12-13
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多