register_post_type(); } /** * Register the custom post type */ public function register_post_type() { $labels = array( 'name' => _x('Max Interactive Maps', 'Post Type General Name', 'max-interactive-maps'), 'singular_name' => _x('SVG Map', 'Post Type Singular Name', 'max-interactive-maps'), 'menu_name' => __('Max Interactive Maps', 'max-interactive-maps'), 'name_admin_bar' => __('SVG Map', 'max-interactive-maps'), 'add_new' => __('Add New Map', 'max-interactive-maps'), 'add_new_item' => __('Add New Map', 'max-interactive-maps'), 'new_item' => __('New Map', 'max-interactive-maps'), 'edit_item' => __('Edit Map', 'max-interactive-maps'), 'view_item' => __('View Map', 'max-interactive-maps'), 'all_items' => __('All Maps', 'max-interactive-maps'), 'search_items' => __('Search Maps', 'max-interactive-maps'), 'not_found' => __('No maps found.', 'max-interactive-maps'), 'not_found_in_trash' => __('No maps found in Trash.', 'max-interactive-maps'), 'featured_image' => __('Map Thumbnail', 'max-interactive-maps'), 'set_featured_image' => __('Set map thumbnail', 'max-interactive-maps'), 'remove_featured_image' => __('Remove map thumbnail', 'max-interactive-maps'), 'use_featured_image' => __('Use as map thumbnail', 'max-interactive-maps'), ); $args = array( 'labels' => $labels, 'public' => false, 'publicly_queryable' => false, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => false, 'rewrite' => false, 'capability_type' => 'post', 'has_archive' => false, 'hierarchical' => false, 'menu_position' => 25, 'menu_icon' => 'dashicons-location-alt', 'supports' => array('title'), 'show_in_rest' => false, ); register_post_type(self::POST_TYPE, $args); } /** * Get default map settings */ public static function get_default_settings() { return array( 'land_color' => '#c9e4c5', 'water_color' => '#a8d4e6', 'border_color' => '#ffffff', 'border_width' => 0.5, ); } /** * Resolve display colors without rewriting existing map metadata. */ public static function resolve_settings($settings) { $defaults = self::get_default_settings(); $settings = wp_parse_args($settings, $defaults); foreach (array('land_color', 'water_color', 'border_color') as $key) { $color = is_string($settings[$key]) ? sanitize_hex_color($settings[$key]) : null; $settings[$key] = $color ?: $defaults[$key]; } return $settings; } /** Read-only projection: keep usable markers; never repair stored metadata. */ public static function readable_pins($pins) { if ($pins instanceof stdClass) { $pins = get_object_vars($pins); } if (!is_array($pins)) { return array(); } return array_values(array_filter($pins, array(__CLASS__, 'pin_is_readable'))); } public static function pin_is_readable($pin) { if (!is_array($pin) || empty($pin)) { return false; } foreach (array('url', 'style', 'color', 'label', 'fontStyle', 'fontSize') as $field) { if (isset($pin[$field]) && !is_scalar($pin[$field])) { return false; } } foreach (array('x', 'y') as $field) { if (isset($pin[$field]) && (!is_numeric($pin[$field]) || !is_finite((float) $pin[$field]))) { return false; } } return true; } /** Ambiguous/damaged lists are protected as a whole, without changing IDs. */ public static function pins_are_editable($pins) { if (!is_array($pins) || $pins !== array_values($pins)) { return false; } $ids = array(); foreach ($pins as $pin) { if (!self::pin_is_readable($pin) || !isset($pin['id']) || !is_string($pin['id']) || '' === $pin['id'] || in_array($pin['id'], $ids, true)) { return false; } foreach (array('x', 'y') as $field) { if (!isset($pin[$field]) || !is_numeric($pin[$field]) || !is_finite((float) $pin[$field])) { return false; } } foreach (array('latitude', 'longitude') as $field) { if (isset($pin[$field]) && (!is_numeric($pin[$field]) || !is_finite((float) $pin[$field]))) { return false; } } $ids[] = $pin['id']; } return true; } /** * Get default pin data structure */ public static function get_default_pin() { return array( 'id' => '', 'x' => 50, 'y' => 50, 'url' => '', 'style' => 'dot', 'color' => '#e74c3c', 'label' => '', 'latitude' => 0, 'longitude' => 0, ); } }