Mael Costa
Mael Costa

Reputation: 13

Add a fee for specific product categories in WooCommerce

I have a client who has a WordPress + WooCommerce store. He asked me to include a fee in the store, but that not all categories would be charged. I would like to insert a fee of 7.40 (Receipt Notice Fee) for all product categories, but excluding some categories.

I tried the code below:

add_action('woocommerce_cart_calculate_fees', 'add_fees_on_ids');

function add_fees_on_ids() {
    if (is_admin() && !defined('DOING_AJAX')) {return;}
    
    foreach( WC()->cart->get_cart() as $item_keys => $item ) {
        if( in_array( $item['product_cat'], fee_ids() )) {
            WC()->cart->add_fee(__('Additional Charge'), 5);
        }
    }
}

function fee_ids() {
    return array( 600,650,700 );
}

Upvotes: 0

Views: 76

Answers (1)

LoicTheAztec
LoicTheAztec

Reputation: 253867

There are some mistakes in your code. To target specific product categories, use WordPress has_term() conditional function.

Try one of the following instead:

1). Cumulated fee for specific product categories:

add_action( 'woocommerce_cart_calculate_fees', 'add_custom_category_fee', 10, 1 );
function add_custom_category_fee( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
        return;
    }

    $targeted_term_ids = array( 600, 650, 700 ); // Targeted category(ies) term ID(s)
    $fee_by_item = 5; // Define the fee amount by item
    $fee_total = 0; // Initialize
    
    // Loop through cart items
    foreach( $cart->get_cart() as $item ) {
        // Increase the total fee amount only for the targeted categories
        if ( has_term( $targeted_term_ids, 'product_cat', $item['product_id'] ) ) {
            $fee_total += $fee_by_item;
        }
    }

    // Add the Fee
    if ( $fee_total > 0 ) {
        $cart->add_fee( __('Additional Charge', 'woocommerce'), $fee_total );
    }
}

You can also handle the product quantity by replacing in the code:

$fee_total += $fee_by_item;

with:

$fee_total += $fee_by_item * $item['quantity'];

2). Add a unique fee if specific product category(ies) is(are) in cart:

add_action( 'woocommerce_cart_calculate_fees', 'add_custom_category_fee', 10, 1 );
function add_custom_category_fee( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
        return;
    }

    $targeted_term_ids = array( 600, 650, 700 ); // Targeted category(ies) term ID(s)
    $fee_amount = 5; // Define the fee amount
    $category_found = false; // Initialize
    
    // Loop through cart items
    foreach( $cart->get_cart() as $item ) {
        // Check for the targeted product categories
        if ( has_term( $targeted_term_ids, 'product_cat', $item['product_id'] ) ) {
            $category_found = true; // Category found
        }
    }

    // Add the Fee
    if ( $category_found ) {
        $cart->add_fee( __('Additional Charge', 'woocommerce'), $fee_amount );
    }
}

Code goes in functions.php file of your child theme (or in a plugin). It should work.

Upvotes: 1

Related Questions