File Manager
<?php
/**
* Handle the plugin settings.
*
* @author Tijmen Smit
* @since 2.0.0
*/
if ( !defined( 'ABSPATH' ) ) exit;
if ( !class_exists( 'WPSL_Settings' ) ) {
class WPSL_Settings {
public function __construct() {
$this->manually_clear_transient();
add_action( 'wp_ajax_validate_server_key', array( $this, 'ajax_validate_server_key' ) );
add_action( 'wp_ajax_nopriv_validate_server_key', array( $this, 'ajax_validate_server_key' ) );
add_action( 'admin_init', array( $this, 'register_settings' ) );
add_action( 'admin_init', array( $this, 'maybe_flush_rewrite_and_transient' ) );
}
/**
* Determine if we need to clear the autoload transient.
*
* User can do this manually from the 'Tools' section on the settings page.
*
* @since 2.0.0
* @return void
*/
public function manually_clear_transient() {
global $wpsl_admin;
if ( isset( $_GET['action'] ) && $_GET['action'] == 'clear_wpsl_transients' && isset( $_REQUEST['_wpnonce'] ) && wp_verify_nonce( $_REQUEST['_wpnonce'], 'clear_transients' ) ) {
$wpsl_admin->delete_autoload_transient();
$msg = __( 'WP Store Locator Transients Cleared', 'wpsl' );
$wpsl_admin->notices->save( 'update', $msg );
/*
* Make sure the &action=clear_wpsl_transients param is removed from the url.
*
* Otherwise if the user later clicks the 'Save Changes' button,
* and the &action=clear_wpsl_transients param is still there it
* will show two notices 'WP Store Locator Transients Cleared' and 'Settings Saved'.
*/
wp_redirect( admin_url( 'edit.php?post_type=wpsl_stores&page=wpsl_settings' ) );
exit;
}
}
/**
* Register the settings.
*
* @since 2.0.0
* @return void
*/
public function register_settings() {
register_setting( 'wpsl_settings', 'wpsl_settings', array( $this, 'sanitize_settings' ) );
}
/**
* Sanitize the submitted plugin settings.
*
* @since 1.0.0
* @return array $output The setting values
*/
public function sanitize_settings() {
global $wpsl_settings, $wpsl_admin;
$ux_absints = array(
'height',
'infowindow_width',
'search_width',
'label_width'
);
$marker_effects = array(
'bounce',
'info_window',
'ignore'
);
$ux_checkboxes = array(
'new_window',
'reset_map',
'listing_below_no_scroll',
'direction_redirect',
'more_info',
'store_url',
'phone_url',
'marker_streetview',
'marker_zoom_to',
'mouse_focus',
'reset_map',
'show_contact_details',
'clickable_contact_details',
'hide_country',
'hide_distance'
);
/*
* If the provided server key is different then the existing value,
* then we test if it's valid by making a call to the Geocode API.
*/
if ( $_POST['wpsl_api']['server_key'] && $wpsl_settings['api_server_key'] != $_POST['wpsl_api']['server_key'] || !get_option( 'wpsl_valid_server_key' ) ) {
$server_key = sanitize_text_field( $_POST['wpsl_api']['server_key'] );
$this->validate_server_key( $server_key );
}
$output['api_server_key'] = sanitize_text_field( $_POST['wpsl_api']['server_key'] );
$output['api_browser_key'] = sanitize_text_field( $_POST['wpsl_api']['browser_key'] );
$output['api_language'] = wp_filter_nohtml_kses( $_POST['wpsl_api']['language'] );
$output['api_region'] = wp_filter_nohtml_kses( $_POST['wpsl_api']['region'] );
$output['api_geocode_component'] = isset( $_POST['wpsl_api']['geocode_component'] ) ? 1 : 0;
// Check the search filter.
$output['autocomplete'] = isset( $_POST['wpsl_search']['autocomplete'] ) ? 1 : 0;
$output['results_dropdown'] = isset( $_POST['wpsl_search']['results_dropdown'] ) ? 1 : 0;
$output['radius_dropdown'] = isset( $_POST['wpsl_search']['radius_dropdown'] ) ? 1 : 0;
$output['category_filter'] = isset( $_POST['wpsl_search']['category_filter'] ) ? 1 : 0;
$output['category_filter_type'] = ( $_POST['wpsl_search']['category_filter_type'] == 'dropdown' ) ? 'dropdown' : 'checkboxes';
$output['distance_unit'] = ( $_POST['wpsl_search']['distance_unit'] == 'km' ) ? 'km' : 'mi';
// Check for a valid max results value, otherwise we use the default.
if ( !empty( $_POST['wpsl_search']['max_results'] ) ) {
$output['max_results'] = sanitize_text_field( $_POST['wpsl_search']['max_results'] );
} else {
$this->settings_error( 'max_results' );
$output['max_results'] = wpsl_get_default_setting( 'max_results' );
}
// See if a search radius value exist, otherwise we use the default.
if ( !empty( $_POST['wpsl_search']['radius'] ) ) {
$output['search_radius'] = sanitize_text_field( $_POST['wpsl_search']['radius'] );
} else {
$this->settings_error( 'search_radius' );
$output['search_radius'] = wpsl_get_default_setting( 'search_radius' );
}
$output['force_postalcode'] = isset( $_POST['wpsl_search']['force_postalcode'] ) ? 1 : 0;
// Check if we have a valid zoom level, it has to be between 1 or 12. If not set it to the default of 3.
$output['zoom_level'] = wpsl_valid_zoom_level( $_POST['wpsl_map']['zoom_level'] );
// Check for a valid max auto zoom level.
$max_zoom_levels = wpsl_get_max_zoom_levels();
if ( in_array( absint( $_POST['wpsl_map']['max_auto_zoom'] ), $max_zoom_levels ) ) {
$output['auto_zoom_level'] = $_POST['wpsl_map']['max_auto_zoom'];
} else {
$output['auto_zoom_level'] = wpsl_get_default_setting( 'auto_zoom_level' );
}
if ( isset( $_POST['wpsl_map']['start_name'] ) ) {
$output['start_name'] = sanitize_text_field( $_POST['wpsl_map']['start_name'] );
} else {
$output['start_name'] = '';
}
// If no location name is then we also empty the latlng values from the hidden input field.
if ( empty( $output['start_name'] ) ) {
$this->settings_error( 'start_point' );
$output['start_latlng'] = '';
} else {
/*
* If the start latlng is empty, but a start location name is provided,
* then make a request to the Geocode API to get it.
*
* This can only happen if there is a JS error in the admin area that breaks the
* Google Maps Autocomplete. So this code is only used as fallback to make sure
* the provided start location is always geocoded.
*/
if ( $wpsl_settings['start_name'] != $_POST['wpsl_map']['start_name']
&& $wpsl_settings['start_latlng'] == $_POST['wpsl_map']['start_latlng']
|| empty( $_POST['wpsl_map']['start_latlng'] ) ) {
$start_latlng = wpsl_get_address_latlng( $_POST['wpsl_map']['start_name'] );
} else {
$start_latlng = sanitize_text_field( $_POST['wpsl_map']['start_latlng'] );
}
$output['start_latlng'] = $start_latlng;
}
// Do we need to run the fitBounds function make the markers fit in the viewport?
$output['run_fitbounds'] = isset( $_POST['wpsl_map']['run_fitbounds'] ) ? 1 : 0;
// Check if we have a valid map type.
$output['map_type'] = wpsl_valid_map_type( $_POST['wpsl_map']['type'] );
$output['auto_locate'] = isset( $_POST['wpsl_map']['auto_locate'] ) ? 1 : 0;
$output['autoload'] = isset( $_POST['wpsl_map']['autoload'] ) ? 1 : 0;
// Make sure the auto load limit is either empty or an int.
if ( empty( $_POST['wpsl_map']['autoload_limit'] ) ) {
$output['autoload_limit'] = '';
} else {
$output['autoload_limit'] = absint( $_POST['wpsl_map']['autoload_limit'] );
}
$output['streetview'] = isset( $_POST['wpsl_map']['streetview'] ) ? 1 : 0;
$output['type_control'] = isset( $_POST['wpsl_map']['type_control'] ) ? 1 : 0;
$output['scrollwheel'] = isset( $_POST['wpsl_map']['scrollwheel'] ) ? 1 : 0;
$output['control_position'] = ( $_POST['wpsl_map']['control_position'] == 'left' ) ? 'left' : 'right';
$output['map_style'] = json_encode( strip_tags( trim( $_POST['wpsl_map']['map_style'] ) ) );
// Make sure we have a valid template ID.
if ( isset( $_POST['wpsl_ux']['template_id'] ) && ( $_POST['wpsl_ux']['template_id'] ) ) {
$output['template_id'] = sanitize_text_field( $_POST['wpsl_ux']['template_id'] );
} else {
$output['template_id'] = wpsl_get_default_setting( 'template_id' );
}
$output['marker_clusters'] = isset( $_POST['wpsl_map']['marker_clusters'] ) ? 1 : 0;
// Check for a valid cluster zoom value.
if ( in_array( $_POST['wpsl_map']['cluster_zoom'], $this->get_default_cluster_option( 'cluster_zoom' ) ) ) {
$output['cluster_zoom'] = $_POST['wpsl_map']['cluster_zoom'];
} else {
$output['cluster_zoom'] = wpsl_get_default_setting( 'cluster_zoom' );
}
// Check for a valid cluster size value.
if ( in_array( $_POST['wpsl_map']['cluster_size'], $this->get_default_cluster_option( 'cluster_size' ) ) ) {
$output['cluster_size'] = $_POST['wpsl_map']['cluster_size'];
} else {
$output['cluster_size'] = wpsl_get_default_setting( 'cluster_size' );
}
/*
* Make sure all the ux related fields that should contain an int, actually are an int.
* Otherwise we use the default value.
*/
foreach ( $ux_absints as $ux_key ) {
if ( absint( $_POST['wpsl_ux'][$ux_key] ) ) {
$output[$ux_key] = $_POST['wpsl_ux'][$ux_key];
} else {
$output[$ux_key] = wpsl_get_default_setting( $ux_key );
}
}
// Check if the ux checkboxes are checked.
foreach ( $ux_checkboxes as $ux_key ) {
$output[$ux_key] = isset( $_POST['wpsl_ux'][$ux_key] ) ? 1 : 0;
}
// Check if we have a valid marker effect.
if ( in_array( $_POST['wpsl_ux']['marker_effect'], $marker_effects ) ) {
$output['marker_effect'] = $_POST['wpsl_ux']['marker_effect'];
} else {
$output['marker_effect'] = wpsl_get_default_setting( 'marker_effect' );
}
// Check if we have a valid address format.
if ( array_key_exists( $_POST['wpsl_ux']['address_format'], wpsl_get_address_formats() ) ) {
$output['address_format'] = $_POST['wpsl_ux']['address_format'];
} else {
$output['address_format'] = wpsl_get_default_setting( 'address_format' );
}
$output['more_info_location'] = ( $_POST['wpsl_ux']['more_info_location'] == 'store listings' ) ? 'store listings' : 'info window';
$output['infowindow_style'] = isset( $_POST['wpsl_ux']['infowindow_style'] ) ? 'default' : 'infobox';
$output['start_marker'] = wp_filter_nohtml_kses( $_POST['wpsl_map']['start_marker'] );
$output['store_marker'] = wp_filter_nohtml_kses( $_POST['wpsl_map']['store_marker'] );
$output['editor_country'] = sanitize_text_field( $_POST['wpsl_editor']['default_country'] );
$output['editor_map_type'] = wpsl_valid_map_type( $_POST['wpsl_editor']['map_type'] );
$output['hide_hours'] = isset( $_POST['wpsl_editor']['hide_hours'] ) ? 1 : 0;
if ( isset( $_POST['wpsl_editor']['hour_input'] ) ) {
$output['editor_hour_input'] = ( $_POST['wpsl_editor']['hour_input'] == 'textarea' ) ? 'textarea' : 'dropdown';
} else {
$output['editor_hour_input'] = 'dropdown';
}
$output['editor_hour_format'] = ( $_POST['wpsl_editor']['hour_format'] == 12 ) ? 12 : 24;
// The default opening hours.
if ( isset( $_POST['wpsl_editor']['textarea'] ) ) {
$output['editor_hours']['textarea'] = wp_kses_post( trim( stripslashes( $_POST['wpsl_editor']['textarea'] ) ) );
}
$output['editor_hours']['dropdown'] = $wpsl_admin->metaboxes->format_opening_hours();
array_walk_recursive( $output['editor_hours']['dropdown'], 'wpsl_sanitize_multi_array' );
// Permalink and taxonomy slug.
$output['permalinks'] = isset( $_POST['wpsl_permalinks']['active'] ) ? 1 : 0;
$output['permalink_remove_front'] = isset( $_POST['wpsl_permalinks']['remove_front'] ) ? 1 : 0;
if ( !empty( $_POST['wpsl_permalinks']['slug'] ) ) {
$output['permalink_slug'] = sanitize_text_field( $_POST['wpsl_permalinks']['slug'] );
} else {
$output['permalink_slug'] = wpsl_get_default_setting( 'permalink_slug' );
}
if ( !empty( $_POST['wpsl_permalinks']['category_slug'] ) ) {
$output['category_slug'] = sanitize_text_field( $_POST['wpsl_permalinks']['category_slug'] );
} else {
$output['category_slug'] = wpsl_get_default_setting( 'category_slug' );
}
$required_labels = wpsl_labels();
// Sanitize the labels.
foreach ( $required_labels as $label ) {
$output[$label.'_label'] = sanitize_text_field( $_POST['wpsl_label'][$label] );
}
$output['show_credits'] = isset( $_POST['wpsl_credits'] ) ? 1 : 0;
$output['debug'] = isset( $_POST['wpsl_tools']['debug'] ) ? 1 : 0;
$output['deregister_gmaps'] = isset( $_POST['wpsl_tools']['deregister_gmaps'] ) ? 1 : 0;
$output['delay_loading'] = isset( $_POST['wpsl_tools']['delay_loading'] ) ? 1 : 0;
// Check if we need to flush the permalinks.
$this->set_flush_rewrite_option( $output );
// Check if there is a reason to delete the autoload transient.
if ( $wpsl_settings['autoload'] ) {
$this->set_delete_transient_option( $output );
}
return $output;
}
/**
* Handle the AJAX call to validate the provided
* server key for the Google Maps API.
*
* @since 2.2.10
* @return void
*/
public function ajax_validate_server_key() {
if ( ( current_user_can( 'manage_wpsl_settings' ) ) && is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX ) {
$server_key = sanitize_text_field( $_GET['server_key'] );
if ( $server_key ) {
$this->validate_server_key( $server_key );
}
}
}
/**
* Check if the provided server key for
* the Google Maps API is valid.
*
* @since 2.2.10
* @param string $server_key The server key to validate
* @return json|void If the validation failed and AJAX is used, then json
*/
public function validate_server_key( $server_key ) {
global $wpsl_admin;
// Test the server key by making a request to the Geocode API.
$address = 'Manhattan, NY 10036, USA';
$url = 'https://maps.googleapis.com/maps/api/geocode/json?address=' . urlencode( $address ) .'&key=' . $server_key;
$response = wp_remote_get( $url );
if ( !is_wp_error( $response ) ) {
$response = json_decode( $response['body'], true );
// If the state is not OK, then there's a problem with the key.
if ( $response['status'] !== 'OK' ) {
$geocode_errors = $wpsl_admin->geocode->check_geocode_error_msg( $response, true );
$error_msg = sprintf( __( 'There\'s a problem with the provided %sserver key%s. %s' ), '<a href="https://wpstorelocator.co/document/create-google-api-keys/#server-key">', '</a>', $geocode_errors );
update_option( 'wpsl_valid_server_key', 0 );
// If the server key input field has 'wpsl-validate-me' class on it, then it's validated with AJAX in the background.
if ( defined('DOING_AJAX' ) && DOING_AJAX ) {
$key_status = array(
'valid' => 0,
'msg' => $error_msg
);
wp_send_json( $key_status );
exit();
} else {
add_settings_error( 'setting-errors', esc_attr( 'server-key' ), $error_msg, 'error' );
}
} else {
update_option( 'wpsl_valid_server_key', 1 );
if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
$key_status = array(
'valid' => 1,
'msg' => __( 'No problems found with the server key.', 'wpsl' )
);
wp_send_json( $key_status );
exit();
}
}
}
}
/**
* Check if we need set the option that will be used to determine
* if we need to flush the permalinks once the setting page reloads.
*
* @since 2.0.0
* @param array $new_settings The submitted plugin settings
* @return void
*/
public function set_flush_rewrite_option( $new_settings ) {
global $wpsl_settings;
// The settings fields to check.
$fields = array( 'permalinks', 'permalink_slug', 'permalink_remove_front', 'category_slug' );
foreach ( $fields as $k => $field ) {
if ( $wpsl_settings[$field] != $new_settings[$field] ) {
update_option( 'wpsl_flush_rewrite', 1 );
break;
}
}
}
/**
* Check if we need set the option that is used to determine
* if we need to delete the autoload transient once the settings page reloads.
*
* @since 2.0.0
* @param array $new_settings The submitted plugin settings
* @return void
*/
public function set_delete_transient_option( $new_settings ) {
global $wpsl_settings;
// The options we need to check for changes.
$options = array(
'start_name',
'debug',
'autoload',
'autoload_limit',
'more_info',
'more_info_location',
'hide_hours',
'hide_distance',
'hide_country',
'show_contact_details'
);
foreach ( $options as $option_name ) {
if ( $wpsl_settings[$option_name] != $new_settings[$option_name] ) {
update_option( 'wpsl_delete_transient', 1 );
break;
}
}
}
/**
* Check if the permalinks settings changed.
*
* @since 2.0.0
* @return void
*/
public function maybe_flush_rewrite_and_transient() {
global $wpsl_admin;
if ( isset( $_GET['page'] ) && ( $_GET['page'] == 'wpsl_settings' ) ) {
$flush_rewrite = get_option( 'wpsl_flush_rewrite' );
$delete_transient = get_option( 'wpsl_delete_transient' );
if ( $flush_rewrite ) {
flush_rewrite_rules();
update_option( 'wpsl_flush_rewrite', 0 );
}
if ( $delete_transient ) {
update_option( 'wpsl_delete_transient', 0 );
}
if ( $flush_rewrite || $delete_transient ) {
$wpsl_admin->delete_autoload_transient();
}
}
}
/**
* Handle the different validation errors for the plugin settings.
*
* @since 1.0.0
* @param string $error_type Contains the type of validation error that occured
* @return void
*/
private function settings_error( $error_type ) {
switch ( $error_type ) {
case 'max_results':
$error_msg = __( 'The max results field cannot be empty, the default value has been restored.', 'wpsl' );
break;
case 'search_radius':
$error_msg = __( 'The search radius field cannot be empty, the default value has been restored.', 'wpsl' );
break;
case 'start_point':
$error_msg = sprintf( __( 'Please provide the name of a city or country that can be used as a starting point under "Map Settings". %s This will only be used if auto-locating the user fails, or the option itself is disabled.', 'wpsl' ), '<br><br>' );
break;
}
add_settings_error( 'setting-errors', esc_attr( 'settings_fail' ), $error_msg, 'error' );
}
/**
* Options for the language and region list.
*
* @since 1.0.0
* @param string $list The request list type
* @return string|void $option_list The html for the selected list, or nothing if the $list contains invalud values
*/
public function get_api_option_list( $list ) {
global $wpsl_settings;
switch ( $list ) {
case 'language':
$api_option_list = array (
__('Select your language', 'wpsl') => '',
__('English', 'wpsl') => 'en',
__('Arabic', 'wpsl') => 'ar',
__('Basque', 'wpsl') => 'eu',
__('Bulgarian', 'wpsl') => 'bg',
__('Bengali', 'wpsl') => 'bn',
__('Catalan', 'wpsl') => 'ca',
__('Czech', 'wpsl') => 'cs',
__('Danish', 'wpsl') => 'da',
__('German', 'wpsl') => 'de',
__('Greek', 'wpsl') => 'el',
__('English (Australian)', 'wpsl') => 'en-AU',
__('English (Great Britain)', 'wpsl') => 'en-GB',
__('Spanish', 'wpsl') => 'es',
__('Farsi', 'wpsl') => 'fa',
__('Finnish', 'wpsl') => 'fi',
__('Filipino', 'wpsl') => 'fil',
__('French', 'wpsl') => 'fr',
__('Galician', 'wpsl') => 'gl',
__('Gujarati', 'wpsl') => 'gu',
__('Hindi', 'wpsl') => 'hi',
__('Croatian', 'wpsl') => 'hr',
__('Hungarian', 'wpsl') => 'hu',
__('Indonesian', 'wpsl') => 'id',
__('Italian', 'wpsl') => 'it',
__('Hebrew', 'wpsl') => 'iw',
__('Japanese', 'wpsl') => 'ja',
__('Kannada', 'wpsl') => 'kn',
__('Korean', 'wpsl') => 'ko',
__('Lithuanian', 'wpsl') => 'lt',
__('Latvian', 'wpsl') => 'lv',
__('Malayalam', 'wpsl') => 'ml',
__('Marathi', 'wpsl') => 'mr',
__('Dutch', 'wpsl') => 'nl',
__('Norwegian', 'wpsl') => 'no',
__('Norwegian Nynorsk', 'wpsl') => 'nn',
__('Polish', 'wpsl') => 'pl',
__('Portuguese', 'wpsl') => 'pt',
__('Portuguese (Brazil)', 'wpsl') => 'pt-BR',
__('Portuguese (Portugal)', 'wpsl') => 'pt-PT',
__('Romanian', 'wpsl') => 'ro',
__('Russian', 'wpsl') => 'ru',
__('Slovak', 'wpsl') => 'sk',
__('Slovenian', 'wpsl') => 'sl',
__('Serbian', 'wpsl') => 'sr',
__('Swedish', 'wpsl') => 'sv',
__('Tagalog', 'wpsl') => 'tl',
__('Tamil', 'wpsl') => 'ta',
__('Telugu', 'wpsl') => 'te',
__('Thai', 'wpsl') => 'th',
__('Turkish', 'wpsl') => 'tr',
__('Ukrainian', 'wpsl') => 'uk',
__('Vietnamese', 'wpsl') => 'vi',
__('Chinese (Simplified)', 'wpsl') => 'zh-CN',
__('Chinese (Traditional)' ,'wpsl') => 'zh-TW'
);
break;
case 'region':
$api_option_list = array (
__('Select your region', 'wpsl') => '',
__('Afghanistan', 'wpsl') => 'af',
__('Albania', 'wpsl') => 'al',
__('Algeria', 'wpsl') => 'dz',
__('American Samoa', 'wpsl') => 'as',
__('Andorra', 'wpsl') => 'ad',
__('Angola', 'wpsl') => 'ao',
__('Anguilla', 'wpsl') => 'ai',
__('Antarctica', 'wpsl') => 'aq',
__('Antigua and Barbuda', 'wpsl') => 'ag',
__('Argentina', 'wpsl') => 'ar',
__('Armenia', 'wpsl') => 'am',
__('Aruba', 'wpsl') => 'aw',
__('Ascension Island', 'wpsl') => 'ac',
__('Australia', 'wpsl') => 'au',
__('Austria', 'wpsl') => 'at',
__('Azerbaijan', 'wpsl') => 'az',
__('Bahamas', 'wpsl') => 'bs',
__('Bahrain', 'wpsl') => 'bh',
__('Bangladesh', 'wpsl') => 'bd',
__('Barbados', 'wpsl') => 'bb',
__('Belarus', 'wpsl') => 'by',
__('Belgium', 'wpsl') => 'be',
__('Belize', 'wpsl') => 'bz',
__('Benin', 'wpsl') => 'bj',
__('Bermuda', 'wpsl') => 'bm',
__('Bhutan', 'wpsl') => 'bt',
__('Bolivia', 'wpsl') => 'bo',
__('Bosnia and Herzegovina', 'wpsl') => 'ba',
__('Botswana', 'wpsl') => 'bw',
__('Bouvet Island', 'wpsl') => 'bv',
__('Brazil', 'wpsl') => 'br',
__('British Indian Ocean Territory', 'wpsl') => 'io',
__('British Virgin Islands', 'wpsl') => 'vg',
__('Brunei', 'wpsl') => 'bn',
__('Bulgaria', 'wpsl') => 'bg',
__('Burkina Faso', 'wpsl') => 'bf',
__('Burundi', 'wpsl') => 'bi',
__('Cambodia', 'wpsl') => 'kh',
__('Cameroon', 'wpsl') => 'cm',
__('Canada', 'wpsl') => 'ca',
__('Canary Islands', 'wpsl') => 'ic',
__('Cape Verde', 'wpsl') => 'cv',
__('Caribbean Netherlands', 'wpsl') => 'bq',
__('Cayman Islands', 'wpsl') => 'ky',
__('Central African Republic', 'wpsl') => 'cf',
__('Ceuta and Melilla', 'wpsl') => 'ea',
__('Chad', 'wpsl') => 'td',
__('Chile', 'wpsl') => 'cl',
__('China', 'wpsl') => 'cn',
__('Christmas Island', 'wpsl') => 'cx',
__('Clipperton Island', 'wpsl') => 'cp',
__('Cocos (Keeling) Islands', 'wpsl') => 'cc',
__('Colombia', 'wpsl') => 'co',
__('Comoros', 'wpsl') => 'km',
__('Congo (DRC)', 'wpsl') => 'cd',
__('Congo (Republic)', 'wpsl') => 'cg',
__('Cook Islands', 'wpsl') => 'ck',
__('Costa Rica', 'wpsl') => 'cr',
__('Croatia', 'wpsl') => 'hr',
__('Cuba', 'wpsl') => 'cu',
__('Curaçao', 'wpsl') => 'cw',
__('Cyprus', 'wpsl') => 'cy',
__('Czech Republic', 'wpsl') => 'cz',
__('Côte d\'Ivoire', 'wpsl') => 'ci',
__('Denmark', 'wpsl') => 'dk',
__('Djibouti', 'wpsl') => 'dj',
__('Democratic Republic of the Congo', 'wpsl') => 'cd',
__('Dominica', 'wpsl') => 'dm',
__('Dominican Republic', 'wpsl') => 'do',
__('Ecuador', 'wpsl') => 'ec',
__('Egypt', 'wpsl') => 'eg',
__('El Salvador', 'wpsl') => 'sv',
__('Equatorial Guinea', 'wpsl') => 'gq',
__('Eritrea', 'wpsl') => 'er',
__('Estonia', 'wpsl') => 'ee',
__('Ethiopia', 'wpsl') => 'et',
__('Falkland Islands(Islas Malvinas)', 'wpsl') => 'fk',
__('Faroe Islands', 'wpsl') => 'fo',
__('Fiji', 'wpsl') => 'fj',
__('Finland', 'wpsl') => 'fi',
__('France', 'wpsl') => 'fr',
__('French Guiana', 'wpsl') => 'gf',
__('French Polynesia', 'wpsl') => 'pf',
__('French Southern Territories', 'wpsl') => 'tf',
__('Gabon', 'wpsl') => 'ga',
__('Gambia', 'wpsl') => 'gm',
__('Georgia', 'wpsl') => 'ge',
__('Germany', 'wpsl') => 'de',
__('Ghana', 'wpsl') => 'gh',
__('Gibraltar', 'wpsl') => 'gi',
__('Greece', 'wpsl') => 'gr',
__('Greenland', 'wpsl') => 'gl',
__('Grenada', 'wpsl') => 'gd',
__('Guam', 'wpsl') => 'gu',
__('Guadeloupe', 'wpsl') => 'gp',
__('Guam', 'wpsl') => 'gu',
__('Guatemala', 'wpsl') => 'gt',
__('Guernsey', 'wpsl') => 'gg',
__('Guinea', 'wpsl') => 'gn',
__('Guinea-Bissau', 'wpsl') => 'gw',
__('Guyana', 'wpsl') => 'gy',
__('Haiti', 'wpsl') => 'ht',
__('Heard and McDonald Islands', 'wpsl') => 'hm',
__('Honduras', 'wpsl') => 'hn',
__('Hong Kong', 'wpsl') => 'hk',
__('Hungary', 'wpsl') => 'hu',
__('Iceland', 'wpsl') => 'is',
__('India', 'wpsl') => 'in',
__('Indonesia', 'wpsl') => 'id',
__('Iran', 'wpsl') => 'ir',
__('Iraq', 'wpsl') => 'iq',
__('Ireland', 'wpsl') => 'ie',
__('Isle of Man', 'wpsl') => 'im',
__('Israel', 'wpsl') => 'il',
__('Italy', 'wpsl') => 'it',
__('Jamaica', 'wpsl') => 'jm',
__('Japan', 'wpsl') => 'jp',
__('Jersey', 'wpsl') => 'je',
__('Jordan', 'wpsl') => 'jo',
__('Kazakhstan', 'wpsl') => 'kz',
__('Kenya', 'wpsl') => 'ke',
__('Kiribati', 'wpsl') => 'ki',
__('Kosovo', 'wpsl') => 'xk',
__('Kuwait', 'wpsl') => 'kw',
__('Kyrgyzstan', 'wpsl') => 'kg',
__('Laos', 'wpsl') => 'la',
__('Latvia', 'wpsl') => 'lv',
__('Lebanon', 'wpsl') => 'lb',
__('Lesotho', 'wpsl') => 'ls',
__('Liberia', 'wpsl') => 'lr',
__('Libya', 'wpsl') => 'ly',
__('Liechtenstein', 'wpsl') => 'li',
__('Lithuania', 'wpsl') => 'lt',
__('Luxembourg', 'wpsl') => 'lu',
__('Macau', 'wpsl') => 'mo',
__('Macedonia (FYROM)', 'wpsl') => 'mk',
__('Madagascar', 'wpsl') => 'mg',
__('Malawi', 'wpsl') => 'mw',
__('Malaysia ', 'wpsl') => 'my',
__('Maldives ', 'wpsl') => 'mv',
__('Mali', 'wpsl') => 'ml',
__('Malta', 'wpsl') => 'mt',
__('Marshall Islands', 'wpsl') => 'mh',
__('Martinique', 'wpsl') => 'mq',
__('Mauritania', 'wpsl') => 'mr',
__('Mauritius', 'wpsl') => 'mu',
__('Mayotte', 'wpsl') => 'yt',
__('Mexico', 'wpsl') => 'mx',
__('Micronesia', 'wpsl') => 'fm',
__('Moldova', 'wpsl') => 'md',
__('Monaco' ,'wpsl') => 'mc',
__('Mongolia', 'wpsl') => 'mn',
__('Montenegro', 'wpsl') => 'me',
__('Montserrat', 'wpsl') => 'ms',
__('Morocco', 'wpsl') => 'ma',
__('Mozambique', 'wpsl') => 'mz',
__('Myanmar (Burma)', 'wpsl') => 'mm',
__('Namibia', 'wpsl') => 'na',
__('Nauru', 'wpsl') => 'nr',
__('Nepal', 'wpsl') => 'np',
__('Netherlands', 'wpsl') => 'nl',
__('Netherlands Antilles', 'wpsl') => 'an',
__('New Caledonia', 'wpsl') => 'nc',
__('New Zealand', 'wpsl') => 'nz',
__('Nicaragua', 'wpsl') => 'ni',
__('Niger', 'wpsl') => 'ne',
__('Nigeria', 'wpsl') => 'ng',
__('Niue', 'wpsl') => 'nu',
__('Norfolk Island', 'wpsl') => 'nf',
__('North Korea', 'wpsl') => 'kp',
__('Northern Mariana Islands', 'wpsl') => 'mp',
__('Norway', 'wpsl') => 'no',
__('Oman', 'wpsl') => 'om',
__('Pakistan', 'wpsl') => 'pk',
__('Palau', 'wpsl') => 'pw',
__('Palestine', 'wpsl') => 'ps',
__('Panama' ,'wpsl') => 'pa',
__('Papua New Guinea', 'wpsl') => 'pg',
__('Paraguay' ,'wpsl') => 'py',
__('Peru', 'wpsl') => 'pe',
__('Philippines', 'wpsl') => 'ph',
__('Pitcairn Islands', 'wpsl') => 'pn',
__('Poland', 'wpsl') => 'pl',
__('Portugal', 'wpsl') => 'pt',
__('Puerto Rico', 'wpsl') => 'pr',
__('Qatar', 'wpsl') => 'qa',
__('Reunion', 'wpsl') => 're',
__('Romania', 'wpsl') => 'ro',
__('Russia', 'wpsl') => 'ru',
__('Rwanda', 'wpsl') => 'rw',
__('Saint Helena', 'wpsl') => 'sh',
__('Saint Kitts and Nevis', 'wpsl') => 'kn',
__('Saint Vincent and the Grenadines', 'wpsl') => 'vc',
__('Saint Lucia', 'wpsl') => 'lc',
__('Samoa', 'wpsl') => 'ws',
__('San Marino', 'wpsl') => 'sm',
__('São Tomé and Príncipe', 'wpsl') => 'st',
__('Saudi Arabia', 'wpsl') => 'sa',
__('Senegal', 'wpsl') => 'sn',
__('Serbia', 'wpsl') => 'rs',
__('Seychelles', 'wpsl') => 'sc',
__('Sierra Leone', 'wpsl') => 'sl',
__('Singapore', 'wpsl') => 'sg',
__('Sint Maarten', 'wpsl') => 'sx',
__('Slovakia', 'wpsl') => 'sk',
__('Slovenia', 'wpsl') => 'si',
__('Solomon Islands', 'wpsl') => 'sb',
__('Somalia', 'wpsl') => 'so',
__('South Africa', 'wpsl') => 'za',
__('South Georgia and South Sandwich Islands', 'wpsl') => 'gs',
__('South Korea', 'wpsl') => 'kr',
__('South Sudan', 'wpsl') => 'ss',
__('Spain', 'wpsl') => 'es',
__('Sri Lanka', 'wpsl') => 'lk',
__('Sudan', 'wpsl') => 'sd',
__('Swaziland', 'wpsl') => 'sz',
__('Sweden', 'wpsl') => 'se',
__('Switzerland', 'wpsl') => 'ch',
__('Syria', 'wpsl') => 'sy',
__('São Tomé & Príncipe', 'wpsl') => 'st',
__('Taiwan', 'wpsl') => 'tw',
__('Tajikistan', 'wpsl') => 'tj',
__('Tanzania', 'wpsl') => 'tz',
__('Thailand', 'wpsl') => 'th',
__('Timor-Leste', 'wpsl') => 'tl',
__('Tokelau' ,'wpsl') => 'tk',
__('Togo', 'wpsl') => 'tg',
__('Tokelau' ,'wpsl') => 'tk',
__('Tonga', 'wpsl') => 'to',
__('Trinidad and Tobago', 'wpsl') => 'tt',
__('Tristan da Cunha', 'wpsl') => 'ta',
__('Tunisia', 'wpsl') => 'tn',
__('Turkey', 'wpsl') => 'tr',
__('Turkmenistan', 'wpsl') => 'tm',
__('Turks and Caicos Islands', 'wpsl') => 'tc',
__('Tuvalu', 'wpsl') => 'tv',
__('Uganda', 'wpsl') => 'ug',
__('Ukraine', 'wpsl') => 'ua',
__('United Arab Emirates', 'wpsl') => 'ae',
__('United Kingdom', 'wpsl') => 'gb',
__('United States', 'wpsl') => 'us',
__('Uruguay', 'wpsl') => 'uy',
__('Uzbekistan', 'wpsl') => 'uz',
__('Vanuatu', 'wpsl') => 'vu',
__('Vatican City', 'wpsl') => 'va',
__('Venezuela', 'wpsl') => 've',
__('Vietnam', 'wpsl') => 'vn',
__('Wallis Futuna', 'wpsl') => 'wf',
__('Western Sahara', 'wpsl') => 'eh',
__('Yemen', 'wpsl') => 'ye',
__('Zambia' ,'wpsl') => 'zm',
__('Zimbabwe', 'wpsl') => 'zw',
__('Åland Islands', 'wpsl') => 'ax'
);
}
// Make sure we have an array with a value.
if ( !empty( $api_option_list ) && ( is_array( $api_option_list ) ) ) {
$option_list = '';
$i = 0;
foreach ( $api_option_list as $api_option_key => $api_option_value ) {
// If no option value exist, set the first one as selected.
if ( ( $i == 0 ) && ( empty( $wpsl_settings['api_'.$list] ) ) ) {
$selected = 'selected="selected"';
} else {
$selected = ( $wpsl_settings['api_'.$list] == $api_option_value ) ? 'selected="selected"' : '';
}
$option_list .= '<option value="' . esc_attr( $api_option_value ) . '" ' . $selected . '>' . esc_html( $api_option_key ) . '</option>';
$i++;
}
return $option_list;
}
}
/**
* Create the dropdown to select the zoom level.
*
* @since 1.0.0
* @return string $dropdown The html for the zoom level list
*/
public function show_zoom_levels() {
global $wpsl_settings;
$dropdown = '<select id="wpsl-zoom-level" name="wpsl_map[zoom_level]" autocomplete="off">';
for ( $i = 1; $i < 13; $i++ ) {
$selected = ( $wpsl_settings['zoom_level'] == $i ) ? 'selected="selected"' : '';
switch ( $i ) {
case 1:
$zoom_desc = ' - ' . __( 'World view', 'wpsl' );
break;
case 3:
$zoom_desc = ' - ' . __( 'Default', 'wpsl' );
break;
case 12:
$zoom_desc = ' - ' . __( 'Roadmap', 'wpsl' );
break;
default:
$zoom_desc = '';
}
$dropdown .= "<option value='$i' $selected>". $i . esc_html( $zoom_desc ) . "</option>";
}
$dropdown .= "</select>";
return $dropdown;
}
/**
* Create the html output for the marker list that is shown on the settings page.
*
* There are two markers lists, one were the user can set the marker for the start point
* and one were a marker can be set for the store. We also check if the marker img is identical
* to the name in the option field. If so we set it to checked.
*
* @since 1.0.0
* @param string $marker_img The filename of the marker
* @param string $location Either contains "start" or "store"
* @return string $marker_list A list of all the available markers
*/
public function create_marker_html( $marker_img, $location ) {
global $wpsl_settings;
$marker_path = ( defined( 'WPSL_MARKER_URI' ) ) ? WPSL_MARKER_URI : WPSL_URL . 'img/markers/';
$marker_list = '';
if ( $wpsl_settings[$location.'_marker'] == $marker_img ) {
$checked = 'checked="checked"';
$css_class = 'class="wpsl-active-marker"';
} else {
$checked = '';
$css_class = '';
}
$marker_list .= '<li ' . $css_class . '>';
$marker_list .= '<img src="' . $marker_path . $marker_img . '" />';
$marker_list .= '<input ' . $checked . ' type="radio" name="wpsl_map[' . $location . '_marker]" value="' . $marker_img . '" />';
$marker_list .= '</li>';
return $marker_list;
}
/**
* Get the default values for the marker clusters dropdown options.
*
* @since 1.2.20
* @param string $type The cluster option type
* @return string $cluster_values The default cluster options
*/
public function get_default_cluster_option( $type ) {
$cluster_values = array(
'cluster_zoom' => array(
'7',
'8',
'9',
'10',
'11',
'12',
'13'
),
'cluster_size' => array(
'40',
'50',
'60',
'70',
'80'
),
);
return $cluster_values[$type];
}
/**
* Create a dropdown for the marker cluster options.
*
* @since 1.2.20
* @param string $type The cluster option type
* @return string $dropdown The html for the distance option list
*/
public function show_cluster_options( $type ) {
global $wpsl_settings;
$cluster_options = array(
'cluster_zoom' => array(
'id' => 'wpsl-marker-zoom',
'name' => 'cluster_zoom',
'options' => $this->get_default_cluster_option( $type )
),
'cluster_size' => array(
'id' => 'wpsl-marker-cluster-size',
'name' => 'cluster_size',
'options' => $this->get_default_cluster_option( $type )
),
);
$dropdown = '<select id="' . esc_attr( $cluster_options[$type]['id'] ) . '" name="wpsl_map[' . esc_attr( $cluster_options[$type]['name'] ) . ']" autocomplete="off">';
$i = 0;
foreach ( $cluster_options[$type]['options'] as $item => $value ) {
$selected = ( $wpsl_settings[$type] == $value ) ? 'selected="selected"' : '';
if ( $i == 0 ) {
$dropdown .= "<option value='0' $selected>" . __( 'Default', 'wpsl' ) . "</option>";
} else {
$dropdown .= "<option value=". absint( $value ) . " $selected>" . absint( $value ) . "</option>";
}
$i++;
}
$dropdown .= "</select>";
return $dropdown;
}
/**
* Show the options of the start and store markers.
*
* @since 1.0.0
* @return string $marker_list The complete list of available and selected markers
*/
public function show_marker_options() {
$marker_list = '';
$marker_images = $this->get_available_markers();
$marker_locations = array(
'start',
'store'
);
foreach ( $marker_locations as $location ) {
if ( $location == 'start' ) {
$marker_list .= __( 'Start location marker', 'wpsl' ) . ':';
} else {
$marker_list .= __( 'Store location marker', 'wpsl' ) . ':';
}
if ( !empty( $marker_images ) ) {
$marker_list .= '<ul class="wpsl-marker-list">';
foreach ( $marker_images as $marker_img ) {
$marker_list .= $this->create_marker_html( $marker_img, $location );
}
$marker_list .= '</ul>';
}
}
return $marker_list;
}
/**
* Load the markers that are used on the map.
*
* @since 1.0.0
* @return array $marker_images A list of all the available markers.
*/
public function get_available_markers() {
$marker_images = array();
$dir = apply_filters( 'wpsl_admin_marker_dir', WPSL_PLUGIN_DIR . 'img/markers/' );
if ( is_dir( $dir ) ) {
if ( $dh = opendir( $dir ) ) {
while ( false !== ( $file = readdir( $dh ) ) ) {
if ( $file == '.' || $file == '..' || ( strpos( $file, '@2x' ) !== false ) ) continue;
$marker_images[] = $file;
}
closedir( $dh );
}
}
return $marker_images;
}
/**
* Show a list of available templates.
*
* @since 1.2.20
* @return string $dropdown The html for the template option list
*/
public function show_template_options() {
global $wpsl_settings;
$dropdown = '<select id="wpsl-store-template" name="wpsl_ux[template_id]" autocomplete="off">';
foreach ( wpsl_get_templates() as $template ) {
$template_id = ( isset( $template['id'] ) ) ? $template['id'] : '';
$selected = ( $wpsl_settings['template_id'] == $template_id ) ? ' selected="selected"' : '';
$dropdown .= "<option value='" . esc_attr( $template_id ) . "' $selected>" . esc_html( $template['name'] ) . "</option>";
}
$dropdown .= '</select>';
return $dropdown;
}
/**
* Create dropdown lists.
*
* @since 2.0.0
* @param string $type The type of dropdown
* @return string $dropdown The html output for the dropdown
*/
public function create_dropdown( $type ) {
global $wpsl_settings;
$dropdown_lists = apply_filters( 'wpsl_setting_dropdowns', array(
'hour_input' => array(
'values' => array(
'textarea' => __( 'Textarea', 'wpsl' ),
'dropdown' => __( 'Dropdowns (recommended)', 'wpsl' )
),
'id' => 'wpsl-editor-hour-input',
'name' => 'wpsl_editor[hour_input]',
'selected' => $wpsl_settings['editor_hour_input']
),
'marker_effects' => array(
'values' => array(
'bounce' => __( 'Bounces up and down', 'wpsl' ),
'info_window' => __( 'Will open the info window', 'wpsl' ),
'ignore' => __( 'Does not respond', 'wpsl' )
),
'id' => 'wpsl-marker-effect',
'name' => 'wpsl_ux[marker_effect]',
'selected' => $wpsl_settings['marker_effect']
),
'more_info' => array(
'values' => array(
'store listings' => __( 'In the store listings', 'wpsl' ),
'info window' => __( 'In the info window on the map', 'wpsl' )
),
'id' => 'wpsl-more-info-list',
'name' => 'wpsl_ux[more_info_location]',
'selected' => $wpsl_settings['more_info_location']
),
'map_types' => array(
'values' => wpsl_get_map_types(),
'id' => 'wpsl-map-type',
'name' => 'wpsl_map[type]',
'selected' => $wpsl_settings['map_type']
),
'editor_map_types' => array(
'values' => wpsl_get_map_types(),
'id' => 'wpsl-editor-map-type',
'name' => 'wpsl_editor[map_type]',
'selected' => $wpsl_settings['editor_map_type']
),
'max_zoom_level' => array(
'values' => wpsl_get_max_zoom_levels(),
'id' => 'wpsl-max-auto-zoom',
'name' => 'wpsl_map[max_auto_zoom]',
'selected' => $wpsl_settings['auto_zoom_level']
),
'address_format' => array(
'values' => wpsl_get_address_formats(),
'id' => 'wpsl-address-format',
'name' => 'wpsl_ux[address_format]',
'selected' => $wpsl_settings['address_format']
),
'filter_types' => array(
'values' => array(
'dropdown' => __( 'Dropdown', 'wpsl' ),
'checkboxes' => __( 'Checkboxes', 'wpsl' )
),
'id' => 'wpsl-cat-filter-types',
'name' => 'wpsl_search[category_filter_type]',
'selected' => $wpsl_settings['category_filter_type']
)
) );
$dropdown = '<select id="' . esc_attr( $dropdown_lists[$type]['id'] ) . '" name="' . esc_attr( $dropdown_lists[$type]['name'] ) . '" autocomplete="off">';
foreach ( $dropdown_lists[$type]['values'] as $key => $value ) {
$selected = ( $key == $dropdown_lists[$type]['selected'] ) ? 'selected="selected"' : '';
$dropdown .= "<option value='" . esc_attr( $key ) . "' $selected>" . esc_html( $value ) . "</option>";
}
$dropdown .= '</select>';
return $dropdown;
}
/**
* Create a dropdown for the 12/24 opening hours format.
*
* @since 2.0.0
* @param string $hour_format The hour format that should be set to selected
* @return string $dropdown The html for the dropdown
*/
public function show_opening_hours_format( $hour_format = '' ) {
global $wpsl_settings;
$items = array(
'12' => __( '12 Hours', 'wpsl' ),
'24' => __( '24 Hours', 'wpsl' )
);
if ( !absint( $hour_format ) ) {
$hour_format = $wpsl_settings['editor_hour_format'];
}
$dropdown = '<select id="wpsl-editor-hour-format" name="wpsl_editor[hour_format]" autocomplete="off">';
foreach ( $items as $key => $value ) {
$selected = ( $hour_format == $key ) ? 'selected="selected"' : '';
$dropdown .= "<option value='$key' $selected>" . esc_html( $value ) . "</option>";
}
$dropdown .= '</select>';
return $dropdown;
}
/**
* Get the map style code
*
* @since 2.2.241
* @return string $map_style The code to style the map
*/
public function get_map_style() {
global $wpsl_settings;
$map_style = '';
if ( isset( $wpsl_settings['map_style'] ) ) {
$map_style = json_decode( $wpsl_settings['map_style'] );
if ( $map_style !== null ) {
$map_style = strip_tags( stripslashes( $map_style ) );
}
}
return $map_style;
}
}
}
File Manager Version 1.0, Coded By Lucas
Email: hehe@yahoo.com