Search the site:

Creating a new Shipping method and exploring the Shipping method API of WooCommerce

In this post we shall learn on how to create a new shipping method in addition to existing ones and exploring some options from Shipping Method API of WooCommerce. Since version 2.6 of WooCommerce, there are only 3 default types of shipping methods. They are as follows:

  • Flat Rate
  • Free Shipping and
  • Local Pickup

Let us follow the below mentioned steps to add our new shipping method called Tyche Shipping.

1. Register shipping method

WooCommerce has a filter called woocommerce_shipping_methods. The function hooked to this filter will have the current available shipping methods in the form of an array. We shall add our shipping method tyche_method as shown in the below snippet.

Note that WC_Shipping_Tyche is the name of the class for which we are adding the shipping method. Here is a sample snippet of the class WC_Shipping_Tyche which is an extension of WC_Shipping_Method class.

Let’s take a look at a few properties of the WC_Shipping_Method that we just extended to create a new class for our Tyche Shipping Method.

  • id – A unique text based ID for the new shipping method you are adding. Here we have used our ID as tyche_method.
  • instance_id – Unique instance ID of the method (zones can contain multiple instances of a single shipping method). This ID is stored in the database.
  • method_title – The title applied to the shipping method. This is not the same title that will be displayed on the front-end on checkout page but used only for backend settings. For our shipping method we have used Tyche Shipping Method as the title
  • supports – This property is used to determine which all features the new shipping method will support. This property is an array with possible values as:
    1. shipping-zones – Shipping zone functionality.
    2. instance-settings – Instance settings screens.
    3. settings – Non-instance settings screens. Enabled by default for backward compatibility with methods before instances existed.
    4. instance-settings-modal – Allows the instance settings to be loaded within a modal in the zones UI.
  • enabled – Stores whether or not the instance or method is enabled. In the above snippet we have assigned the instance which is saved in database. This value will be displayed in Shipping Methods section of the shipping zone.
  • title – Stores the title of your method which can be used on the frontend for Checkout and Cart Pages.
  • instance_form_fields – This property is an array of settings fields used at instance level. Here we have shown just one setting which is the title to be displayed on the frontend of the store that we had discussed above.

Now that the shipping method has been registered, let us verify and check if it is getting displayed and settings getting saved and applied.

2. Verify the newly created Shipping Method

The settings for shipping are available under WooCommerce -> Settings -> Shipping. Let us create a new Shipping Zone by clicking on Add Shipping Zone.

On clicking on Add Shipping Method under Shipping Methods tab, a pop-up modal shall be displayed like one shown below. Now you will notice our newly created shipping method Tyche Shipping Method getting listed in the dropdown list.

Newly Created Shipping Method
Newly Created Shipping Method

The settings associated with this shipping method, in our case the Title to be displayed on frontend can be configured and edited as per our needs. Just a reminder that we had added title element in instance_form_fields property of the Shipping Method API.

Tyche Shipping Settings
Tyche Shipping Settings

The above setting can also be displayed in a modal pop-up by adding instance-settings-modal value to supports property array. The default value, Test Method can be changed by changing the value of the default key of the title element of instance_form_fields.

3. Price calculations for newly created Shipping Methods

If the shipping method is enabled it will be displayed on the Checkout page, but how about the pricing for the Shipping Method ? We have a few methods or functions which are provided by the Shipping Method API which we shall use to add pricing options to the shipping method. Let us quickly go through those functions.

  • calculate_shipping( package )

This function is called to calculate shipping for a package. The function accepts an array containing the package of items to be shipped. One should use ::add_rate() to register calculated rates.

  • add_rate( args )

This is the actual function that adds rate to the checkout page. It accepts an array as an argument. A brief gist of the args parameter is as follows:

  'id' => 'tyche_method',
  'label' => 'Tyche Shipping Method',
  'cost' => '100',

So let us use the above two methods that we just described in our WC_Shipping_Tyche class so that we can add rates on the checkout page. Add the below given snippet after __construct function of WC_Shipping_Tyche class.

4. Verify the Shipping Method on frontend

Now that we also added a rate to our Shipping Method, add a product to your shopping cart and verify the shipping method. You should see something like this:

Tyche Shipping Method on Cart Page
Tyche Shipping Method on Cart Page

Apart from the properties and methods mentioned above there are a few other properties and methods as well which can be used to create and tweak a Shipping Method as per your needs. Those are available on the following link.

So after following the above steps you shall be able to create a new Shipping Method as per your needs and requirements. I hope you find this tutorial useful in creating and modifying Shipping Methods.

Please mention your queries/suggestions/comments in comments area below and we shall get back to you as early as possible.

Browse more in: WooCommerce Tutorials, WooCommerce, WooCommerce How Tos
Notify of

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Inline Feedbacks
View all comments
2 years ago

Can you send me the plugin files ?

Tony Roug
2 years ago

Wonderful that you guys are publishing this.

What you need as Tyche is a way for a custom shipping method to interact with your delivery date plugin.

Specifically to pass to you
1. The prep time so you can limit what days and times can be selected.
2. Whether time should be displayed as an option at all
3. Whether customer inputting date and time are mandatory.

2 years ago

You didn’t say where to put all the .php files. Is it under woocommerce plugin? If so, which exact folder? OR do we create a new plugin? If so, it best you tell someone how to create a plugin like what files/folders to create

2 years ago

When I am processing the order, I have this problem. It keeps loading…
May someone help me?

Marc Hypolite
Marc Hypolite
1 year ago

Hi thought this code was very useful I found that this repo here is a good example for me to see how to structure these snippets of code

from purchased

Subscribe for more offers

Would love your thoughts, please comment.x