Last active
August 5, 2025 20:46
-
-
Save brinyemp4/bc6b1014b7642613bc62e1968e570b20 to your computer and use it in GitHub Desktop.
Country State dropdown on WordPress [inspired from WooCommerce] without any external plugin [Only theme template code & assuming reg-country form field & wrapper]
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| function iws_get_states_from_country() { | |
| $states = iws_get_woocommerce_states($_GET['country']); | |
| $response = array(); | |
| $response['fieldType'] = count($states)>0?'select':'text'; | |
| $response['states'] = $states; | |
| echo json_encode($response); | |
| wp_die(); | |
| } | |
| add_action('wp_ajax_get_states_from_country', 'iws_get_states_from_country'); | |
| add_action('wp_ajax_nopriv_get_states_from_country', 'iws_get_states_from_country'); | |
| ?> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| /** | |
| * Get an array of worldwide countries (as used in WooCommerce). | |
| * | |
| * @return array Country codes as keys, country names as values. | |
| */ | |
| function iws_get_woocommerce_countries() { | |
| return array( | |
| 'AF' => 'Afghanistan', | |
| 'AX' => 'Åland Islands', | |
| 'AL' => 'Albania', | |
| 'DZ' => 'Algeria', | |
| 'AS' => 'American Samoa', | |
| 'AD' => 'Andorra', | |
| 'AO' => 'Angola', | |
| 'AI' => 'Anguilla', | |
| 'AQ' => 'Antarctica', | |
| 'AG' => 'Antigua and Barbuda', | |
| 'AR' => 'Argentina', | |
| 'AM' => 'Armenia', | |
| 'AW' => 'Aruba', | |
| 'AU' => 'Australia', | |
| 'AT' => 'Austria', | |
| 'AZ' => 'Azerbaijan', | |
| 'BS' => 'Bahamas', | |
| 'BH' => 'Bahrain', | |
| 'BD' => 'Bangladesh', | |
| 'BB' => 'Barbados', | |
| 'BY' => 'Belarus', | |
| 'BE' => 'Belgium', | |
| 'BZ' => 'Belize', | |
| 'BJ' => 'Benin', | |
| 'BM' => 'Bermuda', | |
| 'BT' => 'Bhutan', | |
| 'BO' => 'Bolivia', | |
| 'BQ' => 'Bonaire, Sint Eustatius and Saba', | |
| 'BA' => 'Bosnia and Herzegovina', | |
| 'BW' => 'Botswana', | |
| 'BV' => 'Bouvet Island', | |
| 'BR' => 'Brazil', | |
| 'IO' => 'British Indian Ocean Territory', | |
| 'BN' => 'Brunei Darussalam', | |
| 'BG' => 'Bulgaria', | |
| 'BF' => 'Burkina Faso', | |
| 'BI' => 'Burundi', | |
| 'KH' => 'Cambodia', | |
| 'CM' => 'Cameroon', | |
| 'CA' => 'Canada', | |
| 'CV' => 'Cape Verde', | |
| 'KY' => 'Cayman Islands', | |
| 'CF' => 'Central African Republic', | |
| 'TD' => 'Chad', | |
| 'CL' => 'Chile', | |
| 'CN' => 'China', | |
| 'CX' => 'Christmas Island', | |
| 'CC' => 'Cocos (Keeling) Islands', | |
| 'CO' => 'Colombia', | |
| 'KM' => 'Comoros', | |
| 'CG' => 'Congo', | |
| 'CD' => 'Congo, The Democratic Republic of the', | |
| 'CK' => 'Cook Islands', | |
| 'CR' => 'Costa Rica', | |
| 'CI' => 'Côte d\'Ivoire', | |
| 'HR' => 'Croatia', | |
| 'CU' => 'Cuba', | |
| 'CW' => 'Curaçao', | |
| 'CY' => 'Cyprus', | |
| 'CZ' => 'Czechia', | |
| 'DK' => 'Denmark', | |
| 'DJ' => 'Djibouti', | |
| 'DM' => 'Dominica', | |
| 'DO' => 'Dominican Republic', | |
| 'EC' => 'Ecuador', | |
| 'EG' => 'Egypt', | |
| 'SV' => 'El Salvador', | |
| 'GQ' => 'Equatorial Guinea', | |
| 'ER' => 'Eritrea', | |
| 'EE' => 'Estonia', | |
| 'SZ' => 'Eswatini', | |
| 'ET' => 'Ethiopia', | |
| 'FK' => 'Falkland Islands (Malvinas)', | |
| 'FO' => 'Faroe Islands', | |
| 'FJ' => 'Fiji', | |
| 'FI' => 'Finland', | |
| 'FR' => 'France', | |
| 'GF' => 'French Guiana', | |
| 'PF' => 'French Polynesia', | |
| 'TF' => 'French Southern Territories', | |
| 'GA' => 'Gabon', | |
| 'GM' => 'Gambia', | |
| 'GE' => 'Georgia', | |
| 'DE' => 'Germany', | |
| 'GH' => 'Ghana', | |
| 'GI' => 'Gibraltar', | |
| 'GR' => 'Greece', | |
| 'GL' => 'Greenland', | |
| 'GD' => 'Grenada', | |
| 'GP' => 'Guadeloupe', | |
| 'GU' => 'Guam', | |
| 'GT' => 'Guatemala', | |
| 'GG' => 'Guernsey', | |
| 'GN' => 'Guinea', | |
| 'GW' => 'Guinea-Bissau', | |
| 'GY' => 'Guyana', | |
| 'HT' => 'Haiti', | |
| 'HM' => 'Heard Island and McDonald Islands', | |
| 'VA' => 'Holy See (Vatican City State)', | |
| 'HN' => 'Honduras', | |
| 'HK' => 'Hong Kong', | |
| 'HU' => 'Hungary', | |
| 'IS' => 'Iceland', | |
| 'IN' => 'India', | |
| 'ID' => 'Indonesia', | |
| 'IR' => 'Iran, Islamic Republic of', | |
| 'IQ' => 'Iraq', | |
| 'IE' => 'Ireland', | |
| 'IM' => 'Isle of Man', | |
| 'IL' => 'Israel', | |
| 'IT' => 'Italy', | |
| 'JM' => 'Jamaica', | |
| 'JP' => 'Japan', | |
| 'JE' => 'Jersey', | |
| 'JO' => 'Jordan', | |
| 'KZ' => 'Kazakhstan', | |
| 'KE' => 'Kenya', | |
| 'KI' => 'Kiribati', | |
| 'KP' => 'Korea, Democratic People\'s Republic of', | |
| 'KR' => 'Korea, Republic of', | |
| 'KW' => 'Kuwait', | |
| 'KG' => 'Kyrgyzstan', | |
| 'LA' => 'Lao People\'s Democratic Republic', | |
| 'LV' => 'Latvia', | |
| 'LB' => 'Lebanon', | |
| 'LS' => 'Lesotho', | |
| 'LR' => 'Liberia', | |
| 'LY' => 'Libya', | |
| 'LI' => 'Liechtenstein', | |
| 'LT' => 'Lithuania', | |
| 'LU' => 'Luxembourg', | |
| 'MO' => 'Macao', | |
| 'MG' => 'Madagascar', | |
| 'MW' => 'Malawi', | |
| 'MY' => 'Malaysia', | |
| 'MV' => 'Maldives', | |
| 'ML' => 'Mali', | |
| 'MT' => 'Malta', | |
| 'MH' => 'Marshall Islands', | |
| 'MQ' => 'Martinique', | |
| 'MR' => 'Mauritania', | |
| 'MU' => 'Mauritius', | |
| 'YT' => 'Mayotte', | |
| 'MX' => 'Mexico', | |
| 'FM' => 'Micronesia, Federated States of', | |
| 'MD' => 'Moldova, Republic of', | |
| 'MC' => 'Monaco', | |
| 'MN' => 'Mongolia', | |
| 'ME' => 'Montenegro', | |
| 'MS' => 'Montserrat', | |
| 'MA' => 'Morocco', | |
| 'MZ' => 'Mozambique', | |
| 'MM' => 'Myanmar', | |
| 'NA' => 'Namibia', | |
| 'NR' => 'Nauru', | |
| 'NP' => 'Nepal', | |
| 'NL' => 'Netherlands', | |
| 'NC' => 'New Caledonia', | |
| 'NZ' => 'New Zealand', | |
| 'NI' => 'Nicaragua', | |
| 'NE' => 'Niger', | |
| 'NG' => 'Nigeria', | |
| 'NU' => 'Niue', | |
| 'NF' => 'Norfolk Island', | |
| 'MK' => 'North Macedonia', | |
| 'MP' => 'Northern Mariana Islands', | |
| 'NO' => 'Norway', | |
| 'OM' => 'Oman', | |
| 'PK' => 'Pakistan', | |
| 'PW' => 'Palau', | |
| 'PS' => 'Palestine, State of', | |
| 'PA' => 'Panama', | |
| 'PG' => 'Papua New Guinea', | |
| 'PY' => 'Paraguay', | |
| 'PE' => 'Peru', | |
| 'PH' => 'Philippines', | |
| 'PN' => 'Pitcairn', | |
| 'PL' => 'Poland', | |
| 'PT' => 'Portugal', | |
| 'PR' => 'Puerto Rico', | |
| 'QA' => 'Qatar', | |
| 'RE' => 'Réunion', | |
| 'RO' => 'Romania', | |
| 'RU' => 'Russian Federation', | |
| 'RW' => 'Rwanda', | |
| 'BL' => 'Saint Barthélemy', | |
| 'SH' => 'Saint Helena, Ascension and Tristan da Cunha', | |
| 'KN' => 'Saint Kitts and Nevis', | |
| 'LC' => 'Saint Lucia', | |
| 'MF' => 'Saint Martin (French part)', | |
| 'PM' => 'Saint Pierre and Miquelon', | |
| 'VC' => 'Saint Vincent and the Grenadines', | |
| 'WS' => 'Samoa', | |
| 'SM' => 'San Marino', | |
| 'ST' => 'Sao Tome and Principe', | |
| 'SA' => 'Saudi Arabia', | |
| 'SN' => 'Senegal', | |
| 'RS' => 'Serbia', | |
| 'SC' => 'Seychelles', | |
| 'SL' => 'Sierra Leone', | |
| 'SG' => 'Singapore', | |
| 'SX' => 'Sint Maarten (Dutch part)', | |
| 'SK' => 'Slovakia', | |
| 'SI' => 'Slovenia', | |
| 'SB' => 'Solomon Islands', | |
| 'SO' => 'Somalia', | |
| 'ZA' => 'South Africa', | |
| 'GS' => 'South Georgia and the South Sandwich Islands', | |
| 'SS' => 'South Sudan', | |
| 'ES' => 'Spain', | |
| 'LK' => 'Sri Lanka', | |
| 'SD' => 'Sudan', | |
| 'SR' => 'Suriname', | |
| 'SJ' => 'Svalbard and Jan Mayen', | |
| 'SE' => 'Sweden', | |
| 'CH' => 'Switzerland', | |
| 'SY' => 'Syrian Arab Republic', | |
| 'TW' => 'Taiwan, Province of China', | |
| 'TJ' => 'Tajikistan', | |
| 'TZ' => 'Tanzania, United Republic of', | |
| 'TH' => 'Thailand', | |
| 'TL' => 'Timor-Leste', | |
| 'TG' => 'Togo', | |
| 'TK' => 'Tokelau', | |
| 'TO' => 'Tonga', | |
| 'TT' => 'Trinidad and Tobago', | |
| 'TN' => 'Tunisia', | |
| 'TR' => 'Turkey', | |
| 'TM' => 'Turkmenistan', | |
| 'TC' => 'Turks and Caicos Islands', | |
| 'TV' => 'Tuvalu', | |
| 'UG' => 'Uganda', | |
| 'UA' => 'Ukraine', | |
| 'AE' => 'United Arab Emirates', | |
| 'GB' => 'United Kingdom', | |
| 'UM' => 'United States Minor Outlying Islands', | |
| 'US' => 'United States', | |
| 'UY' => 'Uruguay', | |
| 'UZ' => 'Uzbekistan', | |
| 'VU' => 'Vanuatu', | |
| 'VE' => 'Venezuela, Bolivarian Republic of', | |
| 'VN' => 'Viet Nam', | |
| 'VG' => 'Virgin Islands, British', | |
| 'VI' => 'Virgin Islands, U.S.', | |
| 'WF' => 'Wallis and Futuna', | |
| 'EH' => 'Western Sahara', | |
| 'YE' => 'Yemen', | |
| 'ZM' => 'Zambia', | |
| 'ZW' => 'Zimbabwe', | |
| ); | |
| } | |
| /** | |
| * Get an array of states for a given country code, using WooCommerce reference. | |
| * | |
| * @param string $country_code The 2-letter country code (e.g., 'US', 'IN'). | |
| * @return array Array of state codes as keys and state names as values. Empty array if not found. | |
| */ | |
| function iws_get_woocommerce_states( $country_code ) { | |
| $states = array( | |
| 'US' => array( | |
| 'AL' => 'Alabama', | |
| 'AK' => 'Alaska', | |
| 'AZ' => 'Arizona', | |
| 'AR' => 'Arkansas', | |
| 'CA' => 'California', | |
| 'CO' => 'Colorado', | |
| 'CT' => 'Connecticut', | |
| 'DE' => 'Delaware', | |
| 'DC' => 'District Of Columbia', | |
| 'FL' => 'Florida', | |
| 'GA' => 'Georgia', | |
| 'HI' => 'Hawaii', | |
| 'ID' => 'Idaho', | |
| 'IL' => 'Illinois', | |
| 'IN' => 'Indiana', | |
| 'IA' => 'Iowa', | |
| 'KS' => 'Kansas', | |
| 'KY' => 'Kentucky', | |
| 'LA' => 'Louisiana', | |
| 'ME' => 'Maine', | |
| 'MD' => 'Maryland', | |
| 'MA' => 'Massachusetts', | |
| 'MI' => 'Michigan', | |
| 'MN' => 'Minnesota', | |
| 'MS' => 'Mississippi', | |
| 'MO' => 'Missouri', | |
| 'MT' => 'Montana', | |
| 'NE' => 'Nebraska', | |
| 'NV' => 'Nevada', | |
| 'NH' => 'New Hampshire', | |
| 'NJ' => 'New Jersey', | |
| 'NM' => 'New Mexico', | |
| 'NY' => 'New York', | |
| 'NC' => 'North Carolina', | |
| 'ND' => 'North Dakota', | |
| 'OH' => 'Ohio', | |
| 'OK' => 'Oklahoma', | |
| 'OR' => 'Oregon', | |
| 'PA' => 'Pennsylvania', | |
| 'RI' => 'Rhode Island', | |
| 'SC' => 'South Carolina', | |
| 'SD' => 'South Dakota', | |
| 'TN' => 'Tennessee', | |
| 'TX' => 'Texas', | |
| 'UT' => 'Utah', | |
| 'VT' => 'Vermont', | |
| 'VA' => 'Virginia', | |
| 'WA' => 'Washington', | |
| 'WV' => 'West Virginia', | |
| 'WI' => 'Wisconsin', | |
| 'WY' => 'Wyoming', | |
| ), | |
| 'CA' => array( | |
| 'AB' => 'Alberta', | |
| 'BC' => 'British Columbia', | |
| 'MB' => 'Manitoba', | |
| 'NB' => 'New Brunswick', | |
| 'NL' => 'Newfoundland and Labrador', | |
| 'NS' => 'Nova Scotia', | |
| 'NT' => 'Northwest Territories', | |
| 'NU' => 'Nunavut', | |
| 'ON' => 'Ontario', | |
| 'PE' => 'Prince Edward Island', | |
| 'QC' => 'Quebec', | |
| 'SK' => 'Saskatchewan', | |
| 'YT' => 'Yukon', | |
| ), | |
| 'AU' => array( | |
| 'ACT' => 'Australian Capital Territory', | |
| 'NSW' => 'New South Wales', | |
| 'NT' => 'Northern Territory', | |
| 'QLD' => 'Queensland', | |
| 'SA' => 'South Australia', | |
| 'TAS' => 'Tasmania', | |
| 'VIC' => 'Victoria', | |
| 'WA' => 'Western Australia', | |
| ), | |
| 'IN' => array( | |
| 'AP' => 'Andhra Pradesh', | |
| 'AR' => 'Arunachal Pradesh', | |
| 'AS' => 'Assam', | |
| 'BR' => 'Bihar', | |
| 'CT' => 'Chhattisgarh', | |
| 'GA' => 'Goa', | |
| 'GJ' => 'Gujarat', | |
| 'HR' => 'Haryana', | |
| 'HP' => 'Himachal Pradesh', | |
| 'JK' => 'Jammu and Kashmir', | |
| 'JH' => 'Jharkhand', | |
| 'KA' => 'Karnataka', | |
| 'KL' => 'Kerala', | |
| 'MP' => 'Madhya Pradesh', | |
| 'MH' => 'Maharashtra', | |
| 'MN' => 'Manipur', | |
| 'ML' => 'Meghalaya', | |
| 'MZ' => 'Mizoram', | |
| 'NL' => 'Nagaland', | |
| 'OR' => 'Odisha', | |
| 'PB' => 'Punjab', | |
| 'RJ' => 'Rajasthan', | |
| 'SK' => 'Sikkim', | |
| 'TN' => 'Tamil Nadu', | |
| 'TG' => 'Telangana', | |
| 'TR' => 'Tripura', | |
| 'UP' => 'Uttar Pradesh', | |
| 'UT' => 'Uttarakhand', | |
| 'WB' => 'West Bengal', | |
| 'AN' => 'Andaman and Nicobar Islands', | |
| 'CH' => 'Chandigarh', | |
| 'DN' => 'Dadra and Nagar Haveli and Daman and Diu', | |
| 'DL' => 'Delhi', | |
| 'LD' => 'Lakshadweep', | |
| 'PY' => 'Puducherry', | |
| ), | |
| // Add more countries and their states/provinces as needed, following WooCommerce reference. | |
| ); | |
| $country_code = strtoupper( $country_code ); | |
| return isset( $states[ $country_code ] ) ? $states[ $country_code ] : array(); | |
| } | |
| ?> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| jQuery(document).ready(function() { | |
| jQuery("#reg-country").on('change', function(){ | |
| let selectedCountry = jQuery(this).val(); | |
| jQuery.ajax({ | |
| type : "GET", | |
| dataType : "json", | |
| url : "/wp-admin/admin-ajax.php", | |
| data : {action: "get_states_from_country", country: selectedCountry}, | |
| success: function(response) { | |
| let fieldType = response.fieldType; | |
| let responseHTML = ''; | |
| if (fieldType == 'text') { | |
| responseHTML += '<input type="text" name="billing_state" id="reg-state-text" class="ld-form__field ld-form__field-billing_state ld-form__field--type-text" />'; | |
| } else if (fieldType == 'select') { | |
| responseHTML += '<select name="billing_state" id="reg-state-select" class="ld-form__field ld-form__field-billing_state ld-form__field--type-select">'; | |
| Object.entries(response.states).forEach(([statecode, statevalue]) => { | |
| responseHTML += '<option value="'+statecode+'">'+statevalue+'</option>'; | |
| }); | |
| responseHTML += '</select>'; | |
| } | |
| jQuery("#reg-country-wrapper").html(responseHTML); | |
| } | |
| }); | |
| }); | |
| }); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment