'map-0', 'satellite' => 'off', 'satellite-button' => 'on', 'cluster' => 'off', 'cluster-color' => '#ff5b00', 'zoom-level' => '', 'zoom-cluster' => '12', 'labels' => 'off', 'roads' => 'off', 'grayscale' => '0', 'track-field' => '', 'track-url' => '' ], $atts, 'aotm-advanced-osm-map'); $paths = []; // 1. Process track-url (support multiple URLs separated by comma) if (!empty($atts['track-url'])) { $raw_urls = explode(',', $atts['track-url']); foreach ($raw_urls as $raw_url) { $url = esc_url_raw(trim($raw_url)); $ext = strtolower(pathinfo($url, PATHINFO_EXTENSION)); if (in_array($ext, ['kml', 'gpx'])) { $paths[] = $url; } } } // 2. Process track-field (Toolset field) $field = esc_attr($atts['track-field']); if (!empty($field)) { $raw_output = do_shortcode('[types field="'.$field.'" output="raw" separator=","][/types]'); if (!empty($raw_output)) { foreach (explode(',', $raw_output) as $item) { $url = esc_url_raw(trim($item)); $ext = strtolower(pathinfo($url, PATHINFO_EXTENSION)); if (in_array($ext, ['kml', 'gpx'])) $paths[] = $url; } } } $settings = [ 'mapId' => sanitize_text_field($atts['map-id']), 'satelliteLayer' => $atts['satellite'] === 'on' ? 'on' : 'off', 'satelliteButton' => $atts['satellite-button'] === 'off' ? 'off' : 'on', 'markerCluster' => $atts['cluster'] === 'on' ? 'on' : 'off', 'clusterColor' => sanitize_hex_color($atts['cluster-color']), 'zoomLevel' => $atts['zoom-level'] !== '' ? intval($atts['zoom-level']) : null, 'zoomCluster' => intval($atts['zoom-cluster']), 'mapLabels' => $atts['labels'] === 'on' ? 'on' : 'off', 'mapRoads' => $atts['roads'] === 'on' ? 'on' : 'off', 'grayscale' => max(0, min(1, (float)$atts['grayscale'])), 'paths' => $paths ]; wp_add_inline_script('aotm-public', 'var aotmSettings_' . esc_js(str_replace('-', '_', $settings['mapId'])) . ' = ' . wp_json_encode($settings) . ';', 'before'); return ''; } public function aotm_marker_shortcode($atts) { $atts = shortcode_atts(array('map-id' => '', 'track-field' => ''), $atts); if (empty($atts['map-id']) || empty($atts['track-field'])) return ''; $raw = do_shortcode(sprintf('[types field="%s" output="raw" separator=","][/types]', esc_attr($atts['track-field']))); if (empty($raw)) return ''; $paths = array(); foreach (array_map('trim', explode(',', $raw)) as $item) { $url = esc_url_raw($item); $ext = strtolower(pathinfo($url, PATHINFO_EXTENSION)); if (in_array($ext, ['kml', 'gpx'])) $paths[] = $url; } if (empty($paths)) return ''; $js = sprintf( 'window.AOTM_MARKERS = window.AOTM_MARKERS || {}; window.AOTM_MARKERS["%s"] = window.AOTM_MARKERS["%s"] || []; window.AOTM_MARKERS["%s"].push(%s);', esc_js($atts['map-id']), esc_js($atts['map-id']), esc_js($atts['map-id']), wp_json_encode(array('paths' => $paths)) ); wp_add_inline_script('aotm-public', $js); return ''; } public function aotm_enqueue_assets() { if (is_admin()) return; wp_enqueue_style('aotm-public', plugin_dir_url(__FILE__) . 'assets/css/public.css', array(), time()); wp_enqueue_script('aotm-leaflet-kml', plugin_dir_url(__FILE__) . 'assets/lib/leaflet-kml/L.KML.js', array(), '1.0.1', true); wp_enqueue_script('aotm-leaflet-gpx', plugin_dir_url(__FILE__) . 'assets/lib/leaflet-gpx/gpx.min.js', array(), '1.7.0', true); if (!wp_script_is('aotm-leaflet-markercluster', 'registered')) { wp_register_script('aotm-leaflet-markercluster', esc_url(plugin_dir_url(__FILE__) . 'leaflet.markercluster@1.4.1/dist/leaflet.markercluster.js'), array('leaflet'), '1.4.1', true); wp_register_style('aotm-leaflet-markercluster', esc_url(plugin_dir_url(__FILE__) . 'leaflet.markercluster@1.4.1/dist/MarkerCluster.css'), array(), '1.4.1'); wp_register_style('aotm-leaflet-markercluster-default', esc_url(plugin_dir_url(__FILE__) . 'leaflet.markercluster@1.4.1/dist/MarkerCluster.Default.css'), array(), '1.4.1'); } wp_enqueue_script('aotm-public', plugin_dir_url(__FILE__) . 'assets/js/public.js', array('jquery', 'aotm-leaflet-kml', 'aotm-leaflet-gpx'), time(), true); } } new AOTM_Advanced_OSM_Toolset_Maps();