Create New Item
×
Item Type
File
Folder
Item Name
×
Search file in folder and subfolders...
File Manager
/
wp-content
/
plugins
/
city-dropdown-for-woocommerce
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php defined('ABSPATH') or die('You can not access this file directly!'); if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) { class CD_4_WC_States_Places { const VERSION = '1.0.0'; private $states; private $places; public function __construct() { add_action('plugins_loaded', array($this, 'init')); } public function init() { $this->init_states(); $this->init_places(); } public function init_states() { add_filter('woocommerce_states', array($this, 'wc_states')); } public function init_places() { add_filter('woocommerce_billing_fields', array($this, 'wc_billing_fields'), 10, 2); add_filter('woocommerce_shipping_fields', array($this, 'wc_shipping_fields'), 10, 2); add_filter('woocommerce_form_field_city', array($this, 'wc_form_field_city'), 10, 4); add_action('wp_enqueue_scripts', array($this, 'load_scripts')); } public function wc_states($states) { $allowed = $this->get_store_allowed_countries(); if (!empty($allowed)) { foreach ($allowed as $code => $country) { if (!isset($states[$code]) && file_exists($this->get_plugin_path() . '/states/' . $code . '.php')) { include $this->get_plugin_path() . '/states/' . $code . '.php'; } } } return $states; } public function wc_billing_fields($fields, $country) { $fields['billing_city']['type'] = 'city'; return $fields; } public function wc_shipping_fields($fields, $country) { $fields['shipping_city']['type'] = 'city'; return $fields; } public function wc_form_field_city($field, $key, $args, $value) { if (!empty($args['clear'])) { $after = '<div class="clear"></div>'; } else { $after = ''; } if ($args['required']) { $args['class'][] = 'validate-required'; $required = ' <abbr class="required" title="' . esc_attr__('required', 'woocommerce') . '">*</abbr>'; } else { $required = ''; } $custom_attributes = array(); if (!empty($args['custom_attributes']) && is_array($args['custom_attributes'])) { foreach ($args['custom_attributes'] as $attribute => $attribute_value) { $custom_attributes[] = esc_attr($attribute) . '="' . esc_attr($attribute_value) . '"'; } } if (!empty($args['validate'])) { foreach ($args['validate'] as $validate) { $args['class'][] = 'validate-' . $validate; } } $field = '<p class="form-row ' . esc_attr(implode(' ', $args['class'])) . '" id="' . esc_attr($args['id']) . '_field">'; if ($args['label']) { $field .= '<label for="' . esc_attr($args['id']) . '" class="' . esc_attr(implode(' ', $args['label_class'])) . '">' . $args['label'] . $required . '</label>'; } $country_key = $key == 'billing_city' ? 'billing_country' : 'shipping_country'; $current_cc = WC()->checkout->get_value($country_key); $state_key = $key == 'billing_city' ? 'billing_state' : 'shipping_state'; $current_sc = WC()->checkout->get_value($state_key); $places = $this->get_places($current_cc); if (is_array($places)) { $field .= '<select name="' . esc_attr($key) . '" id="' . esc_attr($args['id']) . '" class="city_select ' . esc_attr(implode(' ', $args['input_class'])) . '" ' . implode(' ', $custom_attributes) . ' placeholder="' . esc_attr($args['placeholder']) . '">'; $field .= '<option value="">' . __('Select an option…', 'woocommerce') . '</option>'; if ($current_sc && array_key_exists($current_sc, $places)) { $dropdown_places = $places[$current_sc]; } else { if (is_array($places) && isset($places[0])) { $dropdown_places = array_reduce($places, 'array_merge', array()); sort($dropdown_places); } else { $dropdown_places = $places; } } foreach ($dropdown_places as $city_name) { if (!is_array($city_name)) { $field .= '<option value="' . esc_attr($city_name) . '" ' . selected($value, $city_name, false) . '>' . $city_name . '</option>'; } } $field .= '</select>'; } else { $field .= '<input type="text" class="input-text ' . esc_attr(implode(' ', $args['input_class'])) . '" value="' . esc_attr($value) . '" placeholder="' . esc_attr($args['placeholder']) . '" name="' . esc_attr($key) . '" id="' . esc_attr($args['id']) . '" ' . implode(' ', $custom_attributes) . ' />'; } if ($args['description']) { $field .= '<span class="description">' . esc_attr($args['description']) . '</span>'; } $field .= '</p>' . $after; return $field; } public function get_places($p_code = null) { if (empty($this->places)) { $this->load_country_places(); } if (!is_null($p_code)) { return isset($this->places[$p_code]) ? $this->places[$p_code] : false; } else { return $this->places; } } public function load_country_places() { global $places; $allowed = $this->get_store_allowed_countries(); if ($allowed) { foreach ($allowed as $code => $country) { if (!isset($places[$code]) && file_exists($this->get_plugin_path() . '/places/' . $code . '.php')) { include $this->get_plugin_path() . '/places/' . $code . '.php'; } } } $this->places = $places; } public function load_scripts() { if (is_cart() || is_checkout() || is_wc_endpoint_url('edit-address')) { $city_select_path = $this->get_plugin_url() . '/assets/js/place-select.js'; wp_enqueue_script('wc-city-select', $city_select_path, array('jquery', 'woocommerce'), self::VERSION, true); $places = json_encode($this->get_places()); wp_localize_script('wc-city-select', 'wc_city_select_params', array('cities' => $places, 'i18n_select_city_text' => esc_attr__('Select an option…', 'woocommerce'))); } } private function get_plugin_path() { if (isset($this->plugin_path)) { return $this->plugin_path; } $path = $this->plugin_path = plugin_dir_path(__FILE__); return untrailingslashit($path); } private function get_store_allowed_countries() { return array_merge(WC()->countries->get_allowed_countries(), WC()->countries->get_shipping_countries()); } public function get_plugin_url() { if (isset($this->plugin_url)) { return $this->plugin_url; } return $this->plugin_url = plugin_dir_url(__FILE__); } } $GLOBALS['wc_states_places'] = new CD_4_WC_States_Places(); } add_filter('woocommerce_default_address_fields', 'cd_4_wc_reorder'); function cd_4_wc_reorder($fields) { $fields['state']['priority'] = 48; $fields['city']['priority'] = 49; return $fields; }