为了账号安全,请及时绑定邮箱和手机立即绑定

使特定产品在 WooCommerce 中互斥

使特定产品在 WooCommerce 中互斥

PHP
海绵宝宝撒 2023-08-06 15:53:46
情况我的网站提供两种产品。如果用户购买产品 A,他们就可以访问所有电子书。如果用户购买产品B,他们将被允许选择一本电子书。在 WooCommerce 中,我创建了电子书作为产品 B 中的变体。产品 A ID = 477产品 B ID = 297 。虽然 297 是主要 ID,但我相信我应该使用变体 ID,例如。1483、997。我试图解决的问题我希望这两种产品是互斥的。毕竟,如果用户购买了所有电子书(即产品 A)的访问权限,那么他们就不需要购买产品 B 下的个别书籍。最终结果我尝试了一些代码(如下所示),但它根本不起作用。这意味着我仍然可以将产品 A 和 B 的变体添加到同一个购物车中。问题1:我该如何解决这个问题?问题 2:是否有更简单的方法来不指定每个产品 B 变体?这是一个非常长的列表,从长远来看不是一个可扩展的解决方案。
查看完整描述

1 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

有一种更简单的方法可以使用“添加到购物车”验证挂钩:


add_filter( 'woocommerce_add_to_cart_validation', 'wc_add_to_cart_validation_filter_callback', 10, 3 );

function wc_add_to_cart_validation_filter_callback( $passed, $product_id, $quantity ) {

    if( WC()->cart->is_empty() )

        return $passed;


    $product_id1 = 37; // Single product Id

    $product_id2 = 19; // Variable product Id


    // Loop through cart items

    foreach( WC()->cart->get_cart() as $cart_item ) {

        if( ( $product_id = $product_id1 && $cart_item['product_id'] == $product_id2 )

        || ( $product_id = $product_id2 && $cart_item['product_id'] == $product_id1 ) ) {

            wc_add_notice( sprintf(

                __("This product can't not be purchased toggether with %s."),

                '"<strong>' . $cart_item['data']->get_name() . '</strong>"'

            ), 'error' );

            return false;

        }

    }


    return $passed;

}

代码位于活动子主题(或活动主题)的functions.php 文件中。经过测试并有效。


添加 (与您的评论相关):


另一种方法是当两种产品都在购物车中时,静默删除第一项:


add_action('woocommerce_before_calculate_totals', 'keep_last_variation_from_variable_products', 10, 1 );

function keep_last_variation_from_variable_products( $cart ) {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )

        return;


    $product_id1 = 37; // Single product Id

    $product_id2 = 19; // Variable product Id


    $product_ids = array($product_id1, $product_id2);

    $items_keys  = array();


    // Loop through cart items

    foreach (  $cart->get_cart() as $cart_item_key => $cart_item ) {

        // If cart item matches with one of our defined product

        if ( in_array( $cart_item['product_id'], $product_ids ) ) {

            // Set the cart item key in an array (avoiding duplicates)

            $items_keys[$cart_item['product_id']] = $cart_item_key;

        }

    }


    // If both products are in cart just keep the last one silently

    if( count($items_keys) > 1 ) {

        $cart->remove_cart_item( reset($items_keys) ); // remove the first one

    }

}

代码位于活动子主题(或活动主题)的functions.php 文件中。经过测试并有效。


查看完整回答
反对 回复 2023-08-06
  • 1 回答
  • 0 关注
  • 61 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信