Php 当特定产品在Woocommerce购物车中时,将加拿大从国家/地区列表中删除

Php 当特定产品在Woocommerce购物车中时,将加拿大从国家/地区列表中删除,php,wordpress,woocommerce,cart,country,Php,Wordpress,Woocommerce,Cart,Country,我想做一件简单的事:不要把某个特定的产品运到加拿大 在我看来,以下是最简单的方法:如果购物车中有特定的产品,请将加拿大从结账页面中删除 特定产品: 1-(ID:12616) 2-(识别号:15631) 我的研究: 本文为我提供了一种在购物车中查找产品并在条件为真时执行任何操作的方法:本文为我提供了一种从结帐页面中删除特定国家/地区的方法。我已组合并修改了这两个代码,以尝试完成我的任务。这是我的密码: function unset_country_on_condition( $country )

我想做一件简单的事:不要把某个特定的产品运到加拿大

在我看来,以下是最简单的方法:如果购物车中有特定的产品,请将加拿大从结账页面中删除

特定产品:
1-(ID:12616)
2-(识别号:15631)

我的研究:
本文为我提供了一种在购物车中查找产品并在条件为真时执行任何操作的方法:本文为我提供了一种从结帐页面中删除特定国家/地区的方法。我已组合并修改了这两个代码,以尝试完成我的任务。这是我的密码:

function unset_country_on_condition( $country ) {
    $product_id = 15631;
    $product_id_2 = 12616; 
    $product_cart_id = WC()->cart->generate_cart_id( $product_id );
    $product_cart_id_2 = WC()->cart->generate_cart_id( $product_id_2 );
    $in_cart = WC()->cart->find_product_in_cart( $product_cart_id );
    $in_cart_2 = WC()->cart->find_product_in_cart( $product_cart_id_2 );
    if ( $in_cart || $in_cart_2 ) {
        unset($country["CA"]);
        return $country;
    }
}
add_filter( 'woocommerce_countries', 'unset_country_on_condition', 10, 1 );
但上述功能不起作用
。它会使国家/地区下拉列表为空,从而生成站点范围的警告通知

有人能指出我做错了什么吗

屏幕截图:

编辑自


你能试试下面的代码吗

global $product_check; //declare a global variable
function remove_canada_insulated_blankets_traps(){
    $product_ids = array(12616,15631);
    foreach($product_ids as $product_id){
        $product_cart_id = WC()->cart->generate_cart_id( $product_id );
        $in_cart = WC()->cart->find_product_in_cart( $product_cart_id );
        $product_check[$in_cart]; //global variable is converted into an array storing ids
    }
}
add_action( 'woocommerce_before_cart', 'remove_canada_insulated_blankets_traps' );

//pass the global variable into following function as another argument
function woo_remove_canada_country( $countries, $product_check ){
    if( count(product_check) > 0 ){ //check count of the array
        unset($countries['CA']); //unset country
    }
    return $countries; 
}
add_filter( 'woocommerce_countries', 'woo_remove_canada_country', 10, 2 );

请注意“woocommerce\u countries”过滤器最后一个参数的更改。由于将附加参数传递给函数,最后一个参数更改为2而不是1。

当特定产品在购物车中时,以下代码将从允许的国家/地区删除“加拿大”:

add_filter( 'woocommerce_countries', 'products_disable_country', 10, 1 );
function products_disable_country( $countries ) {
    if( is_cart() || is_checkout() ) {

        $products = array(15631, 12616);

        foreach( WC()->cart->get_cart() as $item ){
            if( in_array( $item['product_id'], $products ) ){
                unset($countries["CA"]);
                return $countries;
            }
        }
    }

    return $countries;
}

代码进入活动子主题(活动主题)的function.php文件。测试并正常工作。

不幸的是,从WooCommerce
3.6.2开始,他们已经取消了在任何后端调用中检查购物车的功能。我在
woocommerce\u countries
上运行了一个类似的过滤器,以限制购物车中的某些物品只能在某些位置购买,几天前更新后出现了一个致命错误

WC表示,他们不会解决这个问题,因为这是为了加快速度。但是,您仍然可以通过执行以下操作访问此筛选器中的购物车:

function vnm_disable_country_for_products($countries) {
    // get_cart() will fail here in WC > 3.6.2, but we can still access a basic cart via the session:

    $cartArray = WC()->session->cart;

    if (is_array($cartArray) && !empty($cartArray)) {

        $noSaleCountry = 'CA';
        $limitingProducts = array(12616, 15631);

        foreach ($cartArray as $itemArray) {
            if (in_array($itemArray['product_id'], $limitingProducts)) {

            unset($countries[$noSaleCountry]);

        }
    }

    return $countries;
}

add_filter('woocommerce_countries', 'vnm_disable_country_for_products', 10, 1);

这表面上与,;但是,由于
WC()->cart->get_cart()
不再可用,我们将通过
WC()->session->cart
访问购物车。

由于woocommerce API中的更改,需要进行一些更改。

购物车不像以前那样可用

add_filter('woocommerce_country'、'products_disable_country',10,1);
功能产品\u禁用\u国家($countries){
全球商业;
//is_购物车和is_结帐不再工作。
//if(is_cart()| | is_checkout()){
$products=阵列(1563112616);
//但是您可以通过会话获取购物车
$cart=$woocommerce->session->cart;
foreach($cart作为$item){
if(在数组中($item['product\u id',$products)){
未结算($国家[“CA”]);
返回美元国家;
}
}
// }
返回美元国家;
}

请参见类似的答案@Jamie\D谢谢你的链接,但这一部分在我的代码中运行良好(尽管我同意没有优化),实际问题是代码使国家无法结账。不知怎的,它打破了全国的下拉列表。我已经用截图更新了我的问题。当您将
返回$country
if
语句中移出时,它是否有效?现在它似乎只在找到这两种产品中的一种时返回列表,否则它什么也不返回(也称为null)。将
return$country
移到
if
语句之外会使代码变得无用。它什么都没做为什么你不根据访客国家禁用这些产品的“添加到购物车”按钮呢?刚刚更新了我的答案。。。过早返回国家可能是问题所在(请参阅移动返回)是的……也尝试过,但代码没有做任何事情。我开始认为
woocommerce\u countries
是错误的过滤器,它与
woocommerce\u countries
一起工作。不管怎样,我都会投票支持你的答案,因为它有助于汉克斯,这很有效!不确定有什么区别,但是这段代码在没有错误更新的情况下完成了任务:好的,找出第一个
如果(is_cart()| | is_checkout())
是阻止错误的原因。谢谢@loictheaztec可能很简单,但您可能只想从发货下拉列表中删除CA,而不想从账单下拉列表中删除CA,但是这可能是一个非常罕见的情况…@Jamie_D您是对的,但对于这个网站,很好。谢谢,但是您的代码给出了这个错误
Uncaught argumentcounter错误:函数woo_remove_canada_country()的参数太少,第286行传入了wp includes/class-wp-hook.php,wp content/themes/genesis sample/functions中正好有2个参数。php:370
谢谢,这也有帮助
function vnm_disable_country_for_products($countries) {
    // get_cart() will fail here in WC > 3.6.2, but we can still access a basic cart via the session:

    $cartArray = WC()->session->cart;

    if (is_array($cartArray) && !empty($cartArray)) {

        $noSaleCountry = 'CA';
        $limitingProducts = array(12616, 15631);

        foreach ($cartArray as $itemArray) {
            if (in_array($itemArray['product_id'], $limitingProducts)) {

            unset($countries[$noSaleCountry]);

        }
    }

    return $countries;
}

add_filter('woocommerce_countries', 'vnm_disable_country_for_products', 10, 1);