WooCommerce: Pre-select and restrict to one state and city on checkout
Since woocommerce 3, default_checkout_country
and default_checkout_state
filter hooks are now deprecated and replaced.
Also in your last function, if you want to restrict just to one city, you should not include your city in the array of states. Instead you should return only one possible value.
So this will be your code:
// default checkout country
add_filter( 'default_checkout_billing_country', 'change_default_checkout_country' );
add_filter( 'default_checkout_shipping_country', 'change_default_checkout_country' );
function change_default_checkout_country() {
return 'PK'; // country code
}
// default checkout state
add_filter( 'default_checkout_billing_state', 'change_default_checkout_state' );
add_filter( 'default_checkout_shipping_state', 'change_default_checkout_state' );
function change_default_checkout_state() {
return 'SD'; // state code
}
// Setting one state only
add_filter( 'woocommerce_states', 'custom_woocommerce_state', 10, 1 );
function custom_woocommerce_state( $states ) {
// Returning a unique state
return array('PK' => array('SD' => 'Sindh'));
}
// Only one city at checkout
add_filter( 'woocommerce_checkout_fields', 'custom_checkout_fields', 10, 1 );
function custom_checkout_fields( $fields ) {
$fields['billing']['billing_city']['type'] = 'select';
$fields['billing']['billing_city']['options'] = array('Karachi' => 'Karachi');
$fields['shipping']['shipping_city']['type'] = 'select';
$fields['shipping']['shipping_city']['options'] = array('Karachi' => 'Karachi');
return $fields;
}
The Code goes in function.php file of your active child theme (or theme) or also in any plugin file.
This code is tested and works for wooCommerce versions 3+
Once added the code above and saved, you will need in
WooCommerce > Settings > General
to set locations this way:
Then you will get something like this on checkout:
Both dropdown have only one value… So you get what you are expecting.
![AliIshaq](https://i.stack.imgur.com/3KOgB.jpg?s=256&g=1)
AliIshaq
A UI/UX Designer, Full Stack Developer and Digital Marketing professional with an MBA and MSc in Marketing and extensive experience with web applications and web technology. I hold hands-on experience of designing and coding user interfaces (HTML, CSS and JS) and web apps (PHP, MySQL) along with experience on backend frameworks like Code Igniter / Laravel, and Bootstrap for front-end development.
Updated on August 06, 2022Comments
-
AliIshaq almost 2 years
I'm setting up a store that only sells to one city. I'm trying to figure out how I can restrict the city option to a pre-filled field.
I've already limited the country and using the following code in my
functions.php
:add_filter( 'default_checkout_country', 'change_default_checkout_country' ); add_filter( 'default_checkout_state', 'change_default_checkout_state' ); function change_default_checkout_country() { return 'PK'; // country code } function change_default_checkout_state() { return 'SD'; // state code }
And I've pre-selected the state using the following:
add_filter( 'woocommerce_states', 'bbloomer_custom_woocommerce_states' ); function bbloomer_custom_woocommerce_states( $states ) { $states['PK'] = array( 'SD' => 'Sindh', ); return $states; }
But... Now comes the city and I am lost. I've tried using
$fields['billing']['billing_city']
as well as$fields['billing']['billing_city']['value']
to no avail.I want the customer to be limited to Karachi. I am not very familiar with WooCommerce filters, so I need help on achieving this.