如果用户未登录Woocommerce,请避免将其添加到特定产品类别的购物车中 [英] Avoid add to cart for specific product categories if user is unlogged in Woocommerce

查看:76
本文介绍了如果用户未登录Woocommerce,请避免将其添加到特定产品类别的购物车中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Woocommerce中,我正在尝试为未登录的用户禁用要添加到购物车中的特定产品类别.我正在寻找最近几天的解决方案,并在沮丧地删除我发现的最后一个代码之后但这也没有做.

我正在使用某个插件(TZ产品标签)在其他页面上显示产品(所以不仅在类别和产品页面上(我知道如何禁用))

add_action( 'woocommerce_after_shop_loop_item', 'remove_add_to_cart_buttons', 1 );

function remove_add_to_cart_buttons() {
    // replace a_category and another_category with the slugs of the categories you'd like to have the button removed from
    if( is_product_category( array( 'gekoelde-bier', 'bierkoerier'))) { 
        remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart' );            
    // add_filter( 'woocommerce_is_purchasable', false );
    }
}

引用自 https://gist.github.com/rynaldos/560c621714b9680433cddf18e6a50305

我最好的猜测是在按下添加到购物车"按钮时检查产品的类别,并根据该产品是否可以添加到购物车来进行

.

谢谢.

解决方案

条件标记is_product_category()仅针对产品类别归档页面.相反,您可以使用WordPress条件函数 has_term() .

2种方法可以避免没有登录用户的特定产品被添加到购物车 ...

1)使用添加到购物车验证挂钩:

// Avoid add to cart conditionally
add_filter( 'woocommerce_add_to_cart_validation', 'avoid_add_to_cart_conditionally', 20, 3 );
function avoid_add_to_cart_conditionally( $passed, $product_id, $quantity) {
    // HERE your product categories (can be IDs, slugs or names terms)
    $terms = array( 'gekoelde-bier', 'bierkoerier');
    
    if( has_terms( $terms, 'product_cat', $product_id ) && ! is_user_logged_in() ){
        // Displaying a custom notice (optional)
        wc_add_notice( __('Only logged in users are allowed to purchase this item. Please register.'), 'error' );
        
        $passed = false;
    }
    
    return $passed;
}

代码进入您的活动子主题(或活动主题)的function.php文件中.经过测试,可以正常工作.


2)使用is_purchasable产品属性 (它将删除添加到购物车按钮):

add_filter('woocommerce_is_purchasable','conditional_purchasable_products', 20, 2);
function conditional_purchasable_products( $is_purchasable, $product ) {
    // HERE your product categories (can be IDs, slugs or names terms)
    $terms = array( 'gekoelde-bier', 'bierkoerier');
    
    $product_id = $product->get_id(); // The product ID

    if( has_terms( $terms, 'product_cat', $product_id ) && ! is_user_logged_in() ){
        $is_purchasable = false;
    }

    return $is_purchasable;
}

代码进入您的活动子主题(或活动主题)的function.php文件中.经过测试,可以正常工作.


也定位父产品类别字词.

您将使用以下自定义条件函数替换 has_term() Wordpress函数:

// Custom conditional function that checks for parent product categories too
function has_product_categories( $categories, $product_id ) {
     // Initializing
    $parent_term_ids = $categories_ids = array();
    $taxonomy        = 'product_cat';

    // Convert categories term names and slugs to categories term ids
    foreach ( $categories as $category ){
        if( is_numeric( $category ) ) {
            $categories_ids[] = (int) $category;
        } elseif ( term_exists( sanitize_title( $category ), $taxonomy ) ) {
            $categories_ids[] = get_term_by( 'slug', sanitize_title( $category ), $taxonomy )->term_id;
        }
    }

    // Loop through the current product category terms to get only parent main category term
    foreach( get_the_terms( $product_id, $taxonomy ) as $term ){
        if( $term->parent > 0 ){
            $parent_term_ids[] = $term->parent; // Set the parent product category
            $parent_term_ids[] = $term->term_id; // (and the child)
        } else {
            $parent_term_ids[] = $term->term_id; // It is the Main category term and we set it.
        }
    }
    return array_intersect( $categories_ids, array_unique($parent_term_ids) ) ? true : false;
}

然后对于这两个钩子函数,您将替换以下行:

if( has_terms( $terms, 'product_cat', $product_id ) && ! is_user_logged_in() ){
    

通过此行:

if( has_product_categories( $terms, $product_id ) && ! is_user_logged_in() ){

代码进入您的活动子主题(或活动主题)的function.php文件中.经过测试,可以正常工作.

In Woocommerce, I am trying to disable specific product categories to be added to the cart for users that aren't logged in. i'm looking for a solution the last couple of days and after frustrated deleting the last code I found this but also doesn't do the job.

I'm using a certain plugin (TZ product tabs) to show products on other pages (so not only on the category and product page (this i know how to disable))

add_action( 'woocommerce_after_shop_loop_item', 'remove_add_to_cart_buttons', 1 );

function remove_add_to_cart_buttons() {
    // replace a_category and another_category with the slugs of the categories you'd like to have the button removed from
    if( is_product_category( array( 'gekoelde-bier', 'bierkoerier'))) { 
        remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart' );            
    // add_filter( 'woocommerce_is_purchasable', false );
    }
}

Referenced from https://gist.github.com/rynaldos/560c621714b9680433cddf18e6a50305

My best guess is to check the category of the product when the "add to cart" button is pressed and based on that the product can be added to the cart or not.

Thanks in advance.

解决方案

The conditional tag is_product_category() only target product category archive pages. Instead you can use WordPress conditional function has_term().

There is 2 ways to avoid specific products being added to cart for no logged user…

1) Using Add to cart validation hook:

// Avoid add to cart conditionally
add_filter( 'woocommerce_add_to_cart_validation', 'avoid_add_to_cart_conditionally', 20, 3 );
function avoid_add_to_cart_conditionally( $passed, $product_id, $quantity) {
    // HERE your product categories (can be IDs, slugs or names terms)
    $terms = array( 'gekoelde-bier', 'bierkoerier');
    
    if( has_terms( $terms, 'product_cat', $product_id ) && ! is_user_logged_in() ){
        // Displaying a custom notice (optional)
        wc_add_notice( __('Only logged in users are allowed to purchase this item. Please register.'), 'error' );
        
        $passed = false;
    }
    
    return $passed;
}

Code goes in function.php file of your active child theme (or active theme). Tested and works.


2) Using is_purchasable product property (It will remove add to cart button):

add_filter('woocommerce_is_purchasable','conditional_purchasable_products', 20, 2);
function conditional_purchasable_products( $is_purchasable, $product ) {
    // HERE your product categories (can be IDs, slugs or names terms)
    $terms = array( 'gekoelde-bier', 'bierkoerier');
    
    $product_id = $product->get_id(); // The product ID

    if( has_terms( $terms, 'product_cat', $product_id ) && ! is_user_logged_in() ){
        $is_purchasable = false;
    }

    return $is_purchasable;
}

Code goes in function.php file of your active child theme (or active theme). Tested and works.


Targeting the parent product category terms too.

You will use the following custom conditional function to replace has_term() Wordpress function:

// Custom conditional function that checks for parent product categories too
function has_product_categories( $categories, $product_id ) {
     // Initializing
    $parent_term_ids = $categories_ids = array();
    $taxonomy        = 'product_cat';

    // Convert categories term names and slugs to categories term ids
    foreach ( $categories as $category ){
        if( is_numeric( $category ) ) {
            $categories_ids[] = (int) $category;
        } elseif ( term_exists( sanitize_title( $category ), $taxonomy ) ) {
            $categories_ids[] = get_term_by( 'slug', sanitize_title( $category ), $taxonomy )->term_id;
        }
    }

    // Loop through the current product category terms to get only parent main category term
    foreach( get_the_terms( $product_id, $taxonomy ) as $term ){
        if( $term->parent > 0 ){
            $parent_term_ids[] = $term->parent; // Set the parent product category
            $parent_term_ids[] = $term->term_id; // (and the child)
        } else {
            $parent_term_ids[] = $term->term_id; // It is the Main category term and we set it.
        }
    }
    return array_intersect( $categories_ids, array_unique($parent_term_ids) ) ? true : false;
}

Then for both hooked functions, you will replace the following line :

if( has_terms( $terms, 'product_cat', $product_id ) && ! is_user_logged_in() ){
    

By this line:

if( has_product_categories( $terms, $product_id ) && ! is_user_logged_in() ){

Code goes in function.php file of your active child theme (or active theme). Tested and works.

这篇关于如果用户未登录Woocommerce,请避免将其添加到特定产品类别的购物车中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆