只允许Woocommerce购物车中的两个产品中的一个

时间:2018-02-19 08:47:39

标签: php wordpress woocommerce cart woocommerce-subscriptions

我有两个分组产品 A B

1)产品A

  • Woocommerce订阅功能Alpha(每月订阅)
  • Woocommerce订阅平台(年度订阅)

2)产品B

  • Woocommerce订阅功能Alpha(年度订阅)
  • Woocommerce订阅平台(年度订阅)

不同之处在于订阅Alfa。

问题

我想要那个" Alpha"只在购物车中出现一次(每月或每年)。

当前状态

如果用户添加到购物车" A" (它每月有一个alpha月度+平台)。然后,如果它改变主意并点击" B",系统将告诉他平台不能再次添加,但每年添加alpha - 这意味着alpha在购物车中两次,不行。

还有一个X产品 - 单独的" x订阅",可以订购(不是集团产品)。

我看到的一个解决方案是,在添加到篮子之前,系统应首先清空篮子。

一个可能的解决方案还是检查特定产品是否已经在购物车中(例如alpha - 每月)并将其删除并添加一个新产品(当用户点击添加到购物车时传递的产品)。 / p>

我在网上找到了一个代码(进入functions.php)。功能会清空购物车,但会为每个添加的产品清空它。所以,在购物车中,只有"平台"留下(因为系统可能会清空购物车,添加alpha,然后再次清空购物车,然后添加平台)。

以下是代码:

add_filter( 'woocommerce_add_cart_item_data', 'wdm_empty_cart', 10,  3);

function wdm_empty_cart( $cart_item_data, $product_id, $variation_id ) 
{
    global $woocommerce;
    $woocommerce->cart->empty_cart();

    // Do nothing with the data and return
    return $cart_item_data;
}

如何只允许2个特定产品中的一个放入购物车?

1 个答案:

答案 0 :(得分:0)

以下代码基于您的2个“Alpha”订阅产品ID。如果两个产品都在购物车中,它将删除添加到购物车的第一个产品。您必须在此功能中设置两个产品ID:

add_action('woocommerce_before_calculate_totals', 'checking_and_removing_cart_items', 20, 1 );
function checking_and_removing_cart_items( $cart ){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    // HERE below define your "Alpha" products
    $alpha_monthly_id = 37;
    $alpha_yearly_id = 53;
    $found_monthly = $found_yearly = false;
    $keys = array();

    // Checking cart items
    foreach( $cart->get_cart() as $key => $cart_item ) {
        if( $cart_item['product_id'] == $alpha_monthly_id ){
            $found_monthly = true;
            $keys[] = $key;
        } elseif( $cart_item['product_id'] == $alpha_yearly_id ){
            $found_yearly = true;
            $keys[] = $key;
        }
    }
    // If both product found, we remove the first one
    if( $found_monthly && $found_yearly ){
        $cart->remove_cart_item($keys[0]);

        // (optional) Remove notices before they get displayed
        if( ! is_checkout() )
            wc_clear_notices(); 
    }
}

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

经过测试和工作