8889841chome/clixcotz/cbo.clix.co.tz/wp-content/plugins/wp-store-locator/admin/class-settings.php000064400000167511150526542650025661 0ustar00manually_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' ), '', '', $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' ), '

' ); 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 .= ''; $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 = '"; 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 .= '
  • '; $marker_list .= ''; $marker_list .= ''; $marker_list .= '
  • '; 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 = '"; 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 .= ''; } } 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 = ''; 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 = ''; 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 = ''; 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; } } }