Set custom shipping rates programmatically in WooCommerce 3
Asked Answered
K

2

9

I have searched and found a number of examples of how to change the shipping rates. Basically I am looking to do the same, but I want to use a 3rd party API.

I have set up a custom plugin with a functions.php and activated it. I think used something simple like this:

add_filter('woocommerce_package_rates','test_overwrite',10,2);
function test_overwrite($rates,$package) {

    echo "<h2>Can you see me</h2>";
    foreach ($rates as $rate) {
        //Set the price
        $rate->cost = 1000;
        //Set the TAX
        $rate->taxes[1] = 1000 * 0.2;
    }
    return $rates;
}

However when I run either the checkout, or basket, the filter does not seem to run because I cannot see the echo. I also tried print_r().

Am I missing something as to why I cannot run this filter ?

Kindred answered 14/2, 2018 at 12:2 Comment(0)
P
16

As this is a filter and as the data is cached, you can't get any output with print_r().

The correct way to make it work is the following:

add_filter( 'woocommerce_package_rates', 'custom_shipping_costs', 20, 2 );
function custom_shipping_costs( $rates, $package ) {
    // New shipping cost (can be calculated)
    $new_cost = 1000;
    
    foreach( $rates as $rate_key => $rate ){
        // Excluding free shipping methods
        if( $rate->method_id != 'free_shipping'){
            // Original rate cost
            $base_cost = $rate->cost; 

            // Set rate cost
            $rates[$rate_key]->cost = $new_cost;

            // Set taxes rate cost (if enabled)
            $taxes = array();
            $has_taxes = false;

            // Loop through taxes
            foreach ($rate->taxes as $key => $tax){
                if( $tax > 0 ) {
                    $conv_rate   = $tax / $base_cost; 
                    $taxes[$key] = $new_cost * $conv_rate; // Set tax rate cost
                    $has_taxes = true;
                }
            }
            if ( has_taxes ) {
                $rates[$rate_key]->taxes = $taxes;
            }
        }
    }
    return $rates;
}

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

You may need to refresh shipping methods cache by emptying the cart.

Pharmacist answered 14/2, 2018 at 13:4 Comment(1)
That is great, thank you. I did not understand about clearing the cache because the price was going to change I had thought it would work. That said, if I cannot print or echo how do I know what the $package looks like. So I get total weight, country for the 3rd Party Api ?Kindred
D
0

has_taxes was used without $ symbol, so it gave the error

if ( $has_taxes ) {
Disparate answered 18/6, 2024 at 8:17 Comment(1)
This is not an answer. You can add comment in other answer or question.Kktp

© 2022 - 2025 — McMap. All rights reserved.