Cities Shipping Zones for WooCommerce

How to set different shipping rates per city?
In the plugin settings choose on which countries to apply the plugin on, create new shipping zone and add the cities inside, add the relevant shipping methods and prices.

How to apply taxes per city/state?
In WooCommerce tax settings use the city code at the state field, or use the city code at the city field and the state code at the state field and add:

add_filter( 'csz_enable_tax_per_state', '__return_true' );

How to convert cities list (cities seperated by lines) to the Bulk Select tool required format (cities seperated by ;)?
Replace [\r\n]+ (regex) with ; in Notepad++.

How to retrieve the shipping zone / the state that some city is belong to from a 3-party app?
Extension for the WooCommerce REST API is available.

How to translate cities names?
Use the built-in WordPress editor, filter your country’s cities using {country_code}-cities (for example use EE-cities for Estonia, contact us if the cities are absent or if you have ready-made translation), when finish translating contact your language team to approve it, then export the .mo file to your /wp-content/languages/plugins/ folder and change its name to cities-shipping-zones-for-woocommerce-{language_code}.

How to modify cities names?
Update countries codes, and cities codes and names (add the state prefix if using the ‘State Filters’ option):

add_filter( 'csz_cities', 'csz_modify_cities_names' );
function csz_modify_cities_names( $cities ) {
	$country = 'EE';
	$cities_names = [
		'EE784'	=> 'Talin',
		'EE296'	=> 'Keilalinn',
	foreach ( $cities_names as $key => $city ) {
		if ( isset( $cities[ $country ][ $key ] ) ) {
			$cities[ $country ][ $key ] = $city;
	return $cities;

How to remove some cities from the list?
Update country code and cities codes:

add_filter( 'csz_cities', 'csz_remove_cities' );
function csz_remove_cities( $cities ) {
	$country_code = 'EE';
	$unnecessary_cities = [ 'EE784', 'EE296', 'EE446' ];
	foreach ( $unnecessary_cities as $city ) {
		if ( isset( $cities[ $country_code ][ $city ] ) ) {
			unset( $cities[ $country_code ][ $city ] );
	return $cities;

How to keep only specific cities in the cities dropdown?
Update country code and cities codes:

add_filter( 'csz_cities', 'csz_set_cities' );
function csz_set_cities( $cities ) {
	$country = 'EE';
	$keep_cities = [ 'EE784', 'EE296', 'EE446' ];
	foreach ( $keep_cities as $city ) {
		if ( isset( $cities[ $country ][ $city ] ) ) {
			$new_cities[ $city ] = $cities[ $country ][ $city ];
	if ( ! empty( $new_cities ) ) {
		$cities[ $country ] = $new_cities;
	return $cities;

How to remove from the list all the cities of certain states?
Update states codes:

add_filter( 'csz_states', 'csz_remove_states_cities' );
function csz_remove_states_cities( $states ) {
	$unnecessary_states = [ 'EE001', 'EE004', 'EE006' ];
	foreach ( $unnecessary_states as $state_code ) {
		if ( isset( $states[ $state_code ] ) ) {
			unset( $states[ $state_code ] );
	return $states;

How to keep in the cities dropdown only the cities from certain states (not compatible with international stores)?
Update states codes:

add_filter( 'csz_states', 'csz_set_states' );
function csz_set_states( $states ) {
	$keep_states = [ 'EE001', 'EE004', 'EE006' ];
	foreach ( $keep_states as $state ) {
		if ( isset( $states[ $state ] ) ) {
			$new_states[ $state ] = $states[ $state ];
	return $new_states ?? $states;

How to create shipping zones for quarters inside a city?
Create shipping zone with that city and restrict to the relevant postcodes or add multiple flat rate shipping methods to the shipping zone for the different areas, or split the city into areas (less recommended, update country code and city code and areas names, update the store location in WooCommerce settings, not compatible with the ‘State Autofill’ option):

add_filter( 'csz_cities', 'csz_split_cities' );
function csz_split_cities( $cities ) {
	$country_code = 'EE';
	$city_code = 'EE784';
	$sub_cities = [ __( 'Northern', 'woocommerce' ), __( 'Southern', 'woocommerce' ) ];
	if ( isset( $cities[ $country_code ][ $city_code ] ) ) {
		$count = 101;
		foreach ( $sub_cities as $sub_city ) {
			$cities[ $country_code ][ $city_code . $count ] = $cities[ $country_code ][ $city_code ] . ' - ' . $sub_city;
		unset( $cities[ $country_code ][ $city_code ] );
	return $cities;

How to group multiple cities into one area?
Update the country code, the area name (add the state prefix if using the ‘State Filters’ option) and its main city, and the cities its included:

add_filter( 'csz_cities', 'csz_group_cities' );
function csz_group_cities( $cities ) {
	$country_code = 'EE';
	$area_name = 'Tallinn Area';
	$main_city_code = 'EE784';
	$secondary_cities = [ 'EE296', 'EE446', 'EE726', 'EE890' ];
	if ( isset( $cities[ $country_code ][ $main_city_code ] ) ) {
		foreach ( $secondary_cities as $city ) {
			if ( isset( $cities[ $country_code ][ $city ] ) ) {
				unset( $cities[ $country_code ][ $city ] );
		$cities[ $country_code ][ $main_city_code ] = $area_name;
	return $cities;

How to move some cities to the top of the dropdown?
Update the country and cities codes:

add_filter( 'csz_cities', 'csz_cities_custom_order' );
add_filter( 'csz_sort_cities', 'csz_disable_sort', 10, 2 );

function csz_cities_custom_order( $cities ) {
	$country = 'EE';
	$first_keys = [ 'EE726', 'EE890' ];
	$pre_arr = [];
	foreach ( $first_keys as $key ) {
		if ( isset( $cities[ $country ][ $key ] ) ) {
			$pre_arr[ $key ] = $cities[ $country ][ $key ];
	asort( $cities[ $country ] );
	$cities[ $country ] = $pre_arr + $cities[ $country ];
	return $cities;

function csz_disable_sort( $sort, $country_code ) {
	$country = 'EE';
	return $country === $country_code ? false : $sort;

How to move some states to the top of the dropdown?
Update the states codes:

add_filter( 'csz_sort_states', '__return_false' );
add_filter( 'csz_states', 'csz_states_custom_order' );
function csz_states_custom_order( $states ) {
	$first_keys = [ 'EE007', 'EE004' ];
	$pre_arr = [];
	foreach ( $first_keys as $key ) {
		if ( isset( $states[ $key ] ) ) {
			$pre_arr[ $key ] = $states[ $key ];
	asort( $states );
	return $pre_arr + $states;

How to let customers to select a city which is not exist in the list?
Shipping zone for the countries you applied the plugin on must be configured or at ‘Locations not covered’ if ‘Selling locations’ option is enabled (not compatible with the ‘State Filters’ and ‘State Autofill’ options):

add_filter( 'csz_enable_custom_city', '__return_true' );

How to uninstall the plugin?
WooCommerce Shipping Zones settings: erase the locations.
Plugin Settings: Remove the countries.
WooCommerce General Settings: Update the store location country / state.
Users: convert/erase the state field values of users that were created/updated while the plugin was applied on the countries they belong to.
Plugins: Deactivate and delete the plugin.

271 responses to “Cities Shipping Zones for WooCommerce”

  1. Muhammad Abdulrazek Avatar
    Muhammad Abdulrazek
    this is a screenshot of my proplem
    i would like to change shipping fees to 9 riyal instead of 35 riyal for other cities whithin my country

    1. Condless Avatar

      Hi Muhammad,
      Please create 2 shipping zones, 1 for Saudi Arabia and 1 for the special city (drag it to be on the top of the shipping zones list).

  2. Steve Calderon Avatar
    Steve Calderon

    Hi! is there any chance to use states and cities as shipping zones?

    1. Condless Avatar

      Try using the Bulk Select tool (in the plugin settings), you can insert a state name/code- then all its cities will be inserted automatically into the selected shipping zone.

  3. saad ezz Avatar

    How to add new cities which not listed in cities drop down? my country is Egypt.

  4. ahmed Avatar

    Thanks for the awesome plugin!

    I noticed UAE doesn’t have full list of cities / states. For that, I have compiled full UAE list, how to add it?


    1. Condless Avatar

      Hi Ahmed,
      Please contact us with the missing cities.

  5. Cody Avatar


    I would like to use this but I need Mexico on there. Also any chance of making options like just showing certain cities part of the plugin GUI? Thanks!

    1. Condless Avatar

      Unfortunately Mexico is not yet supported.

  6. vlad Avatar

    Hello Condless. Please add the regions of Russia (ru)

    1. Condless Avatar

      Hi Vlad,
      Russia is not yet supported, you will be notified once it is.

  7. Tina Avatar

    Hello, can you please add Bahrain (BH) and Oman (OM)?
    Thank you.

    1. Condless Avatar

      Hi Tina,
      Bahrain and Oman are not yet supported, you will be notified once it is.

  8. Shrijith Avatar

    Can you please add support for Oman

    1. Condless Avatar

      Hi Shrijith,
      Oman is not yet supported, you will be notified once it is.

  9. Omar Avatar

    Hello , thanks for this amazing plugin i really love it , just want to ask about adding new cities , and want to translate via WPML but the cities I’ve added not appearing

  10. Omar BENSALAH Avatar

    How I can add a missing cities in UAE ?

  11. acrylic paints Avatar

    Pakistan is not yet supported. can you explain this?

    1. Condless Avatar

      Pakistan is supported, you will have to select it on the first option of the plugin settings.

  12. Fouad Avatar

    First, thank you for the awesome plugin ! It was perfect for my website, which needs to deliver only in Morocco.
    So a BIG thank you 😉
    One question: the capital city of Morocco, Rabat, is not listed. How can I add it ?
    Best regards from Marrakech.

    1. Condless Avatar

      Hi Fouad,
      Rabat is splitted into smaller areas, you can combine those areas into 1 city using the code in the docs: ‘How to group multiple cities into 1 area?’

  13. amin Avatar

    Can you please add support for Iran

  14. amin Avatar

    how to translate cities name to another language.
    i mean write names with the culture alphabets

    1. Condless Avatar

      Hi Amin,
      Use the WordPress translation platform, when you finish export it to the plugin /i18n/languages/ path.

    2. amin Avatar

      thanks for the reply

      i’ve translated some cities for test and export the file in the path. both po and mo is exported. the filenames are

      but it doesn’t work. what did i do wrong?

    3. Condless Avatar

      Contact the language translation team to approve the translation, and try replace ‘ir’ with ‘fa’ or ‘fa_IR’ in the file name.

  15. Alex Avatar

    Please add Russian Country

Leave a Reply

Your email address will not be published. Required fields are marked *