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;
			$count++;
		}
		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. tariq Avatar

    How to create language for all cites in one country , For example we need same cities to appear in Arabica language , How to do that ? need to change all manually for plugin ?

    1. Condless Avatar

      Hi Tariq,
      See the ‘How to translate the cities names?’ section in this docs, you will have to translate via the WordPress translation platform, the cities of which country you wish to translate?

  2. Andre Avatar
    Andre

    Hi,

    Can you please add support for “Namibia”.

    Thank you in advance.

  3. Daniela Avatar
    Daniela

    Hi, can New Zealand be added in the list of countries please?

    1. Condless Avatar

      Hi Daniela,
      Please contact us.

  4. فيب السعودية Avatar

    can you update saudi arabia list ?

  5. waqas Pervaiz Avatar

    hi. i am trying to add city Tawergha in Libya but it is not adding this city

    1. Condless Avatar

      Hi Waqas,
      Libya is splitted into districts so you can choose ‘Misrata’.

  6. Andi Avatar

    Hello,

    Can you also add Kosovo in the list of Counties as it is missing?
    Love the plugin btw, very very helpful.

    Thank you!

    1. Condless Avatar

      Hi Andi,
      You can add country using the following snippet.

  7. José López Avatar

    Hello, good solution for shipping zones!
    On the checkout page there is a city that is not there when creating shipping zones. How can I solve that?

    1. Condless Avatar

      Hi José,
      Which city is missing?

  8. Angelo Storniolo Avatar
    Angelo Storniolo

    Hello, I have to add 5 missing cities, can you help me? The cities are these: Country: Italy
    Province: Turin
    Town: Torassi – Montegiove – Betlemme – Castelrosso – Rodallo

    1. Condless Avatar

      Hi Angelo,
      Those towns belong to the Chivasso municipality, this municipality can be splitted to multiple towns using the code from the docs ‘How to create shipping zones for quarters inside a city?’ with the following values:
      $country_code = 'IT';
      $city_code = 'IT001082';
      $sub_cities = [ 'altro', 'Torassi', 'Montegiove', 'Betlemme', 'Castelrosso', 'Rodallo' ];

      Some payment methods (such as PayPal) may not be compatible with this customization.

    2. Angelo Storniolo Avatar
      Angelo Storniolo

      I did not understand what I have to do sorry, can you be more specific? Where should I enter this code? Is there a tutorial I can follow? Or can you tell me step by step what to do? Would you really help me, thank you very much!

    3. angelo Avatar
      angelo

      I entered this code and I succeeded! Did I do it right?

      add_filter( ‘csz_cities’, ‘csz_split_cities’ );
      function csz_split_cities( $cities ) {
      $country_code = ‘IT’;
      $city_code = ‘IT001082’;
      $sub_cities = [ ‘altro’, ‘Torassi’, ‘Montegiove’, ‘Betlemme’, ‘Castelrosso’, ‘Rodallo’ ];
      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;
      $count++;
      }
      unset( $cities[ $country_code ][ $city_code ] );
      }
      return $cities;
      }

    4. Condless Avatar

      Yes, please test your payment methods by selecting 1 of those towns on checkout and create order.

  9. John Torres Avatar

    Hi. How do I print a message depending on the chosen city?

    1. Condless Avatar

      Hi John,
      Using code, if you need to display the minimum order amount for shipping for the selected city there is another PHP snippet.

  10. piyamantha Avatar
    piyamantha

    Hai.I am from sri lanka.I have a full of city list. Can you add?

  11. jairo polanco Avatar

    The latest version is not loading the cities, please add the problem. Thank you

    1. Condless Avatar

      Hi Jairo,
      Please change the label of the billing_state and shipping_state fields from ‘Región / Provincia’ to ‘cidade’ via the Checkout Fields Editor plugin.

  12. Giulianno Russo Avatar

    Hello! How do I add Cities and Departaments missing from PARAGUAY? Thanks

    1. Condless Avatar

      Hi Giulianno,
      The list of distritos of Paraguay was taken from here, if you have more up to date list please send it via Email.

  13. Juan David Martínez Avatar

    Hello! How do I add Cities for all the state missing from Mexico? Thanks

    Could u add cities from Mexico Country? It will really Help

    1. Condless Avatar

      Hi Juan,
      Mexico is not yet supported, you’ll notified once it is.

  14. Felipe Avatar
    Felipe

    Buenos dias, ¿como puedo agregar una region nueva a Chile? La region de Biobio se dividio y ahora sus ciudades se dividieron en region de Biobio y region de Ñuble.

    ¿Esto vendra en alguna actualizacion?

    Gracias.

  15. frits Avatar
    frits

    Hi, I miss the following cities for the Netherlands:
    – Ursem
    – Badhoevedorp
    – Obdam
    – Halfweg
    – Zwanenburg

    Can you please add them?

    1. Frits Avatar
      Frits

      any updates?

Leave a Reply

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