{"id":388926,"date":"2026-10-23T11:16:22","date_gmt":"2026-10-23T11:16:22","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/mapsemble\/"},"modified":"2026-10-23T13:08:26","modified_gmt":"2026-10-23T13:08:26","slug":"mapsemble","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/mapsemble\/","author":23574708,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.5.0","stable_tag":"0.5.0","tested":"7.1.3","requires":"6.3","requires_php":"8.0","requires_plugins":null,"header_name":"Mapsemble","header_author":"Mapsemble","header_description":"Embed any Mapsemble map \u2014 including a no-account sample \u2014 or build maps from your own WordPress content.","assets_banners_color":"81899c","last_updated":"2026-10-23 13:08:26","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/www.mapsemble.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":67,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.5.0":{"tag":"0.5.0","author":"mapsemble","date":"2026-10-23 13:08:26","revision":3761720}},"upgrade_notice":{"0.5.0":"<p>New Map blocks insert as Wide; blocks already set to Wide or Full now render that way. With fill-viewport off, height is exact. The menu reads Maps, Built from this site, Settings. The location editor opens in a new tab, with the map beside it.<\/p>","0.4.0":"<p>The shared sample map now always loads from app.mapsemble.com. A Mapsemble Map block that was placed but never given a map now shows the sample map instead of nothing. TLS is verified by default; a local stack with an untrusted certificate must define MAPSEMBLE_SSL_VERIFY as false.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3761497,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3761497,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3761497,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3761497,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3761497,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"mapsemble\/map":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"mapsemble\/map","version":"0.5.0","title":"Mapsemble Map","category":"embed","icon":"location-alt","description":"Embed any Mapsemble map: one of yours, the sample, or one built from this site's content.","keywords":["map","mapsemble","locator"],"textdomain":"mapsemble","attributes":{"configId":{"type":"number","default":0},"remoteMapId":{"type":"string","default":"sample"},"height":{"type":"string","default":"50vh"},"scrollCapture":{"type":"string","default":""},"scrollOffsetTop":{"type":"string","default":""},"scrollOffsetBottom":{"type":"string","default":""},"fillViewport":{"type":"boolean","default":true},"filters":{"type":"string","default":""}},"supports":{"html":false,"align":["wide","full"]},"example":{"attributes":{"remoteMapId":"sample","height":"50vh"}},"editorScript":"mapsemble-block-editor","editorStyle":"file:.\/editor.css"}},"tagged_versions":["0.5.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3761497,"resolution":"1","location":"assets","locale":"","width":1280,"height":800},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3761497,"resolution":"2","location":"assets","locale":"","width":1280,"height":800},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3761497,"resolution":"3","location":"assets","locale":"","width":1280,"height":800},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3761497,"resolution":"4","location":"assets","locale":"","width":1280,"height":800}},"screenshots":{"1":"The Mapsemble Map block: search your maps by name; same-named maps show their date and short id.","2":"Settings once connected: how many maps your Mapsemble account holds, with reconnecting folded away.","3":"A site-fed map: bound to a map on your account, it says how many of this site's posts it serves.","4":"The sample map on a published page, with cards and map side by side."}},"plugin_section":[],"plugin_tags":[4124,16172,2909,2660,6102],"plugin_category":[49],"plugin_contributors":[288074],"plugin_business_model":[],"class_list":["post-388926","plugin","type-plugin","status-publish","hentry","plugin_tags-geolocation","plugin_tags-interactive-map","plugin_tags-map","plugin_tags-maps","plugin_tags-store-locator","plugin_category-maps-and-location","plugin_contributors-mapsemble","plugin_committers-mapsemble"],"banners":{"banner":"https:\/\/ps.w.org\/mapsemble\/assets\/banner-772x250.png?rev=3761497","banner_2x":"https:\/\/ps.w.org\/mapsemble\/assets\/banner-1544x500.png?rev=3761497","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/mapsemble\/assets\/icon.svg?rev=3761497","icon":"https:\/\/ps.w.org\/mapsemble\/assets\/icon.svg?rev=3761497","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/mapsemble\/assets\/screenshot-1.png?rev=3761497","caption":"The Mapsemble Map block: search your maps by name; same-named maps show their date and short id."},{"src":"https:\/\/ps.w.org\/mapsemble\/assets\/screenshot-2.png?rev=3761497","caption":"Settings once connected: how many maps your Mapsemble account holds, with reconnecting folded away."},{"src":"https:\/\/ps.w.org\/mapsemble\/assets\/screenshot-3.png?rev=3761497","caption":"A site-fed map: bound to a map on your account, it says how many of this site's posts it serves."},{"src":"https:\/\/ps.w.org\/mapsemble\/assets\/screenshot-4.png?rev=3761497","caption":"The sample map on a published page, with cards and map side by side."}],"raw_content":"<!--section=description-->\n<p>Mapsemble connects WordPress to the <a href=\"https:\/\/mapsemble.com\/map-builder\">Mapsemble<\/a> map service. You design the map \u2014 styling, clustering, filters, cards \u2014 in Mapsemble; this plugin puts it on a page and, when you want, feeds it from your own posts.<\/p>\n\n<h4>Embed any map<\/h4>\n\n<p>Every map embeds by its Mapsemble map id \u2014 with the Mapsemble Map block, the <code>[mapsemble map=\"\u2026\"]<\/code> shortcode, or the <code>mapsemble_embed()<\/code> template function. No setup on this site is needed: the block lists your account's maps, a typed id works for any public map, and <code>[mapsemble map=\"sample\"]<\/code> renders a real, fully populated sample map before you have entered any credentials at all. Your account's maps are listed under Mapsemble \u2192 Maps, where locations for maps hosted on Mapsemble are edited in the Mapsemble location editor, which opens from your admin in a new tab with the map beside it \u2014 this works on a local development site too.<\/p>\n\n<h4>Or build a map from this site's content<\/h4>\n\n<p>Add a map under Mapsemble \u2192 Built from this site to make a post type the map's data: give posts a location and Mapsemble fetches them from a public endpoint on your site, with the cards rendered from your own templates. Always-on filters, visitor filter mappings, sort options and marker style properties shape the feed per map. This is the advanced option: it needs a publicly reachable site, and the Pro plan on the Mapsemble side \u2014 nothing is blocked before then; visitors see an upgrade notice over the map until the account is upgraded.<\/p>\n\n<p>Editing follows the data: maps hosted on Mapsemble are edited in the Mapsemble editor (opened from Mapsemble \u2192 Maps in your admin); maps built from this site are edited by editing the posts themselves.<\/p>\n\n<h4>Shaping a site-fed map<\/h4>\n\n<p>A map built from this site does not have to serve the whole post type:<\/p>\n\n<ul>\n<li><strong>Always-on filters<\/strong> restrict which posts appear \u2014 by taxonomy term or custom field \u2014 so two maps on the same post type can show different posts.<\/li>\n<li><strong>Visitor filters<\/strong> bind the filter widgets you configured on Mapsemble to your taxonomies and custom fields, so choosing one actually narrows the results. Option pickers are fed from your content.<\/li>\n<li><strong>Sort options<\/strong> bind the map's sort choices to publication date, title, a custom field, or entropy \u2014 an even geographic spread, so the first results cover the map instead of clustering.<\/li>\n<li><strong>Marker style properties<\/strong> put taxonomy terms or custom field values on every map feature, for Mapsemble's marker-style rules to match.<\/li>\n<\/ul>\n\n<p>All of this lives on the map's own edit screen and applies to the feed immediately \u2014 no reindexing.<\/p>\n\n<h4>Placing a map<\/h4>\n\n<ul>\n<li><strong>Block editor<\/strong> \u2014 add the <strong>Mapsemble Map<\/strong> block (under Embed) and pick any map right in the canvas: search your account's maps and maps built from this site, or choose the sample or a typed id. The chosen map previews live, and \"Change map\" in the block toolbar picks another. New blocks insert as Wide. Height, scroll behaviour and initial filters are in the block sidebar. The same block works in Appearance \u2192 Widgets and in the Site Editor.<\/li>\n<li><strong>Classic editor, Text widgets, page builders<\/strong> \u2014 use the shortcode. <code>map<\/code> takes a Mapsemble map id (or <code>sample<\/code>); <code>id<\/code> takes a site-fed map's WordPress id, shown ready to copy on the Built from this site list:\n  [mapsemble map=\"0198\u2026\" height=\"60vh\" scroll_capture=\"mobile\"] or <code>[mapsemble id=\"123\"]<\/code><\/li>\n<li><strong>Theme templates<\/strong> \u2014 <code>mapsemble_embed( '0198\u2026' )<\/code> \/ <code>the_mapsemble_embed( 'sample' )<\/code> for any map by id, or <code>mapsemble_map( 123 )<\/code> \/ <code>the_mapsemble_map( 123 )<\/code> for a map built from this site.<\/li>\n<\/ul>\n\n<p>A map built from this site serves from this site however it is embedded, by its map id too \u2014 \"fed by WordPress\" is a property of the map, not of where you embed it.<\/p>\n\n<pre><code>height and the two offsets take a CSS length (`50vh`, `480px`, `2rem`). `scroll_capture` is `none` or `mobile`, and turns the map into a sticky section: scroll gestures over it move the card list instead of the page. While scroll capture is on, the map sticks at the top offset \u2014 that is how you clear a fixed site header. While the map fills the visible screen, both offsets are also taken off its height, leaving room above and below it \u2014 as long as the minimum `height` leaves that room. Leave any of them out and the map keeps its own default.\n<\/code><\/pre>\n\n<p>Two more attributes shape the embed:<\/p>\n\n<ul>\n<li><code>fill_viewport=\"false\"<\/code> stops the map from growing to the visible viewport. Normally <code>height<\/code> is a minimum: the map is at least that tall and grows to fill the visible screen. With <code>fill_viewport=\"false\"<\/code> it is the exact height \u2014 <code>height=\"300px\"<\/code> makes a 300px map.<\/li>\n<li><code>filters<\/code> seeds the map's filters on load, as a JSON object of filter slug to value. Quote it with single quotes so the editor does not mangle the JSON: <code>[mapsemble id=\"123\" filters='{\"category\":\"parks\"}']<\/code>. An unreadable value is ignored. In the block, both live in the sidebar; in <code>mapsemble_map()<\/code>, pass <code>filters<\/code> as a native array.<\/li>\n<\/ul>\n\n<p><strong>A Mapsemble account is required.<\/strong> See the External Services section for details on what data is exchanged.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects to the Mapsemble service (https:\/\/app.mapsemble.com):<\/p>\n\n<ul>\n<li>It loads the Mapsemble map widget (widget.js) from app.mapsemble.com on pages where you embed a map, and in the block editor's live preview of one. Visitors' browsers request map tiles and configuration from the Mapsemble service; their IP address and the map id are visible to it, as with any embedded map service.<\/li>\n<li>From the admin area it authenticates with your API credentials to list the maps in your account, to read a map's filters and sort options (for a map's edit screen and the block's Filters panel), to create maps, and to tell Mapsemble where each map's data comes from.<\/li>\n<li>When you connect from the settings screen, the link your browser opens carries a one-time random code to Mapsemble; you approve there, and the plugin then collects the API credentials over a server-to-server request, so they never pass through your browser.<\/li>\n<li>For a map whose locations live in Mapsemble, \"Open the location editor\" under Mapsemble \u2192 Maps sends a new browser tab to app.mapsemble.com, signed in with a single-use token minted from your API credentials at the moment you click. The token is scoped to that one map, and the session it opens reaches that map's editor and preview and no other part of your Mapsemble account. WordPress users never see the credentials.<\/li>\n<li>When an editor searches for an address in a post's Map location box (\"Find an address\"), the text they typed is sent from this site's server to the Mapsemble API (<code>\/api\/v1\/geocode<\/code>), authenticated with your API credentials, and Mapsemble forwards it to Google's Geocoding API to look up its coordinates. It is sent only when an editor searches; visitors never trigger it. The \"check it on OpenStreetMap\" link next to a found address opens openstreetmap.org only when clicked. Google Maps Platform terms: https:\/\/cloud.google.com\/maps-platform\/terms \u2014 Google privacy policy: https:\/\/policies.google.com\/privacy<\/li>\n<li>For a map built from this site, the Mapsemble service fetches your published, geo-tagged content from public endpoints this plugin provides on your site.<\/li>\n<\/ul>\n\n<p>Terms of service: https:\/\/www.mapsemble.com\/terms \u2014 Privacy policy: https:\/\/www.mapsemble.com\/privacy<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>Under Mapsemble \u2192 Settings, click Authenticate on Mapsemble, approve the connection in the tab that opens, and the page finishes on its own. (You can still paste a client ID and secret by hand.)<\/li>\n<li>Add the Mapsemble Map block to a page and pick one of your maps \u2014 nothing else is needed. Your account's maps are listed under Mapsemble \u2192 Maps, where \"Edit locations\" leads to a button that opens the Mapsemble location editor in a new tab.<\/li>\n<li>To feed a map from this site's posts instead, go to Mapsemble \u2192 Built from this site and click Build a map from this site. Pick a map from your account, or create a new one from this screen.<\/li>\n<li>Pick a post type and a location source, and save. Then give your posts a location with the built-in location box (find an address, or enter latitude and longitude) or an ACF Google Map field.<\/li>\n<li>Embed it with the Mapsemble Map block, or with the shortcode shown on the Built from this site list: <code>[mapsemble id=\"123\" height=\"60vh\"]<\/code>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20does%20the%20map%20design%20come%20from%3F\"><h3>Where does the map design come from?<\/h3><\/dt>\n<dd><p>From your Mapsemble account. Styling, clustering, filters and layout are configured in the Mapsemble map builder. This plugin decides only where the locations come from, and renders the content cards when they come from this site.<\/p><\/dd>\n<dt id=\"who%20can%20edit%20a%20map%27s%20locations%3F\"><h3>Who can edit a map's locations?<\/h3><\/dt>\n<dd><p>Editors, by default. Maintaining locations is content work, so it has its own capability (<code>edit_mapsemble_map_data<\/code>) that the administrative ones deliberately do not imply \u2014 the person adding locations does not need the screen holding your API credentials. Administrators hold both.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20card%20markup%3F\"><h3>Can I change the card markup?<\/h3><\/dt>\n<dd><p>Yes. Copy <code>templates\/card.php<\/code> from the plugin into your theme as <code>mapsemble\/card.php<\/code> and adjust it. Developers can also use the <code>mapsemble_card_html<\/code>, <code>mapsemble_card_css_urls<\/code> and <code>mapsemble_card_data<\/code> filters.<\/p><\/dd>\n<dt id=\"my%20coordinates%20live%20in%20custom%20fields%20already.%20can%20i%20use%20them%3F\"><h3>My coordinates live in custom fields already. Can I use them?<\/h3><\/dt>\n<dd><p>Yes. Choose the \"Custom fields (latitude\/longitude meta keys)\" location source and name the two meta keys \u2014 that covers Metabox.io, Pods, imported data and hand-rolled meta. An ACF Google Map field has its own named source. For computed cases, the <code>mapsemble_post_coordinates<\/code> filter remains. After switching sources, run \"Reindex locations\" on the map.<\/p><\/dd>\n<dt id=\"is%20the%20map%27s%20interface%20translatable%3F\"><h3>Is the map's interface translatable?<\/h3><\/dt>\n<dd><p>Yes. The widget's interface strings (\"Filters\", \"Search\", \"Sort by\", \u2026) run through the plugin's <code>mapsemble<\/code> text domain, so a <code>.po<\/code> file for your language translates them; English sites send nothing extra. Developers can add or override strings with the <code>mapsemble_widget_translations<\/code> filter.<\/p><\/dd>\n<dt id=\"can%20i%20develop%20against%20a%20local%20site%3F\"><h3>Can I develop against a local site?<\/h3><\/dt>\n<dd><p>A map whose locations live in Mapsemble works on a local site with no extra setup: nothing on the Mapsemble side ever fetches from your server.<\/p>\n\n<p>A map built from this site's content does not, because the Mapsemble service has to reach your feed. Expose the site through a tunnel and define <code>MAPSEMBLE_REMOTE_BASE_URL<\/code> in <code>wp-config.php<\/code>; the plugin then hands Mapsemble that address instead of your local one.<\/p>\n\n<p>Two more constants exist for people running the Mapsemble service itself locally. <code>MAPSEMBLE_APP_BASE<\/code> points the plugin at another Mapsemble host; TLS is still verified against it. <code>MAPSEMBLE_SSL_VERIFY<\/code> set to <code>false<\/code> switches that verification off \u2014 define it only for a local stack whose certificate the WordPress container does not trust, never on a public site.<\/p>\n\n<p>The sample map is the exception: it always loads from app.mapsemble.com whatever <code>MAPSEMBLE_APP_BASE<\/code> says. A stack that publishes its own copy can point it elsewhere with the <code>mapsemble_sample_app_base<\/code> filter.<\/p><\/dd>\n<dt id=\"can%20i%20keep%20the%20credentials%20out%20of%20the%20database%3F\"><h3>Can I keep the credentials out of the database?<\/h3><\/dt>\n<dd><p>Yes \u2014 define <code>MAPSEMBLE_CLIENT_ID<\/code> and <code>MAPSEMBLE_CLIENT_SECRET<\/code> in <code>wp-config.php<\/code> and the settings fields become read-only. One caveat: credentials set that way never pass through the settings form, which is what normally clears the cached access token and plan details. After changing them, delete the <code>mapsemble_token<\/code>, <code>mapsemble_token_failed<\/code>, <code>mapsemble_remote_maps<\/code>, <code>mapsemble_feature_flags<\/code> and <code>mapsemble_backoff<\/code> transients \u2014 from code, <code>\\Mapsemble\\Api\\Client::forget_account_caches()<\/code> drops exactly that set, as the settings form and the connect flow do \u2014 or the plugin keeps answering for the previous account for up to fifteen minutes.<\/p><\/dd>\n<dt id=\"how%20many%20posts%20can%20a%20map%20serve%3F\"><h3>How many posts can a map serve?<\/h3><\/dt>\n<dd><p>The feed is a standard WordPress meta query and is comfortable up to roughly ten thousand geo-tagged posts. Beyond that, use a persistent object cache. The entropy sort option additionally needs MySQL 8 or MariaDB 10.2 for its window function; on older databases it degrades to a stable per-map random order. The filter option pickers group over meta values, capped at ten options per lookup.<\/p><\/dd>\n<dt id=\"what%20are%20the%20public%20endpoints%3F\"><h3>What are the public endpoints?<\/h3><\/dt>\n<dd><p>For site-fed maps only: <code>mapsemble\/v1\/features<\/code> (the GeoJSON feed), <code>mapsemble\/v1\/feature<\/code> (one rendered card) and <code>mapsemble\/v1\/filter\/options<\/code> (values for a mapped filter). All serve published, geo-tagged content that the map's own conditions admit \u2014 a post excluded by an always-on filter answers 404 exactly like a missing one. Maps whose locations live in Mapsemble answer 404 on all three. Responses carry <code>Cache-Control: public, max-age=60<\/code> and an ETag; the cache is refreshed when a served post, its terms, or the map's settings change, and developers can tune or disable it with the <code>mapsemble_feed_cache_ttl<\/code> filter.<\/p><\/dd>\n<dt id=\"the%20map%20preview%20in%20the%20block%20editor%20stays%20blank.%20why%3F\"><h3>The map preview in the block editor stays blank. Why?<\/h3><\/dt>\n<dd><p>The editor shows a chosen map live in a frame served by this site to a request that carries no login cookie \u2014 the block editor isolates itself in Chromium browsers, and the frame's request goes out without cookies. Anything that turns such requests away before WordPress parses them keeps the preview out: a maintenance or \"members only\" plugin that redirects logged-out visitors on <code>init<\/code>, or HTTP basic auth in front of a staging site. The published page is unaffected; the map still renders there.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.5.0<\/h4>\n\n<ul>\n<li>Changed: the Mapsemble location editor opens in a new tab, with the map beside it, instead of in a frame inside the admin. The sign-in token is minted when you click, not when the screen loads.<\/li>\n<li>Added: the block's map picker is searchable \u2014 type part of a name or paste an id. Maps are listed newest first with \"Another map id\u2026\" at the top, and maps that share a name are told apart by their creation date and a short id. The map edit screen's select follows the same order and gains a filter box on long lists.<\/li>\n<li>Added: a chosen map renders live in the block editor, and a \"Change map\" toolbar button picks another.<\/li>\n<li>Added: \"Find an address\" in a post's Map location box looks the address up through Mapsemble and fills in the coordinates, with a link to check the spot on OpenStreetMap.<\/li>\n<li>Added: with one of your maps chosen, the block's Filters panel lists that map's filter slugs; clicking one adds it to the initial filters.<\/li>\n<li>Added: a map built from this site shows how many posts it currently serves, and saving warns about always-on filter terms that do not exist.<\/li>\n<li>Added: Mapsemble \u2192 Maps is searchable and paginated, newest first, with a Created column and All \/ Hosted on Mapsemble \/ Built from this site views. The location editor's heading names the map and links back to the list.<\/li>\n<li>Added: the Built from this site list shows each map's shortcodes with a Copy button, and a shortened map id.<\/li>\n<li>Changed: the Mapsemble menu reads Maps \/ Built from this site \/ Settings. Maps (formerly Map data) lists your account's maps and comes first; the site-fed maps (formerly Maps) are under Built from this site. Links are unchanged.<\/li>\n<li>Changed: new Map blocks insert as Wide, so desktop visitors get the desktop layout; \"None\" is still a choice. Blocks already set to Wide or Full now render that way on the published page; others are unchanged.<\/li>\n<li>Changed: with \"Fill the visible viewport\" off, <code>height<\/code> is the map's exact height, on existing blocks too; with it on, the sidebar calls it \"Minimum height\".<\/li>\n<li>Changed: switching a block's \"Which map\" to \"Select a map\" clears the sample's still from the canvas, which now just asks which map.<\/li>\n<li>Changed: map screens say \"Map saved.\" instead of \"Post published.\", bulk actions count maps, and creating a map on Mapsemble from the edit screen confirms it.<\/li>\n<li>Changed: the Pro plan note appears once, inline; \"Add them on Mapsemble\" links straight to the map's filters or sort panel in the Mapsemble builder.<\/li>\n<li>Changed: on a map's edit screen the manual map id is folded away unless the list is empty, and the meta-key and ACF inputs show only for their location source.<\/li>\n<li>Changed: on Settings, \"Finish connecting\" appears only once the automatic connect gives up, and the uninstall choice has its own Data section.<\/li>\n<li>Fixed: a typo in the location box no longer erases the saved location \u2014 invalid input leaves it untouched and says what is wrong. Comma decimals work, and a pasted \"lat, lng\" pair fills both fields.<\/li>\n<li>Fixed: an unknown or unavailable map no longer leaves a screen-tall blank box \u2014 visitors see the section collapse, and editors get a notice naming the likely cause, on the page and in the block preview.<\/li>\n<li>Fixed: a one-click connect or reconnect ends on the \"Connected to Mapsemble\" notice instead of a silent reload.<\/li>\n<li>Fixed: with <code>MAPSEMBLE_CLIENT_ID<\/code> defined in <code>wp-config.php<\/code>, saving the settings no longer wipes the stored client ID; a save that only changes the uninstall choice keeps the cached token and map list.<\/li>\n<li>Fixed: the \"cannot reach this site\" warning no longer shows when Mapsemble itself runs on your local network; private-network and loopback addresses now count as local.<\/li>\n<li>Fixed: an always-on filter whose only slug is <code>0<\/code> no longer drops out and lets the map serve every post.<\/li>\n<li>Fixed: accessibility \u2014 the location-source radios are a fieldset with a legend, location box errors, filter matches and copied shortcodes are announced, address search keeps focus, and the Maps list's actions column is labelled.<\/li>\n<li>Developer: new REST routes <code>mapsemble\/v1\/geocode<\/code> and <code>mapsemble\/v1\/map-filters<\/code>, for users who can edit posts; the <code>loadErrorText<\/code> widget setting is gone.<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>Added: one-click connect on Mapsemble \u2192 Settings \u2014 Authenticate on Mapsemble, approve in the tab that opens, and the page finishes on its own. A \"Finish connecting\" button covers the no-JavaScript case; pasting a client ID and secret by hand is still available in a collapsed section.<\/li>\n<li>Added: the block defaults to the sample map, so a freshly inserted block always shows a real map. A \"Which map\" choice switches to your own maps, listed by where their data comes from (fed by this site \/ on your Mapsemble account), and the canvas shows a still of the sample map while no map is chosen.<\/li>\n<li>Added: suggested privacy-policy text under Settings \u2192 Privacy \u2192 Policy Guide, naming the configured Mapsemble host.<\/li>\n<li>Added: the block editor's strings are translatable \u2014 the editor script now carries the plugin's translations.<\/li>\n<li>Changed: the sample map is the one shared with the Drupal module and the Framer plugin (id <code>019c09be-4113-7222-95d8-c616d8d7efc1<\/code>) and always loads from app.mapsemble.com, even when <code>MAPSEMBLE_APP_BASE<\/code> points elsewhere. A block or shortcode using <code>sample<\/code> picks the new map up on the next render.<\/li>\n<li>Changed: TLS verification of the Mapsemble service is no longer switched off by <code>MAPSEMBLE_APP_BASE<\/code>. Local stacks whose certificate the container does not trust must now define <code>MAPSEMBLE_SSL_VERIFY<\/code> as <code>false<\/code> \u2014 a DDEV site that relied on the old implicit behaviour will fail to connect until it does.<\/li>\n<li>Changed: the public feed endpoints answer from a 60-second cache with <code>Cache-Control<\/code> and an ETag (a browser revalidating gets a bodiless 304). Saving, trashing or deleting a served post, changing one of its terms, or saving the map configuration refreshes it; logged-in requests bypass it.<\/li>\n<li>Changed: after a 429 from the Mapsemble service the plugin waits as long as <code>Retry-After<\/code> says (at most five minutes) before asking again, instead of retrying on every admin screen.<\/li>\n<li>Changed: site-fed embeds seed the widget with the map's first configured sort, so the card list and the map agree on what comes first.<\/li>\n<li>Fixed: the map list no longer shows a map twice when several configurations bind the same map id, and a picker with no maps to list still offers a typed id.<\/li>\n<li>Fixed: reconnecting from an already connected site works the same as a first connect.<\/li>\n<li>Fixed: uninstalling on a multisite network with more than 100 sites now cleans every site; uninstall also removes the connect state, the backoff marker and the feed cache counters.<\/li>\n<li>Fixed: every \"Read more\" card link has an accessible name that includes the post title; the Map data editor frame sends no referrer.<\/li>\n<li>Developer: <code>mapsemble_map_config_saved<\/code> action (<code>MapConfig $config<\/code>, <code>string $previous_map_id<\/code>) fires after a configuration's meta is written; <code>mapsemble_feed_cache_ttl<\/code> filter tunes or disables the feed cache; <code>mapsemble_sample_app_base<\/code> filter for a self-hosted Mapsemble that publishes its own copy of the sample; <code>MAPSEMBLE_SSL_VERIFY<\/code> constant; <code>Client::forget_account_caches()<\/code> drops every account-derived transient; CI fails when the version is stated inconsistently.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Added: embed any map by its Mapsemble map id \u2014 block picker (account maps, maps on this site, a typed id), <code>[mapsemble map=\"\u2026\"]<\/code>, and <code>mapsemble_embed()<\/code>. A map id bound to a site-fed configuration automatically serves from this site.<\/li>\n<li>Added: a published sample map \u2014 <code>[mapsemble map=\"sample\"]<\/code> \u2014 that renders before any credentials are entered.<\/li>\n<li>Changed: map configurations are source-only; the hosted\/site mode choice is gone. Existing hosted configurations keep working exactly as before (embeds render, feeds keep refusing them) and gain an explicit convert option.<\/li>\n<li>Changed: Mapsemble \u2192 Map data lists your account's maps directly \u2014 hosted locations are editable in-admin for any account map, no configuration post needed. Old links redirect.<\/li>\n<li>Fixed: embedding the same map twice on one page now boots both instances.<\/li>\n<li>Developer: the <code>mapsemble_widget_settings<\/code> filter's second argument is now <code>MapConfig|null<\/code> \u2014 null for embeds of maps this site has no configuration for. Type-hinted callbacks need widening.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Added: always-on filters \u2014 per-map taxonomy\/custom-field conditions, so two maps on one post type can differ.<\/li>\n<li>Added: visitor filter mappings and the <code>mapsemble\/v1\/filter\/options<\/code> endpoint \u2014 the map's filter widgets now narrow the served posts.<\/li>\n<li>Added: sort mappings, including entropy ordering for an even geographic spread (MySQL 8\/MariaDB 10.2, with a stable random fallback).<\/li>\n<li>Added: marker style properties \u2014 taxonomy terms and custom-field values on every feature, remaining dots included, for Mapsemble style rules.<\/li>\n<li>Added: a generic custom-fields location source \u2014 name a latitude and longitude meta key, no PHP filter needed.<\/li>\n<li>Added: the widget's interface strings are translatable through the plugin text domain.<\/li>\n<li>Added: embeds pass a fresh backend endpoint each render (stale data-source URLs heal without a re-save), and new <code>fill_viewport<\/code> and <code>filters<\/code> options on the block, shortcode and template functions.<\/li>\n<li>Improved: creating a map on Mapsemble is an inline form instead of a browser prompt; the map screen opens with a \"How this works\" explainer.<\/li>\n<li>Improved: a Settings link on the Plugins row, and a dismissible pointer to the settings screen until credentials are entered.<\/li>\n<li>Improved: save notices are tied to the map that produced them and can no longer be consumed by another admin page.<\/li>\n<li>Fixed: the loading placeholder resolves to an error message when the map widget cannot be loaded, instead of spinning forever.<\/li>\n<li>Developer: refreshed translation template, guarded by CI against drifting again.<\/li>\n<\/ul>\n\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>Fixed: maps whose locations live in Mapsemble now show their cards \u2014 the embed no longer installs a card renderer that only site-fed maps can use.<\/li>\n<li>Fixed: the Map data screen answers a real 404 for maps that are not edited there.<\/li>\n<li>Fixed: a failed connection names the fix \u2014 bad credentials point at the client ID and secret, an unreachable service points at the connection \u2014 and failed sign-ins are not retried for a minute.<\/li>\n<li>Fixed: saving the settings shows a confirmation notice, and saving a map shows every applicable warning instead of only the first.<\/li>\n<li>Fixed: the uninstall option describes what is always deleted, not only the opt-in part.<\/li>\n<li>Fixed: capabilities granted to your own roles survive deactivating and reactivating the plugin.<\/li>\n<li>Fixed: an unreadable map extent is ignored instead of hiding every location.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial development version.<\/li>\n<\/ul>","raw_excerpt":"Embed any Mapsemble map \u2014 including a no-account sample \u2014 or build maps from your own WordPress content.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/388926","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=388926"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/mapsemble"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=388926"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=388926"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=388926"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=388926"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=388926"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=388926"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}