WooCommerce特定类别产品的最低订购费用 [英] WooCommerce minimum order fee for products in specific category

查看:115
本文介绍了WooCommerce特定类别产品的最低订购费用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在woocommerce商店中为特定金额(价值,而非数量)以下的订单添加费用.

I want to add a fee in my woocommerce store for orders under a specific amount (value, not quantity).

我正在使用" WooCommerce动态最低订单基于金额的费用" 效果很好的答案代码.

I am using "WooCommerce dynamic minimum order amount based fee" answer code that works perfectly.

现在,我正在尝试更改此功能,并将其仅应用于特定产品类别中的商品.基本上,我必须对购物车中与特定类别匹配的所有产品的价值进行求和,然后使用该价值进行费用计算.

Now I am trying to change this functionand to apply it only to items from a specific product category. Basically, I have to sum the value of all the products in cart that matches the specific category and use this value for fee calculation.

我如何实现这个目标?

推荐答案

以下重新访问的代码将处理特定的已定义产品类别.您将必须定义:

The following revisited code will handle specific defined product categories. You will have to define:

  • 您在第一个功能中的特定产品类别.
  • 第二个和第三个函数中的最小订购量.

代码:

// Get the cart items subtotal amount from specific product categories
function get_specific_cart_items_total( $cart ) {
    $categories   = array('t-shirts'); // <=== Define your product categories
    $items_amount = 0; // Initializing

    // Loop through cart items
    foreach( $cart->get_cart() as $item ) {
        if( has_term( $categories, 'product_cat', $item['product_id'] ) ) {
            $items_amount += $item['line_subtotal'];
        }
    }
    return $items_amount;
}

// Add a custom fee (displaying a notice in cart page)
add_action( 'woocommerce_cart_calculate_fees', 'add_custom_surcharge', 10, 1 );
function add_custom_surcharge( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

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

    $min_price     = 200; // The minimal cart amount

    $current_price = get_specific_cart_items_total( $cart );
    $custom_fee    = $min_price - $current_price;

    if ( $custom_fee > 0 ) {
        $cart->add_fee( __('Minimum Order Adjustment'), $custom_fee, true );

        // NOTICE ONLY IN CART PAGE
        if( is_cart() ){
            wc_print_notice( get_custom_fee_message( $min_price, $current_price ), 'error' );
        }
    }
}

// Displaying the notice on checkout page
add_action( 'woocommerce_before_checkout_form', 'custom_surcharge_message', 10 );
function custom_surcharge_message(  ) {
    $min_price     = 200; // The minimal cart amount

    $cart          = WC()->cart;
    $current_price = get_specific_cart_items_total( $cart );
    $custom_fee    = $min_price - $current_price;

    // NOTICE ONLY IN CHECKOUT PAGE
    if ( $custom_fee > 0 ) {
        wc_print_notice( get_custom_fee_message( $min_price, $current_price ), 'error' );
    }
}

// The fee notice message
function get_custom_fee_message( $min_price, $current_price ) {
    return sprintf(
        __('We have a minimum %s per order from specific categories. As your current order is only %s, an additional fee will be applied.', 'woocommerce'),
        wc_price( $min_price ),
        wc_price( $current_price )
    );
}

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

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

选项:要也处理父产品类别,请添加以下附加功能:

Option: To handle parent product categories too, add the following additional function:

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

    if( is_string( $categories ) ) {
        $categories = (array) $categories;
    }

    $product_id = $product_id > 0 ? $product_id : get_the_id();

    // 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;
}

并在第一个函数中替换此行:

And replace in the first function this line:

if( has_term( $categories, 'product_cat', $item['product_id'] ) ) {

由此:

if( has_product_categories( $categories, $item['product_id'] ) ) {

这篇关于WooCommerce特定类别产品的最低订购费用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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