{"id":375499,"date":"2026-09-28T12:41:17","date_gmt":"2026-09-28T12:41:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/geofolio\/"},"modified":"2026-09-28T12:02:51","modified_gmt":"2026-09-28T12:02:51","slug":"mapped-places","status":"publish","type":"plugin","link":"https:\/\/dsb.wordpress.org\/plugins\/mapped-places\/","author":23573582,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.1.5","stable_tag":"2.1.5","tested":"7.1.2","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"Mapped Places by Th\u00e9odore Riant","header_author":"Th\u00e9odore Riant","header_description":"Interactive map of your places with search, filters, a synchronised list and photo popups. Block, Elementor widget and shortcode.","assets_banners_color":"a5b7c8","last_updated":"2026-09-28 12:02:51","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/TheodoreRiant\/mapped-places","header_author_uri":"https:\/\/allside.studio","rating":0,"author_block_rating":0,"active_installs":0,"downloads":63,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.1.5":{"tag":"2.1.5","author":"theodoreriant","date":"2026-09-28 12:02:51","revision":3717108}},"upgrade_notice":{"2.1.0":"<p>Coming from Geofolio 1.x? Install Mapped Places alongside it, then open Places and confirm the import: your data is renamed in place and Geofolio is deactivated.<\/p>","2.0.0":"<p>The plugin is renamed Mapped Places. Every internal name changes (post type, taxonomies, meta keys, hooks, options): code written for 1.x must be updated, and 1.x data is not migrated automatically.<\/p>","1.4.0":"<p>Adds Appearance and Labels settings, an import from a previous map plugin, and fixes a fatal error on PHP 8 with location queries.<\/p>","1.3.0":"<p>Adds the Mapped Places Map block (WordPress 6.6+) and a simpler place edit form with people and roles. Existing managers are kept.<\/p>","1.2.1":"<p>Critical fix for sites without Elementor: single posts and pages no longer crash. Update now.<\/p>","1.2.0":"<p>Fixes the unreachable settings and import pages. Elementor widget: tablet and mobile now keep their own map height (600px and 85vh by default) instead of the desktop height; set them in the widget if needed.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3717087,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3717087,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3717087,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3717087,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3717087,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3717287,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/map\\\/\",\"preferredVersions\":{\"php\":\"8.3\",\"wp\":\"latest\"},\"steps\":[{\"step\":\"login\"},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"mapped-places\"},\"options\":{\"activate\":true}},{\"step\":\"runPHP\",\"code\":\"<?php require '\\\/wordpress\\\/wp-load.php'; $csv = WP_PLUGIN_DIR . '\\\/mapped-places\\\/data\\\/sample\\\/places.csv'; \\\\MappedPlaces\\\\Import\\\\Importer::get_instance()->import_csv($csv, true, false, dirname($csv) . '\\\/photos'); wp_insert_post(array('post_type' => 'page', 'post_status' => 'publish', 'post_title' => 'Map', 'post_name' => 'map', 'post_content' => '<!-- wp:mapped-places\\\/map {\\\"align\\\":\\\"full\\\",\\\"height\\\":\\\"80vh\\\"} \\\/-->'));\"}]}"}},"all_blocks":{"mapped-places\/map":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"mapped-places\/map","version":"1.0.0","title":"Mapped Places Map","category":"widgets","icon":"location-alt","description":"Interactive map of your places, with search, type filter and entity pills.","keywords":["map","places","locations","leaflet"],"textdomain":"mapped-places","supports":{"html":false,"align":["wide","full"]},"attributes":{"height":{"type":"string"},"center_lat":{"type":"number"},"center_lng":{"type":"number"},"zoom":{"type":"number"},"fit_bounds":{"type":"boolean","default":true},"tile_style":{"type":"string","default":""},"show_search":{"type":"boolean","default":true},"show_filter":{"type":"boolean","default":true},"show_list":{"type":"boolean","default":true},"show_fullscreen":{"type":"boolean","default":false},"sidebar_position":{"type":"string","enum":["left","right"],"default":"left"},"sidebar_title":{"type":"string"},"sidebar_subtitle":{"type":"string"}},"example":{},"editorScript":"file:.\/index.js","render":"file:.\/render.php"}},"tagged_versions":["2.1.5"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3717087,"resolution":"1","location":"assets","locale":"","width":1440,"height":701},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3717087,"resolution":"2","location":"assets","locale":"","width":1440,"height":701},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3717087,"resolution":"3","location":"assets","locale":"","width":1440,"height":701},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3717087,"resolution":"4","location":"assets","locale":"","width":1280,"height":900},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3717087,"resolution":"5","location":"assets","locale":"","width":1440,"height":900},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3717087,"resolution":"6","location":"assets","locale":"","width":1440,"height":900},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3717087,"resolution":"7","location":"assets","locale":"","width":1440,"height":900},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3717087,"resolution":"8","location":"assets","locale":"","width":1440,"height":900}},"screenshots":{"1":"The map with its sidebar, entity pills, type icons and clusters.","2":"A place popup with its photo carousel, contact details and opening hours.","3":"Search with suggestions, insensitive to accents and case.","4":"On a phone: search and type filter above the map, entity pills below them.","5":"Editing a place: a form with the location (geocoding and a draggable marker), description, contact details, people and photos.","6":"Map settings: basemap forced for the whole site and provider API key.","7":"The Mapped Places Map block in the editor, with its live preview and settings.","8":"The Elementor widget and its settings, with the live map in the Elementor editor."}},"plugin_section":[],"plugin_tags":[2466,4595,351,2909,6102],"plugin_category":[49],"plugin_contributors":[283179],"plugin_business_model":[],"class_list":["post-375499","plugin","type-plugin","status-publish","hentry","plugin_tags-directory","plugin_tags-leaflet","plugin_tags-locations","plugin_tags-map","plugin_tags-store-locator","plugin_category-maps-and-location","plugin_contributors-theodoreriant","plugin_committers-theodoreriant"],"banners":{"banner":"https:\/\/ps.w.org\/mapped-places\/assets\/banner-772x250.png?rev=3717087","banner_2x":"https:\/\/ps.w.org\/mapped-places\/assets\/banner-1544x500.png?rev=3717087","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/mapped-places\/assets\/icon.svg?rev=3717087","icon":"https:\/\/ps.w.org\/mapped-places\/assets\/icon.svg?rev=3717087","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/mapped-places\/assets\/screenshot-1.png?rev=3717087","caption":"The map with its sidebar, entity pills, type icons and clusters."},{"src":"https:\/\/ps.w.org\/mapped-places\/assets\/screenshot-2.png?rev=3717087","caption":"A place popup with its photo carousel, contact details and opening hours."},{"src":"https:\/\/ps.w.org\/mapped-places\/assets\/screenshot-3.png?rev=3717087","caption":"Search with suggestions, insensitive to accents and case."},{"src":"https:\/\/ps.w.org\/mapped-places\/assets\/screenshot-4.png?rev=3717087","caption":"On a phone: search and type filter above the map, entity pills below them."},{"src":"https:\/\/ps.w.org\/mapped-places\/assets\/screenshot-5.png?rev=3717087","caption":"Editing a place: a form with the location (geocoding and a draggable marker), description, contact details, people and photos."},{"src":"https:\/\/ps.w.org\/mapped-places\/assets\/screenshot-6.png?rev=3717087","caption":"Map settings: basemap forced for the whole site and provider API key."},{"src":"https:\/\/ps.w.org\/mapped-places\/assets\/screenshot-7.png?rev=3717087","caption":"The Mapped Places Map block in the editor, with its live preview and settings."},{"src":"https:\/\/ps.w.org\/mapped-places\/assets\/screenshot-8.png?rev=3717087","caption":"The Elementor widget and its settings, with the live map in the Elementor editor."}],"raw_content":"<!--section=description-->\n<p>Mapped Places turns a list of places into an interactive map your visitors can search and filter, with a list that follows the map and popups showing photos, contact details and opening hours. Add it with the <strong>Mapped Places Map block<\/strong>, the <strong>Elementor widget<\/strong> or the <code>[mapped-places]<\/code> shortcode.<\/p>\n\n<p>Features:<\/p>\n\n<ul>\n<li>marker clusters coloured by entity, and entity pills to filter the map;<\/li>\n<li>a type filter with faceted counts;<\/li>\n<li>search with suggestions, insensitive to case, accents and apostrophes;<\/li>\n<li>a list synchronised with the map, and rich popups with a photo carousel;<\/li>\n<li>a responsive layout with a mobile toolbar, fullscreen mode, keyboard accessible;<\/li>\n<li>a Gutenberg block with a live preview in the editor, an Elementor widget with style controls, and a shortcode;<\/li>\n<li>basemaps from OpenFreeMap, OpenStreetMap, IGN, CARTO, Jawg, MapTiler, Stadia and Thunderforest, with a keyless fallback;<\/li>\n<li>a CSV import that geocodes addresses, imports photos, entity colours and type icons, plus a sample dataset to try it;<\/li>\n<li>a public read-only REST API (<code>mapped-places\/v1<\/code>).<\/li>\n<\/ul>\n\n<h4>Who is it for?<\/h4>\n\n<p>Networks and organisations with several sites (associations, public services, health or social care providers, franchises), directories and store locators, event venues, tourism offices: anyone who wants a map of their places that stays up to date from WordPress.<\/p>\n\n<p>Places are a WordPress post type with taxonomies (entity with a colour, type with an icon, region, service, accessibility). Editors get geocoding with a draggable marker, a sortable photo gallery, one-click duplication and a CSV import.<\/p>\n\n<p>No external CDN: Leaflet, MarkerCluster and MapLibre are bundled. The interface is in English and French.<\/p>\n\n<h4>Accessibility<\/h4>\n\n<p>The map can be used with the keyboard: search suggestions with arrow keys and Enter, place cards focusable, Escape to leave fullscreen. Results and toasts are announced to screen readers (<code>aria-live<\/code>), entity pills expose their state (<code>aria-pressed<\/code>), the carousel has labelled controls, and animations follow <code>prefers-reduced-motion<\/code>.<\/p>\n\n<h4>Developers<\/h4>\n\n<p>Every site-specific behaviour goes through filters (<code>mapped_places_defaults<\/code>, <code>mapped_places_type_catalog<\/code>, <code>mapped_places_icons<\/code>, <code>mapped_places_import_columns<\/code>, <code>mapped_places_geocoder_url<\/code>, <code>mapped_places_place_slug<\/code>, <code>mapped_places_migration_steps<\/code> and more), documented in <code>docs\/hooks.md<\/code> on GitHub. The map is restyled by overriding <code>--mapl-*<\/code> CSS custom properties. The REST API is documented in <code>docs\/rest-api.md<\/code>.<\/p>\n\n<p>Site-specific behaviour (default values, icons, CSV columns, URL slugs, labels, data migrations) goes through filters, so a companion plugin can adapt Mapped Places without modifying it.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>No analytics, no tracking, no data sent to the plugin author. Visitors only reach the map tile provider selected by the site owner (see External services). Place data stays in the WordPress database. The Poppins font is served from the plugin (SIL Open Font License).<\/p>\n\n<h4>Source code and development<\/h4>\n\n<p>Development happens on GitHub: https:\/\/github.com\/TheodoreRiant\/mapped-places (source, issues, changelog, contribution guide). The plugin ships its readable sources; the only third-party code is in <code>assets\/vendor\/<\/code>, with each library's licence and version.<\/p>\n\n<h3>External services<\/h3>\n\n<p>Mapped Places never sends anything to the plugin author. It relies on the third-party services below, and only to do what the site owner set up. Leaflet, MarkerCluster, MapLibre and the Poppins font are bundled with the plugin: no CDN, no external script.<\/p>\n\n<h4>Map tiles (basemap)<\/h4>\n\n<p>The map is drawn from tiles that the <strong>visitor's browser<\/strong> downloads from the basemap provider chosen by the site owner in <strong>Places \u2192 Map settings<\/strong> (or per map, in the block, widget or shortcode). This happens on every page that displays a map, each time the visitor pans or zooms.<\/p>\n\n<p>What is sent to the provider: the coordinates of the tiles being viewed (map area and zoom level), the visitor's IP address and browser headers, as with any image embedded in a page, and, for keyed providers, the site's API key. No place data and no personal data from the WordPress site are sent.<\/p>\n\n<p>Providers, with their terms and privacy policies:<\/p>\n\n<ul>\n<li><strong>OpenFreeMap<\/strong> (tiles.openfreemap.org; default, used without a key, also the fallback when a keyed provider has no valid key; its conditions of use are stated on its home page): terms: https:\/\/openfreemap.org\/, privacy: https:\/\/openfreemap.org\/privacy\/<\/li>\n<li><strong>OpenStreetMap<\/strong> (tile.openstreetmap.org, OpenStreetMap Foundation, attribution https:\/\/www.openstreetmap.org\/copyright, tile usage policy https:\/\/operations.osmfoundation.org\/policies\/tiles\/): terms: https:\/\/osmfoundation.org\/wiki\/Terms_of_Use, privacy: https:\/\/osmfoundation.org\/wiki\/Privacy_Policy<\/li>\n<li><strong>OpenStreetMap France<\/strong> (tile.openstreetmap.fr, run by the OpenStreetMap France association, used without a key): terms: https:\/\/wiki.openstreetmap.org\/wiki\/FR:Serveurs\/tile.openstreetmap.fr, privacy: https:\/\/www.openstreetmap.fr\/mentions-legales\/<\/li>\n<li><strong>IGN G\u00e9oplateforme<\/strong> (data.geopf.fr, French national mapping agency, raster and vector tiles): terms: https:\/\/cartes.gouv.fr\/cgu\/, privacy: https:\/\/www.ign.fr\/institut\/donnees-caractere-personnel<\/li>\n<li><strong>CARTO<\/strong> (basemaps.cartocdn.com, API key required): terms: https:\/\/carto.com\/legal\/, privacy: https:\/\/carto.com\/privacy\/<\/li>\n<li><strong>Jawg Maps<\/strong> (tile.jawg.io, API key required): terms: https:\/\/www.jawg.io\/en\/terms\/, privacy: https:\/\/www.jawg.io\/en\/confidentiality\/<\/li>\n<li><strong>MapTiler<\/strong> (api.maptiler.com, API key required): terms: https:\/\/www.maptiler.com\/terms\/, privacy: https:\/\/www.maptiler.com\/privacy-policy\/<\/li>\n<li><strong>Stadia Maps<\/strong> (tiles.stadiamaps.com, API key required): terms: https:\/\/stadiamaps.com\/terms-of-service\/, privacy: https:\/\/stadiamaps.com\/privacy\/privacy-policy\/<\/li>\n<li><strong>Thunderforest<\/strong> (tile.thunderforest.com, API key required): terms: https:\/\/www.thunderforest.com\/terms\/, privacy: https:\/\/www.thunderforest.com\/privacy\/<\/li>\n<\/ul>\n\n<p>A keyed provider is only ever contacted if the site owner has selected it and entered a key. The site owner can also enter a custom tile URL: the provider is then whichever service they chose.<\/p>\n\n<h4>Geocoding (addresses to coordinates)<\/h4>\n\n<p>Only in the administration, never for visitors. When an editor imports a CSV file whose rows have no coordinates, or clicks <strong>Geocode address<\/strong> while editing a place, the postal address of that place (street, postal code, city) is sent to the <strong>Base Adresse Nationale<\/strong> geocoding API (api-adresse.data.gouv.fr), a French public service used without a key, which returns the coordinates. When an editor drags the marker on the location map, the reverse geocoding endpoint of the same API receives the coordinates and returns the address.<\/p>\n\n<p>Terms: https:\/\/adresse.data.gouv.fr\/cgu, privacy: https:\/\/adresse.data.gouv.fr\/donnees-personnelles<\/p>\n\n<p>The <code>mapped_places_geocoder_url<\/code> filter lets a developer point the CSV import to another GeoJSON geocoder (for example Nominatim, https:\/\/operations.osmfoundation.org\/policies\/nominatim\/): the terms of that service then apply.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin and activate it.<\/li>\n<li>Add places in <strong>Places<\/strong>, or import a CSV file (<strong>Places \u2192 Import CSV<\/strong>), or import the sample dataset.<\/li>\n<li>Add the map to a page with the <strong>Mapped Places Map<\/strong> block (WordPress 6.6 or later), the <strong>Mapped Places<\/strong> Elementor widget, or the <code>[mapped-places]<\/code> shortcode.<\/li>\n<li>Optional: in <strong>Places \u2192 Map settings<\/strong>, choose the basemap and set the tile provider API key.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"which%20basemaps%20are%20available%3F\"><h3>Which basemaps are available?<\/h3><\/dt>\n<dd><p>Positron via OpenFreeMap, OpenStreetMap and IGN (France) maps work without a key. CARTO, Jawg, MapTiler, Stadia and Thunderforest maps need an API key, set in <strong>Map settings<\/strong> or with the <code>MAPPED_PLACES_TILE_API_KEY<\/code> constant. Without a valid key, the map falls back to Positron via OpenFreeMap, which looks the same and needs no key.<\/p><\/dd>\n<dt id=\"which%20csv%20columns%20are%20recognised%3F\"><h3>Which CSV columns are recognised?<\/h3><\/dt>\n<dd><p>Name, Type, Type icon, Service, Accessibility, Entity, Entity colour, Description, Audience, Capacity, Address, Postal code, City, Region, Department, Latitude, Longitude, Phone, Email, Website, Manager, Opening hours, in English or French, accents and case ignored. Services and accessibility accept several values separated by <code>;<\/code>. Rows without coordinates are geocoded.<\/p><\/dd>\n<dt id=\"can%20i%20use%20another%20geocoder%3F\"><h3>Can I use another geocoder?<\/h3><\/dt>\n<dd><p>Yes: the <code>mapped_places_geocoder_url<\/code> filter points the import to any GeoJSON geocoder (for example Nominatim with <code>format=geojson<\/code>).<\/p><\/dd>\n<dt id=\"which%20shortcode%20attributes%20are%20available%3F\"><h3>Which shortcode attributes are available?<\/h3><\/dt>\n<dd><p>height (a CSS length such as <code>600px<\/code> or <code>80vh<\/code>, or <code>container<\/code> to let your stylesheet size the map), <code>center_lat<\/code>, <code>center_lng<\/code>, <code>zoom<\/code>, <code>fit_bounds<\/code> (<code>false<\/code> keeps the centre and zoom instead of zooming to the places), <code>show_search<\/code>, <code>show_filter<\/code>, <code>show_list<\/code>, <code>show_fullscreen<\/code>, <code>sidebar_position<\/code> (<code>left<\/code> or <code>right<\/code>), <code>sidebar_title<\/code>, <code>sidebar_subtitle<\/code>, <code>tile_style<\/code>.<\/p><\/dd>\n<dt id=\"can%20i%20use%20my%20own%20colours%2C%20font%20and%20names%3F\"><h3>Can I use my own colours, font and names?<\/h3><\/dt>\n<dd><p>Yes, without code: <strong>Places \u2192 Map settings \u2192 Appearance<\/strong> sets the main and accent colours, the font (the bundled Poppins or your theme's font) and the corner radius for every map; <strong>Labels and defaults<\/strong> renames places and entities in the admin, changes the URL slug of places and sets the default title, centre and zoom of new maps. Developers can do the same with filters.<\/p><\/dd>\n<dt id=\"do%20i%20need%20elementor%3F\"><h3>Do I need Elementor?<\/h3><\/dt>\n<dd><p>No. The block and the shortcode work on any theme. The Elementor widget is added only when Elementor is active.<\/p><\/dd>\n<dt id=\"why%20do%20carto%20maps%20show%20%22api%20key%20required%22%3F\"><h3>Why do CARTO maps show \"API key required\"?<\/h3><\/dt>\n<dd><p>Since 2026, CARTO serves its basemaps only with a key. Enter one in <strong>Places \u2192 Map settings<\/strong>, or keep the default Positron basemap served by OpenFreeMap, which looks the same and needs no key.<\/p><\/dd>\n<dt id=\"how%20do%20i%20try%20it%20quickly%3F\"><h3>How do I try it quickly?<\/h3><\/dt>\n<dd><p>In <strong>Places \u2192 Import CSV<\/strong>, import the sample dataset: 16 fictional places with photos, types, entities and opening hours. Then add the block to a page.<\/p><\/dd>\n<dt id=\"how%20many%20places%20can%20it%20handle%3F\"><h3>How many places can it handle?<\/h3><\/dt>\n<dd><p>The map loads all published places once and filters them in the browser, which keeps search instant. Markers are clustered and built once per place, and the REST responses are cached and refreshed as soon as a place changes. Several hundred places work comfortably; for many thousands, test on your hosting.<\/p><\/dd>\n<dt id=\"is%20it%20gdpr%20friendly%3F\"><h3>Is it GDPR friendly?<\/h3><\/dt>\n<dd><p>Mapped Places sets no cookie, has no analytics and sends nothing to its author. The only third party reached by visitors is the tile provider you choose (see External services). Address geocoding happens only in the admin.<\/p><\/dd>\n<dt id=\"can%20i%20translate%20it%3F\"><h3>Can I translate it?<\/h3><\/dt>\n<dd><p>Yes. The source strings are in English and every string is translatable. Translations are managed on translate.wordpress.org and delivered by WordPress as language packs; the French translation is maintained by the author.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.1.5<\/h4>\n\n<ul>\n<li>Packaging: development files that slipped into the first directory release are excluded. No functional change.<\/li>\n<\/ul>\n\n<h4>2.1.4<\/h4>\n\n<ul>\n<li>First release on the WordPress.org plugin directory. No functional change.<\/li>\n<\/ul>\n\n<h4>2.1.3<\/h4>\n\n<ul>\n<li>Fix: a site installed from the GitHub archive was in English; that archive ships the French translation again and loads it when no language pack is installed. The WordPress.org version relies on language packs.<\/li>\n<\/ul>\n\n<h4>2.1.2<\/h4>\n\n<ul>\n<li>readme: each basemap provider names the host reached by the visitor's browser; OpenStreetMap France listed with its terms and legal notice.<\/li>\n<li>Legacy import: Elementor layouts selected with one prepared query per old widget name.<\/li>\n<\/ul>\n\n<h4>2.1.1<\/h4>\n\n<ul>\n<li>Fix: the place popup no longer repeats the postal code and the city when the address already contains them.<\/li>\n<li>The admin menu uses the WordPress pin icon again, easier to read.<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>New: upgrade from Geofolio 1.x, the plugin's former name. Sites that still hold Geofolio data are offered the import on the Places screens: post type, taxonomies, meta, settings, Elementor widgets, shortcode and block are renamed in place, then the old plugin is deactivated.<\/li>\n<li>New: legacy import can rename blocks (<code>blocks<\/code> key).<\/li>\n<li>Fix: renaming Elementor widgets during an import no longer loads every Elementor layout of the site at once (memory exhaustion on large sites).<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Renamed Mapped Places (formerly Geofolio). New slug, text domain, post type, taxonomies, meta keys, hooks, options, REST namespace and block name: a breaking change for code written against 1.x.<\/li>\n<li>Admin notices appear only on the plugin's own screens; the migration re-run button moved to the Map settings.<\/li>\n<li>Translations are delivered by WordPress language packs; the plugin no longer ships translation files.<\/li>\n<li>External services (basemap providers and geocoder) documented with their terms and privacy policies.<\/li>\n<li>Fix: the duplication link sanitises its parameters before checking the nonce.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>New: Appearance settings (colours, font, corner radius) and Labels settings (names, URL slug, default map texts).<\/li>\n<li>New: import from a previous map plugin, described by a filter: data renamed in place, icons matched to types, managers converted to people, Elementor widgets and shortcodes rewritten, after a confirmation screen and a snapshot.<\/li>\n<li>New: plugin icon and admin menu icon.<\/li>\n<li>Fix: a REST request with <code>lat<\/code> or <code>lng<\/code> caused a fatal error on PHP 8.<\/li>\n<li>Fix: icon matching during the import ignores accents and case.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>New: Mapped Places Map block for the block editor, with the real map as preview and all display settings.<\/li>\n<li>New: the place edit screen is a form (location, description, contact, people, photos) instead of the article editor.<\/li>\n<li>New: several people per place, each with a role and a name.<\/li>\n<li>Fix: the location map in the admin could draw only a corner of its tiles.<\/li>\n<li>Fix: search suggestions no longer split the highlighted word.<\/li>\n<li>Plugin directory page: readme, icon, banner, screenshots and Live Preview.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Fix: every single post or page crashed (fatal error) on sites without Elementor.<\/li>\n<li>Faster filtering: map markers are built once and reused.<\/li>\n<li>Internal: stylesheet and map script split into sources, no visible change.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Fix: the settings and CSV import pages were unreachable (403) and missing from the Places menu.<\/li>\n<li>Elementor widget: responsive map height (tablet and mobile keep their own heights), \"Fit the view to the places\" switch, styles for the sidebar title and subtitle and for the entity pills.<\/li>\n<li>The map shows a message when the places cannot be loaded; the results counter is announced to screen readers.<\/li>\n<li>Faster map loading: the place list and filters are cached, and refreshed as soon as a place, a term or a setting changes.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Complete sample dataset: 16 places with photos, contacts, managers, opening hours, entity colours and type icons.<\/li>\n<li>CSV import: type icon, entity colour, audience, region, accessibility and photo columns; several values per cell.<\/li>\n<li>Keyless fallback basemap: Positron via OpenFreeMap, worldwide.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First public release, derived from a map plugin built for a single client: generic post type and taxonomies, English source strings with a French translation, data-driven type icons, generic CSV import, extension filters, PSR-4 code base.<\/li>\n<\/ul>","raw_excerpt":"Interactive map of your places with search, filters, a synchronised list and photo popups. Block, Elementor widget and shortcode.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/375499","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=375499"}],"author":[{"embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/theodoreriant"}],"wp:attachment":[{"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=375499"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=375499"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=375499"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=375499"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=375499"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/dsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=375499"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}