除某些 WooCommerce 产品类别外,自动将产品添加到购物车

Posted

技术标签:

【中文标题】除某些 WooCommerce 产品类别外,自动将产品添加到购物车【英文标题】:Auto add product to cart except for some WooCommerce product categories 【发布时间】:2020-10-15 23:36:57 【问题描述】:

我正在使用 Auto add a product for cart item from specific product categories in WooCommerce 答案代码自动将免费产品添加到购物车。如果产品属于特定类别,则代码效果很好,但如果产品不在特定类别中,我需要添加产品。

如果免费产品不在此编辑的特定类别中,我可以添加它:

if( **!** has_term( $required_categories, 'product_cat', $item['product_id'] ) ) 
    $matched_category = true;

但这不会在删除父产品时删除免费产品。

任何帮助将不胜感激!

【问题讨论】:

“父产品”是什么意思?这里哪里有父子关系?您的意思是说,一旦该特定类别中的任何 个产品被添加到购物车中,您就希望再次删除这个免费产品? 当购物车中的唯一产品属于排除类别时,我希望删除免费产品。因此,在链接问题的示例代码中,我将使用 $excluded_categories 而不是 $required_categories。 我想如果你保留上面显示的行,而不是在最后否定条件,if ( isset($saved_item_key) && $matched_category )(!在 $matched_category 删除之前)和elseif ( ! isset($saved_item_key) && ! $matched_category )( ! 在添加 $matched_category 之前。)你能试试看你得到什么结果吗? 【参考方案1】:

更新:以下是“自动将产品添加到购物车中所需的更改,特定定义的产品类别除外(如果购物车中包含混合类别,则不会删除自动添加的产品)

add_action( 'woocommerce_before_calculate_totals', 'auto_add_item_except_for_product_category', 10, 1 );
function auto_add_item_except_for_product_category( $cart ) 
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

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

    // Settings
    $except_terms  = array('t-shirts'); // Required product category(ies)
    $auto_added_id = 70; // Specific product to be added automatically

    $except_found  = false;
    $others_found  = false;

    // Loop through cart items
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) 
        // Check for product category
        if( has_term( $except_terms, 'product_cat', $cart_item['product_id'] ) ) 
            $except_found = true;
         else 
            $others_found = true;
         

        // Check if specific product is already auto added
        if( $cart_item['data']->get_id() == $auto_added_id ) 
            $auto_added_item_key = $cart_item_key; // keep cart item key
        
    

    // If auto added product is in cart with at least an item from a the defined product category only
    if ( isset($auto_added_item_key) && $except_found && ! $others_found ) 
        $cart->remove_cart_item( $auto_added_item_key ); // Remove specific product
    
    // If there is at least an item from others product categories and the specific product is not in cart
    elseif ( ! isset($auto_added_item_key) && ! $except_found ) 
        $cart->add_to_cart( $auto_added_id ); // Add specific product
    

代码在您的活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。

基于:Auto add a product for cart item from specific product categories in WooCommerce

【讨论】:

如果存在未排除类别中的产品,则添加已排除类别中的产品不应删除免费产品。 另外,当我从未排除的类别中删除产品时,不会删除免费产品。只要存在未排除的类别中的产品,免费产品就可以与排除的产品一起存在。 根据您引用的链接,我只是想避免在 $required_categories 变量中添加多个类别。因此,我试图仅列出一个被排除的类别,而不是列出 12 个必需的类别。如果我列出 12 个必需的类别,它就可以完美运行。很抱歉造成混乱。 很遗憾没有。在任何一种情况下,免费产品都会被删除,如果您先添加排除的产品,那么当您添加其他类别的产品时,不会添加免费赠品。【参考方案2】:

也许能够钩入 Woo 的从购物车中移除物品的钩子:

function remove_free_item() 
    if ( is_admin() ) 
        return;
    
    
    $product_id = 'ID_OF_FREE_ITEM';
    $product_cart_id = WC()->cart->generate_cart_id( $product_id );
    $cart_item_key = WC()->cart->find_product_in_cart( $product_cart_id );

    if ( $cart_item_key ) 
        WC()->cart->remove_cart_item( $cart_item_key );
    



add_action( 'woocommerce_cart_item_removed', 'after_remove_product_from_cart', 10, 2 );
function after_remove_product_from_cart($removed_cart_item_key, $cart) 
    // removed item
    $line_item = $cart->removed_cart_contents[ $removed_cart_item_key ];

    // removed item product id
    $product_id = $line_item[ 'product_id' ];

    // might need to wrap this in some check depending on your case
    remove_free_item();

【讨论】:

我很快就会尝试这段代码。感谢您的意见。

以上是关于除某些 WooCommerce 产品类别外,自动将产品添加到购物车的主要内容,如果未能解决你的问题,请参考以下文章

如果 WooCommerce 结帐中存在某些产品类别,请删除其他产品

在 Woocommerce wc_get_loop_prop 产品循环中仅包含某些类别

如何根据产品类别在 WooCommerce 下添加文本添加到购物车按钮

woocommerce wordpress中缺货产品的自动无索引

根据排除某些产品的 WooCommerce 购物车小计自动应用优惠券

将特色产品推广到 WooCommerce 的类别顶部 [重复]