Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add a fee to WooCommerce per product, based on category

I've been trying for a while now to get this working but I haven't find any solution that does exactly what we need, and I'm far from an expert in PHP so I'm a bit lost.

We use WooCommerce and WooTickets. The goal is to add a 5% fee for "Service Fee" only to products in the "Tickets" category (ID:34).

We have found this code snipper, that add a fixed cost based on a product category :

// Add Service Fee to Category
function woo_add_cart_fee() {

$category_ID = '23';
global $woocommerce;

foreach ($woocommerce->cart->cart_contents as $key => $values ) {
    // Get the terms, i.e. category list using the ID of the product
$terms = get_the_terms( $values['product_id'], 'product_cat' );
    // Because a product can have multiple categories, we need to iterate through the list of the products category for a match
    foreach ($terms as $term) {
        // 23 is the ID of the category for which we want to remove the payment gateway
        if($term->term_id == $category_ID){
         $excost = 6;
         }
         }
        $woocommerce->cart->add_fee('Service Fee', $excost, $taxable = false, $tax_class = '');
}
}
add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' );

The main problem with this solution is that it adds a fixed cost, whereas we need a percentage cost.

We also found this code snippet from WooThemes themselves :

/**
 * Add a 1% surcharge to your cart / checkout
 * change the $percentage to set the surcharge to a value to suit
 * Uses the WooCommerce fees API
 *
 * Add to theme functions.php
 */
add_action( 'woocommerce_cart_calculate_fees','woocommerce_custom_surcharge' );
function woocommerce_custom_surcharge() {
  global $woocommerce;

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    $percentage = 0.05;
    $surcharge = ( $woocommerce->cart->cart_contents_total + $woocommerce->cart->shipping_total ) * $percentage;    
    $woocommerce->cart->add_fee( 'Service Fee', $surcharge, true, 'standard' );

}

But once again, there are a few problems with this solution...

1) The product category is not taken into consideration 2) It adds a fee based on the entire cart value, but it should only add a 5% fee to products in the "Tickets" product category, not the entire cart

like image 652
thisisbbc Avatar asked Oct 07 '14 16:10

thisisbbc


People also ask

How do I add a custom fee in WooCommerce?

Just after installing Woo Add Custom Fee plugin, Go to Woocommerce > Settings > Custom Fee. Set things according to your requirement and you are done.

How do I add a handling fee in WooCommerce?

Go to WooCommerce > Checkout and select the Billing tab from the drop-down menu. For the checkout, you will see different charging fields that you can enable or disable. For the time being, let's click Add New Field. You may now choose the field options you want to include in your new field.

Can a product have multiple categories in WooCommerce?

There is a woocommerce shop, categories on the left side (sidebar) and on the right side products. A product can have multiple categories; for example, the product "Burger" is in the categories "Food" and "Fastfood".

How do I create a category product in WooCommerce?

Go to WooCommerce > Settings, select the Products tab, and then choose the Display option. For each of the Shop Page Display and Default Category Display options, select Show both. Click the Save changes button to save.


2 Answers

I was having the same issue and came across a code snippet that set me on the correct path. For the life of me, I cannot find the original site that housed the snippet, but here is my reworked version.

function df_add_ticket_surcharge( $cart_object ) {

    global $woocommerce;
    $specialfeecat = 86; // category id for the special fee
    $spfee = 0.00; // initialize special fee
    $spfeeperprod = 0.05; //special fee per product

    foreach ( $cart_object->cart_contents as $key => $value ) {

        $proid = $value['product_id']; //get the product id from cart
        $quantiy = $value['quantity']; //get quantity from cart
        $itmprice = $value['data']->price; //get product price

        $terms = get_the_terms( $proid, 'product_cat' ); //get taxonamy of the prducts
        if ( $terms && ! is_wp_error( $terms ) ) :
            foreach ( $terms as $term ) {
                $catid = $term->term_id;
                if($specialfeecat == $catid ) {
                    $spfee = $spfee + $itmprice * $quantiy * $spfeeperprod;
                }
            }
        endif;  
    }

    if($spfee > 0 ) {

        $woocommerce->cart->add_fee( 'Ticket Concierge Charge', $spfee, true, 'standard' );
    }

}

add_action( 'woocommerce_cart_calculate_fees', 'df_add_ticket_surcharge' );

This will add a 5% surcharge to each item in the cart with the category of ticket (id: 86). I hope this helps you out, if you have not found a solution already.

like image 132
Sartorius Avatar answered Oct 19 '22 09:10

Sartorius


thanks for posting this above code. I had needed exactly this, but there were some problems for, me. I didn't want the category to be a part of it, i wanted it to apply to all products, and I also required a fixed fee per product.

The other problem I had was if I had 2 different products in the cart it would only calculate it as 1 product. so I did some research and found a way for it to calculate the total number of products in the cart. So here is the final code I came out with. Thought it may help someone else looking for a similar answer

/** add handling fee **/
function df_add_handling_fee( $cart_object ) {

global $woocommerce;
// $specialfeecat = 3711; // category id for the special fee
$spfee = 0.00; // initialize special fee
$spfeeperprod = 10; //special fee per product

//Getting Cart Contents. 
$cart = $woocommerce->cart->get_cart();
//Calculating Quantity
foreach($cart as $cart_val => $cid){
   $qty += $cid['quantity']; 
}
foreach ( $cart_object->cart_contents as $key => $value ) {

    $proid = $value['product_id']; //get the product id from cart
    //$quantiy = $value['quantity']; //get quantity from cart
    $itmprice = $value['data']->price; //get product price

    $terms = get_the_terms( $proid, 'product_cat' ); //get taxonamy of the prducts
    if ( $terms && ! is_wp_error( $terms ) ) :
        foreach ( $terms as $term ) {
            //$catid = $term->term_id;
            //if($specialfeecat == $catid ) {
                $spfee = $qty * $spfeeperprod;
            //}
        }
    endif;  
}

if($spfee > 0 ) {

    $woocommerce->cart->add_fee( 'Handling Fee', $spfee, true, 'standard' );
}

}

add_action( 'woocommerce_cart_calculate_fees', 'df_add_handling_fee' );

As you can see I have just commented out the parts from the original code. Hope someone can benefit from this :)

like image 44
user3674860 Avatar answered Oct 19 '22 10:10

user3674860