允许在 Woocommerce 中继续结帐非混合定义的产品类别

Posted

技术标签:

【中文标题】允许在 Woocommerce 中继续结帐非混合定义的产品类别【英文标题】:Allow proceed to checkout for non mixed defined product categories in Woocommerce 【发布时间】:2018-12-18 05:50:41 【问题描述】:

在 woocommerce 中,当购物车商品来自混合产品类别时,我试图避免继续结帐……以下代码主要按我的预期工作:

function sv_wc_prevent_checkout_for_category() 

    // set the slug of the category that cannot be mixed from other categories
    $category = 'test';

    // get the product category
    $product_cat = get_term_by( 'slug', $category, 'product_cat' );

    // sanity check to prevent fatals if the term doesn't exist
    if ( is_wp_error( $product_cat ) ) 
        return;
    

    if ( sv_wc_is_category_alone_in_cart( $category ) ) 

        //Proceed to checkout
    
    else  // otherwise post a notice to explain why checkout is blocked 
    wc_add_notice( sprintf( 'hi there! looks like your cart contains products from PREORDER and ONHAND categories, in order to proceed go to cart and dont mixed it.', $category_name ), 'error' );    



add_action( 'woocommerce_check_cart_items', 'sv_wc_prevent_checkout_for_category' );

function sv_wc_is_category_alone_in_cart( $category ) 

    // check each cart item for our category
    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) 

        // if a product is not in our category, bail out since we know the category is not alone
        if ( ! has_term( $category, 'product_cat', $cart_item['data']->id ) ) 
        return false;
        
    

    // if we're here, all items in the cart are in our category
    return true;

但我有一个问题:当购物车仅包含来自其他产品类别的商品时,它不允许继续结帐并显示错误消息。

继续:

    如果购物车包含“TEST”产品类别:允许“继续结帐”(工作) 如果购物车项目包含混合产品类别(“TEST”和其他):不允许“继续结帐”并显示错误消息(工作) 如果购物车仅包含其他产品类别(没有“TEST”产品类别):不允许“继续结帐”并显示错误消息(不工作

我怎样才能使它适用于其他产品类别,允许“继续结帐”?

感谢任何帮助。

【问题讨论】:

【参考方案1】:

尝试以下代码,它不允许将您的“测试”定义的产品类别与其他产品类别混合,显示错误通知并避免结帐:

add_action( 'woocommerce_check_cart_items', 'prevent_checkout_product_category_based' );
function prevent_checkout_product_category_based() 

    // HERE set the product category slug
    $category = 'test';

    $found = $other = false; // Initializing variables

    // Loop through cart items
    foreach ( WC()->cart->get_cart() as $cart_item ) 
        // checking for the specific product category
        $term_slugs = wp_get_post_terms( $cart_item['product_id'], 'product_cat', array('fields' => 'slugs') );
        if( in_array($category, $term_slugs) ) 
            $found = true; // Targeted product category found
        
        elseif( ! in_array($category, $term_slugs) && sizeof($term_slugs) > 0 )
            $other = true; // Other product categories found
        
    
    // If the targeted product category is mixed with other product categories
    if ( $found && $other ) 
        // Display an error notice and avoid checkout
        wc_add_notice( __( "The cart contains products from PREORDER and ONHAND categories and can't be mixed together, to allow checkout." ), 'error' );
    

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

【讨论】:

以上是关于允许在 Woocommerce 中继续结帐非混合定义的产品类别的主要内容,如果未能解决你的问题,请参考以下文章

WooCommerce 在输入邮政编码之前阻止结帐

如何在 WooCommerce 中更改结帐国家/地区选择的悬停颜色?

WooCommerce 的 MailChimp:在结帐字段中间添加复选框

Woocommerce,如何编辑结帐页面

如何在自定义 woocommerce 结帐字段中显示 $_SESSION 变量?

在 Woocommerce 的管理订单详细信息部分显示自定义结帐字段值