Tax rule setup in WooCommerce

Today I re-memorized the setup of WooCommerce set up by practicing re-learn WooCommerce big picture.

First, check Enable tax rates and calculations from WooCommerce->Settings->General. Following is the screenshot of this

enable tax

Then, I get a new tab named Tax at WooCommerce->Settings.
Let, open Tax tab. By default, here I find two tabs which are Tax options and Standard rates.

In Tax options tab, there is all about tax setup. 

Suppose a merchant wants that, his customer will pay tax. This means the tax does not affect the product price. For this case, select  No, I will enter prices exclusive of tax for Prices entered with tax option. Otherwise, select  Yes, I will enter prices inclusive of tax if the product price is including tax.

Then, I can choose an option from Calculate tax based on selection. It will be on the Customer shipping address or billing address. There is another option by which tax will calculate on the shop address.

Next, I have an option about Shipping tax class. Tax can depend on total cart price or tax can apply for every product.

Next, I get a really cool option for Rounding the Tax. 

Next, I have a cool option for Rounding the Tax. That’s I can’t understand yet.

Next, I have Additional tax classes option. Here, tax classes can add multiple tax classes. Suppose, a business ships their product in CountryA and CountryB. CountryA charge 30% tax and CountryB charge 15% tax. So, for two tax rate, write down these tax classes as

Next, I have Display prices in the shop check. This determines that, on a shop page, the price will display with tax or without tax.

Next, I have Display prices during cart and checkout page. If I checked, Calculate tax based on shop base address, then tax shown on the cart page. If Calculate tax based on was customer shipping address or customer billing address then, the tax will be shown when the customer fills the address form.

Git flow: A overview

Today I learn “how to use git-flow” Git flow is a system to maintain git branching efficiently. Love it. However, I like to share my experience.

I like to create a very-very simple plugin and maintain it with git-flow.

First, install git-flow from

Let go to the wp-content/plugins location and make a new directory for the super-simple plugin. Because this plugin just locally exists, yet it is not hosted anywhere, so I init the git with

git init

Then, I initialize git-flow here by the “git flow init” command. This command asks me some questions. Except “Version tag prefix”, all is the default. I choice “v” for “Version tag prefix”.

Then, created a file “init.php” with

 * Plugin Name: Super Simple Plugin

 // Register Custom Post Type
function custom_post_type() {

	$labels = array(
		'name'                  => _x( 'Post Types', 'Post Type General Name', 'text_domain' ),
		'singular_name'         => _x( 'Post Type', 'Post Type Singular Name', 'text_domain' ),
		'menu_name'             => __( 'Post Types', 'text_domain' ),
		'name_admin_bar'        => __( 'Post Type', 'text_domain' ),
		'archives'              => __( 'Item Archives', 'text_domain' ),
		'attributes'            => __( 'Item Attributes', 'text_domain' ),
		'parent_item_colon'     => __( 'Parent Item:', 'text_domain' ),
		'all_items'             => __( 'All Items', 'text_domain' ),
		'add_new_item'          => __( 'Add New Item', 'text_domain' ),
		'add_new'               => __( 'Add New', 'text_domain' ),
		'new_item'              => __( 'New Item', 'text_domain' ),
		'edit_item'             => __( 'Edit Item', 'text_domain' ),
		'update_item'           => __( 'Update Item', 'text_domain' ),
		'view_item'             => __( 'View Item', 'text_domain' ),
		'view_items'            => __( 'View Items', 'text_domain' ),
		'search_items'          => __( 'Search Item', 'text_domain' ),
		'not_found'             => __( 'Not found', 'text_domain' ),
		'not_found_in_trash'    => __( 'Not found in Trash', 'text_domain' ),
		'featured_image'        => __( 'Featured Image', 'text_domain' ),
		'set_featured_image'    => __( 'Set featured image', 'text_domain' ),
		'remove_featured_image' => __( 'Remove featured image', 'text_domain' ),
		'use_featured_image'    => __( 'Use as featured image', 'text_domain' ),
		'insert_into_item'      => __( 'Insert into item', 'text_domain' ),
		'uploaded_to_this_item' => __( 'Uploaded to this item', 'text_domain' ),
		'items_list'            => __( 'Items list', 'text_domain' ),
		'items_list_navigation' => __( 'Items list navigation', 'text_domain' ),
		'filter_items_list'     => __( 'Filter items list', 'text_domain' ),
	$args = array(
		'label'                 => __( 'Post Type', 'text_domain' ),
		'description'           => __( 'Post Type Description', 'text_domain' ),
		'labels'                => $labels,
		'supports'              => false,
		'taxonomies'            => array(  ),
		'hierarchical'          => false,
		'public'                => true,
		'show_ui'               => true,
		'show_in_menu'          => true,
		'menu_position'         => 5,
		'show_in_admin_bar'     => true,
		'show_in_nav_menus'     => true,
		'can_export'            => true,
		'has_archive'           => true,
		'exclude_from_search'   => false,
		'publicly_queryable'    => true,
		'capability_type'       => 'page',
	register_post_type( 'post_type', $args );

add_action( 'init', 'custom_post_type', 0 );

Here, I initialize a super-simple custom post type. Suppose, this is our first initialization. So, add this with

git add .
git commit -m "Just Init"

Then, our git-flow comes on the stage. We want to create a new feature, which will remove taxonomies for this post type. So, I start a new feature by

git flow feature start remove-tax

Now, I am in “remove-tax” branch.

To do this feature find and replace

'taxonomies' => array( ),

in post type arguments.

Add and commit git with

git add .
git commit -m "tax remove successfully"

Now, this feature is completed. So, I finish this feature by

git flow feature finish

Now, I am on “develop” branch with “new” commit.

Assume, our feature is ready for deployment. Now,

git flow release start 1.0.0

command start new release branch.
At this time, I can change and add anything before release finish. Finally, when release is okay,

git flow release finish

Finally, I can see these git-flow work by hosting on
Create a new repo named “super-simple” and add this with

git remote add origin

and push all things with tags by

git push origin --all --follow-tags

( … ) Variable-length argument lists

In programming, there are many ways to solve a problem. But, everyone likes to easy and short solution.

The reason of telling that, PHP has a syntax token that will make my day. This is called Argument unpacking token or Variable-length argument lists token. This is typed with three dots ( … ). This is safe to use for 5.6 or latest version. For example,

function sum( ...$numbers ) {
    $acc = 0;
    foreach ( $numbers as $n ) {
        $acc += $n;
    return $acc;

echo sum( 1, 2, 3, 4 );

return output 10 as 1+2+3+4=10.