如果添加了另一个产品,则不允许从 WooCommerce 购物车中删除具有特定 ID 的产品

Disallow to remove a product with a specific ID from WooCommerce cart if another product is added

我必须对我的购物车/结帐页面实施以下逻辑:

如果带有 ID="100" 的产品在购物车中,如果还添加了带有 ID="101" 的产品,我需要禁止将其从购物车中移除。

简而言之,仅当未添加具有特定 ID 的产品时,才能删除产品。

之前我使用以下解决方案来禁止仅针对特定产品 ID 删除产品。但是这段代码不适用于变量产品,我不知道如何在其中实现我的逻辑。

add_filter('woocommerce_cart_item_remove_link', 'customized_cart_item_remove_link', 20, 2 );
function customized_cart_item_remove_link( $button_link, $cart_item_key ){
    $targeted_products_ids = array( 98,99,100 );

    $cart_item = WC()->cart->get_cart()[$cart_item_key];

    if( in_array($cart_item['data']->get_id(), $targeted_products_ids) )
        $button_link = '';

    return $button_link;
}

提前感谢您的帮助。

如果 product_id_1 在购物车中,此答案允许您如果还添加了 product_id_2,则无法将其从购物车中移除。

这可以通过 $settings 数组应用于多个产品,因此如果相应的产品 ID 在购物车中,则无法删除某个产品。

为清楚起见,这基于产品 ID(简单)或父 ID(可变)产品。如果您想将其应用于可变产品的变体,则不必使用 get_parent_id().

所以你得到:

function filter_woocommerce_cart_item_remove_link( $link, $cart_item_key ) {
    // Settings (multiple settings arrays can be added/removed if desired)
    $settings = array(
        array(
            'product_id_1'  => 100,
            'product_id_2'  => 101,
        ),
        array(
            'product_id_1'  => 30,
            'product_id_2'  => 813,
        ),
        array(
            'product_id_1'  => 53,
            'product_id_2'  => 817,
        ),
    );
    
    // Get cart
    $cart = WC()->cart;
    
    // If cart
    if ( $cart ) {
        // Get cart item
        $cart_item = $cart->get_cart()[$cart_item_key];
        
        // Get parent/real ID
        $product_id = $cart_item['data']->get_parent_id() != 0 ? $cart_item['data']->get_parent_id() : $cart_item['data']->get_id();
        
        // Loop trough settings array
        foreach ( $settings as $key => $setting ) {
            // Compare, get the correct setting array
            if ( $product_id == $settings[$key]['product_id_1'] ) {
                // Cart id of the other product
                $product_cart_id = $cart->generate_cart_id( $settings[$key]['product_id_2'] );
                
                // Find other product in cart
                $in_cart = $cart->find_product_in_cart( $product_cart_id );
                
                // When true
                if ( $in_cart ) {
                    // Hide remove button
                    $link = '';
                    
                    // Break loop
                    break;
                }
            }
        }
    }

    return $link;
}
add_filter( 'woocommerce_cart_item_remove_link', 'filter_woocommerce_cart_item_remove_link', 10, 2 );