'map-0', 'satellite' => 'off', 'topo' => 'off', 'satellite-button' => 'on', 'topo-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 = []; if (!empty($atts['track-url'])) { $raw_urls = explode(',', $atts['track-url']); foreach ($raw_urls as $raw_url) { $url = esc_url_raw(trim($raw_url)); if ($url) $paths[] = $url; } } $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)); if ($url) $paths[] = $url; } } } $settings = [ 'mapId' => sanitize_text_field($atts['map-id']), 'satelliteLayer' => $atts['satellite'] === 'on' ? 'on' : 'off', 'topoLayerDefault' => $atts['topo'] === 'on' ? 'on' : 'off', 'satelliteButton' => $atts['satellite-button'] === 'off' ? 'off' : 'on', 'topoButton' => $atts['topo-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, 'pluginUrl' => plugin_dir_url(__FILE__) ]; $map_key = esc_js(str_replace('-', '_', $settings['mapId'])); $json_data = wp_json_encode($settings); 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); if ($url) $paths[] = $url; } if (empty($paths)) return ''; $map_id = esc_js($atts['map-id']); $json_paths = wp_json_encode(array('paths' => $paths)); return ""; } public function aotm_enqueue_assets() { if (is_admin()) return; // We check for the Toolset Maps plugin presence $toolset_maps_active = class_exists('Toolset_Addon_Maps_Common') || function_exists('render_view_addon_maps'); // If the plugin is not active, we do nothing if (!$toolset_maps_active) { return; } // Enqueue styles wp_enqueue_style('aotm-public', plugin_dir_url(__FILE__) . 'assets/css/public.css', array(), time()); /** * IMPORTANT: We remove 'leaflet' from dependencies to avoid the "not registered" error. * Our public.js already handles the internal L check. */ // Load KML Support wp_enqueue_script( 'aotm-leaflet-kml', plugin_dir_url(__FILE__) . 'assets/lib/leaflet-kml/L.KML.js', array(), '1.0.1', true ); // Load GPX Support wp_enqueue_script( 'aotm-leaflet-gpx', plugin_dir_url(__FILE__) . 'assets/lib/leaflet-gpx/gpx.min.js', array(), '1.7.0', true ); // MarkerCluster Registration 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(), '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'); } // Public Logic - Dependent on our own scripts above wp_enqueue_script( 'aotm-public', plugin_dir_url(__FILE__) . 'assets/js/public.js', array('jquery', 'aotm-leaflet-kml', 'aotm-leaflet-gpx'), time(), true ); } public function aotm_register_gutenberg_blocks() { if (!function_exists('register_block_type')) return; register_block_type('aotm/advanced-osm-map', array( 'editor_script' => 'aotm-blocks-js', 'render_callback' => 'aotm_render_map_block', )); register_block_type('aotm/advanced-osm-marker', array( 'editor_script' => 'aotm-blocks-js', 'render_callback' => 'aotm_render_marker_block', )); } } new AOTM_Advanced_OSM_Toolset_Maps(); // Block Category add_filter('block_categories_all', function ($categories) { return array_merge($categories, [[ 'slug' => 'advanced-osm', 'title' => 'Advanced OSM Map', 'icon' => null, ]]); }, 10, 1); function aotm_render_map_block($atts) { $mapped_atts = [ 'map-id' => $atts['mapId'] ?? 'map-1', 'satellite' => $atts['satellite'] ?? 'off', 'topo' => $atts['topo'] ?? 'off', 'satellite-button' => $atts['satelliteButton'] ?? 'on', 'topo-button' => $atts['topoButton'] ?? 'on', 'cluster' => $atts['cluster'] ?? 'off', 'cluster-color' => $atts['clusterColor'] ?? '#ff5b00', 'zoom-level' => $atts['zoomLevel'] ?? '', 'zoom-cluster' => $atts['zoomCluster'] ?? '12', 'grayscale' => $atts['grayscale'] ?? '0', 'track-url' => $atts['trackUrl'] ?? '', 'track-field' => $atts['trackField'] ?? '', 'labels' => $atts['labels'] ?? 'off', 'roads' => $atts['roads'] ?? 'off', ]; $plugin = new AOTM_Advanced_OSM_Toolset_Maps(); $output = $plugin->aotm_shortcode_handler($mapped_atts); if (is_admin()) { return '