{"id":322908,"date":"2026-06-09T06:08:17","date_gmt":"2026-06-09T06:08:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/mrz-maps-exp\/"},"modified":"2026-06-09T06:24:13","modified_gmt":"2026-06-09T06:24:13","slug":"mrz-maps-exp","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/mrz-maps-exp\/","author":23512077,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.7","stable_tag":"1.0.7","tested":"7.0","requires":"6.3","requires_php":"7.4","requires_plugins":null,"header_name":"MRZ Maps Exp","header_author":"Morez.co","header_description":"Cartographie Google Maps bas\u00e9e sur les CPT et champs ACF, avec filtres par taxonomie, Snazzy Maps et recherche par adresse.","assets_banners_color":"000000","last_updated":"2026-06-09 06:24:13","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/m0r3z\/mrz-maps-exp","header_author_uri":"https:\/\/morez.co","rating":0,"author_block_rating":0,"active_installs":0,"downloads":25,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.6":{"tag":"1.0.6","author":"mrzxp","date":"2026-06-09 06:07:53"},"1.0.7":{"tag":"1.0.7","author":"mrzxp","date":"2026-06-09 06:24:13"}},"upgrade_notice":{"1.0.7":"<p>First automated SVN deployment. No code change.<\/p>","1.0.6":"<p>Readme description translated to English (wordpress.org requirement) and GitHub repository made public so the Plugin URI resolves. No code change.<\/p>","1.0.5":"<p>Plugin Name shortened to &quot;MRZ Maps Exp&quot; to match the existing slug <code>mrz-maps-exp<\/code>. No data migration needed \u2014 all internal identifiers and data are unchanged.<\/p>","1.0.3":"<p>Updated readme <code>Contributors:<\/code> to the actual wp.org account (<code>mrzxp<\/code>). Cosmetic only.<\/p>","1.0.2":"<p>Pre-submission polish for wordpress.org. No functional change, safe upgrade.<\/p>","1.0.1":"<p>Small post-rebrand fixes: admin menu label (&quot;GMaps&quot; \u2192 &quot;MRZ Maps&quot;), uninstall cleanup targeting the right prefixes. Recommended upgrade.<\/p>","1.0.0":"<p>First public release as &quot;MRZ Maps Exp&quot; (Morez.co). Full rebrand from the internal &quot;GMaps-AA&quot; codebase \u2014 namespaces, prefixes, slug and CPT all changed. Sites previously running the internal &quot;GMaps-AA&quot; build must reconfigure their maps after upgrade.<\/p>"},"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3565514,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3565514,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.6","1.0.7"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3565514,"resolution":"1","location":"assets","locale":"","width":1940,"height":838},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3565514,"resolution":"2","location":"assets","locale":"","width":1942,"height":1178},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3565514,"resolution":"3","location":"assets","locale":"","width":1942,"height":1362},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3565514,"resolution":"4","location":"assets","locale":"","width":1942,"height":1312}},"screenshots":{"1":"<strong>Source data<\/strong> metabox: choose the source post type, the ACF coordinates field, and an optional load limit.","2":"<strong>HTML templates<\/strong> metabox: customizable templates for the tooltip and for the list items, with ACF and taxonomy placeholders.","3":"<strong>Cosmetic<\/strong> metabox: default marker, size, Spiderfier toggle, and per-term taxonomy markers.","4":"<strong>Filters<\/strong> metabox: configure taxonomy and ACF field filters (dropdown \/ radio \/ checkbox mode, OR \/ AND logic)."}},"plugin_section":[],"plugin_tags":[2211,1794,1571,2909,91],"plugin_category":[49,57,59],"plugin_contributors":[266282],"plugin_business_model":[],"class_list":["post-322908","plugin","type-plugin","status-publish","hentry","plugin_tags-acf","plugin_tags-custom-post-type","plugin_tags-google-maps","plugin_tags-map","plugin_tags-taxonomy","plugin_category-maps-and-location","plugin_category-taxonomy","plugin_category-utilities-and-tools","plugin_contributors-mrzxp","plugin_committers-mrzxp"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/mrz-maps-exp\/assets\/icon-256x256.png?rev=3565514","icon_2x":"https:\/\/ps.w.org\/mrz-maps-exp\/assets\/icon-256x256.png?rev=3565514","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/mrz-maps-exp\/assets\/screenshot-1.png?rev=3565514","caption":"<strong>Source data<\/strong> metabox: choose the source post type, the ACF coordinates field, and an optional load limit."},{"src":"https:\/\/ps.w.org\/mrz-maps-exp\/assets\/screenshot-2.png?rev=3565514","caption":"<strong>HTML templates<\/strong> metabox: customizable templates for the tooltip and for the list items, with ACF and taxonomy placeholders."},{"src":"https:\/\/ps.w.org\/mrz-maps-exp\/assets\/screenshot-3.png?rev=3565514","caption":"<strong>Cosmetic<\/strong> metabox: default marker, size, Spiderfier toggle, and per-term taxonomy markers."},{"src":"https:\/\/ps.w.org\/mrz-maps-exp\/assets\/screenshot-4.png?rev=3565514","caption":"<strong>Filters<\/strong> metabox: configure taxonomy and ACF field filters (dropdown \/ radio \/ checkbox mode, OR \/ AND logic)."}],"raw_content":"<!--section=description-->\n<p>MRZ Maps Exp is a generic, minimalist plugin to display any custom post type on a Google Map. Coordinates are read from an ACF Google Map field declared on each post. Everything is configured from the WordPress admin \u2014 no theme code required: source post type, filters, pagination, HTML templates, custom markers, responsive layout.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Multiple maps via a dedicated Custom Post Type \u2014 each map has its own configuration.<\/li>\n<li>Filters by taxonomy and by ACF field, in dropdown \/ radio \/ checkbox mode, with OR \/ AND logic.<\/li>\n<li>Hybrid search in a single field: Google Places address suggestions <strong>and<\/strong> posts whose title matches the input.<\/li>\n<li>Optional URL filter synchronization \u2014 share a pre-filtered link.<\/li>\n<li>Customizable markers: default icon, or per-term taxonomy icon.<\/li>\n<li>100% custom tooltip via OverlayView (not the native InfoWindow), fully overridable in CSS.<\/li>\n<li>Configurable HTML templates for the tooltip and the list, with ACF \/ taxonomy placeholders.<\/li>\n<li>Front pagination, automatic fit bounds after filtering, recenter on the current post in single template.<\/li>\n<li>Overlapping marker spiderfier (OverlappingMarkerSpiderfier).<\/li>\n<li>Snazzy Maps: paste a JSON to style the map.<\/li>\n<li>Responsive layout \u2014 filters above, left or right; detachable full-width search field; collapsible filters on mobile.<\/li>\n<li>Shortcode with optional forced filter: <code>[mrz_maps_exp id=\"X\" filter_taxonomy=\"genre\" filter_term=\"42\"]<\/code>.<\/li>\n<li>Translation-ready (text-domain <code>mrz-maps-exp<\/code>, .pot file provided).<\/li>\n<\/ul>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 6.3 or later, PHP 7.4 or later.<\/li>\n<li>Advanced Custom Fields (Pro recommended) \u2014 for the Google Map field.<\/li>\n<li>A Google Maps API key with the \"Maps JavaScript\", \"Places\" and \"Geocoding\" APIs enabled. The key must be declared in the theme's <code>functions.php<\/code> via the <code>mrz_maps_exp_api_key<\/code> filter or the <code>MRZ_MAPS_EXP_API_KEY<\/code> constant (the plugin deliberately does not expose an admin field for the key \u2014 it is a secret that has no place in the database).<\/li>\n<\/ul>\n\n<h4>Privacy \/ external calls<\/h4>\n\n<p>MRZ Maps Exp loads the Google Maps JavaScript library in the end user's browser, like any mapping plugin. No data is sent to Morez.co or any third-party service; no telemetry is collected. The Google Maps API key supplied by the site administrator is exposed on the client side (required to call Google's JS API) \u2014 it is recommended to restrict it by HTTP referrer in the Google Cloud Console.<\/p>\n\n<h4>Source code and contributions<\/h4>\n\n<p>Development happens publicly on GitHub: https:\/\/github.com\/m0r3z\/mrz-maps-exp\nIssues, pull requests and forks welcome.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin relies on the Google Maps JavaScript API to display the interactive map, geocode addresses entered in the search field, and provide place autocomplete suggestions. The Google Maps API key is supplied by the site administrator (via the <code>mrz_maps_exp_api_key<\/code> filter or <code>MRZ_MAPS_EXP_API_KEY<\/code> constant in the theme); the plugin itself does not bundle any key.<\/p>\n\n<h4>What is sent and when<\/h4>\n\n<ul>\n<li>When a page containing the <code>[mrz_maps_exp]<\/code> shortcode is loaded, the visitor's browser loads the Google Maps JavaScript library from <code>https:\/\/maps.googleapis.com\/maps\/api\/js<\/code>, including the <code>places<\/code> library. The Google Maps API key is appended as a query parameter.<\/li>\n<li>When the visitor types in the search field, each keystroke (debounced) sends the current query string to Google's Places Autocomplete service to retrieve address suggestions. If the visitor picks a suggestion, Google's Places Details service is then called to obtain the coordinates for that place.<\/li>\n<li>The visitor's IP address is transmitted to Google as part of these HTTP requests, as it is for any third-party request initiated by their browser.<\/li>\n<li>No data is sent to Google when the plugin is only installed or activated in the admin \u2014 only when a public page containing the shortcode is loaded.<\/li>\n<\/ul>\n\n<p>The plugin does not send any data to Morez.co or to any other third-party service. No telemetry is collected.<\/p>\n\n<h4>Provider and legal links<\/h4>\n\n<ul>\n<li>Service: Google Maps Platform (Google LLC).<\/li>\n<li>Terms of Service: https:\/\/cloud.google.com\/maps-platform\/terms<\/li>\n<li>Privacy Policy: https:\/\/policies.google.com\/privacy<\/li>\n<\/ul>\n\n<p>It is the responsibility of site administrators to obtain a valid Google Maps API key, accept Google's Terms of Service for the project that key belongs to, and disclose the use of Google Maps in their own site's privacy policy where required.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate Advanced Custom Fields (Pro recommended).<\/li>\n<li>Declare your Google Maps API key in the theme's <code>functions.php<\/code>:\n   add_filter( 'mrz_maps_exp_api_key', function () { return 'YOUR_API_KEY'; } );<\/li>\n<li>Install and activate MRZ Maps Exp from the WordPress \"Plugins\" screen, or upload the zip.<\/li>\n<li>Go to the <strong>MRZ Maps<\/strong> menu \u2192 <strong>Add a map<\/strong>, then configure the source post type, filters, templates, etc.<\/li>\n<li>Insert the generated shortcode on any page: <code>[mrz_maps_exp id=\"X\"]<\/code>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20acf%20really%20required%3F\"><h3>Is ACF really required?<\/h3><\/dt>\n<dd><p>Yes. MRZ Maps Exp relies on ACF Google Map fields to retrieve each post's latitude, longitude and address. The plugin is built to integrate with ACF rather than duplicate a custom coordinates system. The free version of ACF is enough; ACF Pro is only required if you use Pro features such as the repeater field.<\/p><\/dd>\n<dt id=\"why%20is%20the%20google%20maps%20api%20key%20not%20configurable%20from%20the%20admin%3F\"><h3>Why is the Google Maps API key not configurable from the admin?<\/h3><\/dt>\n<dd><p>This is a deliberate choice. An API key is a secret that has no place in the database: it could be exfiltrated via a DB export, an unencrypted backup, or a compromised admin account. The key must be declared in the theme code via the <code>mrz_maps_exp_api_key<\/code> filter or the <code>MRZ_MAPS_EXP_API_KEY<\/code> constant. This is also the recommended pattern for key rotation.<\/p><\/dd>\n<dt id=\"is%20the%20plugin%20compatible%20with%20the%20salient%20theme%20or%20with%20other%20mapping%20plugins%3F\"><h3>Is the plugin compatible with the Salient theme or with other mapping plugins?<\/h3><\/dt>\n<dd><p>Yes. MRZ Maps Exp detects whether Google Maps JS is already loaded by another plugin (e.g. Salient via <code>salient-core<\/code> \/ <code>nectar_gmap<\/code>) and does not re-enqueue it in that case. A <code>mrz_maps_exp_skip_gmaps_enqueue<\/code> filter lets you override the behavior if needed.<\/p><\/dd>\n<dt id=\"how%20do%20i%20add%20content%20inside%20the%20tooltip%20or%20list%20items%3F\"><h3>How do I add content inside the tooltip or list items?<\/h3><\/dt>\n<dd><p>In the map's \"HTML templates\" metabox, free-form HTML templates are configurable with placeholders: <code>{post_title}<\/code>, <code>{post_url}<\/code>, <code>{post_excerpt}<\/code>, <code>{post_thumbnail}<\/code>, <code>{post_thumbnail_url}<\/code>, <code>{%acf_field_name%}<\/code>, <code>{taxonomy:slug}<\/code>, <code>{taxonomy:slug:first}<\/code>. Conditional blocks <code>{#if %field%}\u2026{\/if}<\/code> are supported so that an area is only rendered if the field is filled.<\/p><\/dd>\n<dt id=\"can%20i%20filter%20the%20map%20through%20the%20url%20to%20share%20a%20pre-filtered%20link%3F\"><h3>Can I filter the map through the URL to share a pre-filtered link?<\/h3><\/dt>\n<dd><p>Yes \u2014 opt-in option in the Filters metabox. When enabled, the active filters are reflected in the URL in real time (<code>?gm_&lt;map_id&gt;_tax_&lt;slug&gt;=12,34&amp;gm_&lt;map_id&gt;_acf_&lt;field&gt;=value<\/code>), and a link pasted with these parameters will pre-activate the matching filters.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20handle%20a%20large%20number%20of%20markers%3F\"><h3>Does the plugin handle a large number of markers?<\/h3><\/dt>\n<dd><p>The front rendering easily handles a few thousand markers (data is injected as inline JSON and filtered on the client side). For larger volumes, consider limiting the initial dataset via a forced filter on the taxonomy or via the admin \"Maximum number of posts\" option.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>CI: first automated deployment to wordpress.org via the new <code>Deploy to WordPress.org<\/code> GitHub Action (10up\/action-wordpress-plugin-deploy). No code change.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Translated the readme description, FAQ, installation steps and requirements to English (wordpress.org guideline). The shipped code already uses English-friendly identifiers; only the documentation was localized to French.<\/li>\n<li>Made the GitHub repository public so the Plugin URI and Repository URL resolve correctly for the review team (previously 404 due to the private repo).<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Plugin Name shortened from \"MRZ Maps Experience\" to \"MRZ Maps Exp\" so the displayed name matches the plugin slug <code>mrz-maps-exp<\/code>. Resolves the <code>textdomain_mismatch<\/code> warning of the wordpress.org automated scan without renaming the slug. All internal identifiers (constants <code>MRZ_MAPS_EXP_*<\/code>, function prefix <code>mrz_maps_exp_*<\/code>, post_meta prefix <code>_mrz_maps_exp_*<\/code>, namespace <code>MrzMapsExp\\<\/code>, CPT <code>mrz_maps_exp_map<\/code>, shortcode <code>[mrz_maps_exp]<\/code>, script\/style handles, CSS classes) stay unchanged.<\/li>\n<li><code>Tested up to: 7.0<\/code> (was <code>6.9<\/code> \u2014 outdated_tested_upto_header).<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Updated the readme <code>Contributors:<\/code> line to point at the actual wordpress.org account that owns the plugin (<code>mrzxp<\/code>). The GitHub repository remains <code>m0r3z\/mrz-maps-exp<\/code> \u2014 the two accounts are intentionally distinct.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Pre-submission polish for wordpress.org. No functional change.<\/li>\n<li><code>uninstall.php<\/code>: rewrote the three <code>$wpdb-&gt;query()<\/code> calls using <code>$wpdb-&gt;prepare()<\/code> and <code>$wpdb-&gt;esc_like()<\/code> instead of hand-escaped LIKE patterns, matching the strictest Plugin Check expectations.<\/li>\n<li><code>metabox-templates.php<\/code>: wrapped the inline <code>&lt;code&gt;<\/code> placeholders documentation in <code>wp_kses()<\/code> with an explicit allowlist instead of <code>echo<\/code>ing literal HTML.<\/li>\n<li><code>map-wrapper.php<\/code>: minor cleanup of a <code>&lt;?php echo ' \/ '; ?&gt;<\/code> separator in the pagination markup (replaced with a literal character).<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fixed admin label: the sidebar menu still displayed \"GMaps\" instead of \"MRZ Maps\". CPT <code>menu_name<\/code> corrected.<\/li>\n<li>Fixed uninstall: <code>uninstall.php<\/code> still targeted the old <code>_gmaps_aa_*<\/code> prefixes for the post_meta, term_meta and transient cleanup (escaped underscores in the SQL LIKE patterns were missed by the 1.0.0 bulk rename).<\/li>\n<li>Fixed documentation: residual mentions of the \"GMaps\" menu in <code>readme.txt<\/code> and <code>README.md<\/code> corrected to \"MRZ Maps\".<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First public release under the Morez.co identity. Full rebrand from the internal \"GMaps-AA\" codebase: new plugin slug (<code>mrz-maps-exp<\/code>), new text domain, new PHP namespace (<code>MrzMapsExp<\/code>), new constant \/ function \/ meta \/ CPT prefixes (<code>MRZ_MAPS_EXP_*<\/code>, <code>mrz_maps_exp_*<\/code>, <code>_mrz_maps_exp_*<\/code>, <code>mrz_maps_exp_map<\/code>). Existing sites coming from the internal \"GMaps-AA\" codebase must reconfigure their maps after upgrade \u2014 there is no automatic data migration.<\/li>\n<li>Compliance with the wordpress.org plugin guidelines:\n\n<ul>\n<li>The admin menu icon CSS is no longer printed inline via <code>admin_head<\/code>; it is now enqueued via <code>wp_register_style<\/code> + <code>wp_add_inline_style<\/code> on <code>admin_enqueue_scripts<\/code>.<\/li>\n<li>Removed the now-unnecessary <code>load_plugin_textdomain()<\/code> call (since WordPress 4.6, translations of plugins hosted on wordpress.org are loaded automatically).<\/li>\n<li>Added a dedicated <code>== External services ==<\/code> section in the readme documenting the use of the Google Maps JavaScript API, what data is sent, and links to Google's Terms of Service and Privacy Policy.<\/li>\n<\/ul><\/li>\n<\/ul>","raw_excerpt":"Display custom posts on a Google Map using ACF-based coordinates, with taxonomy and ACF filters, hybrid search and customizable markers.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/322908","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=322908"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/mrzxp"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=322908"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=322908"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=322908"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=322908"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=322908"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=322908"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}