{"id":386935,"date":"2026-10-14T08:14:22","date_gmt":"2026-10-14T08:14:22","guid":{"rendered":"https:\/\/ru.wordpress.org\/plugins\/office-map-openstreetmap-map-without-api-key\/"},"modified":"2026-10-14T14:25:02","modified_gmt":"2026-10-14T14:25:02","slug":"prodev17-location-map","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/prodev17-location-map\/","author":23585961,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.9.1","stable_tag":"1.9.1","tested":"7.1.3","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"PD17 Map","header_author":"prodev17","header_description":"Interactive vector maps with OpenStreetMap and MapLibre GL \u2014 no API keys, no ads, no tracking. Shortcode, widget and a visual style editor, with ready-made look presets and 17 stylable layers.","assets_banners_color":"437ac7","last_updated":"2026-10-14 14:25:02","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/prodev17-location-map\/","header_author_uri":"https:\/\/profiles.wordpress.org\/prodev17\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":51,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.9.0":{"tag":"1.9.0","author":"prodev17","date":"2026-10-14 08:13:47","revision":3745673},"1.9.1":{"tag":"1.9.1","author":"prodev17","date":"2026-10-14 14:25:02","revision":3746590}},"upgrade_notice":{"1.9.1":"<p>Renamed to &quot;PD17 Map&quot;. The slug and text domain are unchanged. No action required.<\/p>","1.9.0":"<p>Renamed to &quot;PD17 Map&quot;, MapLibre GL JS is bundled locally, and the on-map search is off by default. No action is required.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3745673,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3745673,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3745815,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3745815,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.9.0","1.9.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3745870,"resolution":"1","location":"assets","locale":"","width":960,"height":827},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3745870,"resolution":"2","location":"assets","locale":"","width":967,"height":548},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3745870,"resolution":"3","location":"assets","locale":"","width":807,"height":659},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3746587,"resolution":"4","location":"assets","locale":"","width":803,"height":521}},"screenshots":{"1":"Main address settings: coordinates, marker and popup.","2":"Collapsible settings blocks: additional markers, size and zoom, appearance, map styling and behaviour.","3":"Live map preview on the settings page.","4":"Import and export of settings as JSON, plus how to place the map on a page."}},"plugin_section":[],"plugin_tags":[2215,2909,204827,2660,16164],"plugin_category":[49],"plugin_contributors":[286681],"plugin_business_model":[],"class_list":["post-386935","plugin","type-plugin","status-publish","hentry","plugin_tags-location","plugin_tags-map","plugin_tags-maplibre","plugin_tags-maps","plugin_tags-openstreetmap","plugin_category-maps-and-location","plugin_contributors-prodev17","plugin_committers-prodev17"],"banners":{"banner":"https:\/\/ps.w.org\/prodev17-location-map\/assets\/banner-772x250.png?rev=3745815","banner_2x":"https:\/\/ps.w.org\/prodev17-location-map\/assets\/banner-1544x500.png?rev=3745815","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/prodev17-location-map\/assets\/icon-128x128.png?rev=3745673","icon_2x":"https:\/\/ps.w.org\/prodev17-location-map\/assets\/icon-256x256.png?rev=3745673","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/prodev17-location-map\/assets\/screenshot-1.png?rev=3745870","caption":"Main address settings: coordinates, marker and popup."},{"src":"https:\/\/ps.w.org\/prodev17-location-map\/assets\/screenshot-2.png?rev=3745870","caption":"Collapsible settings blocks: additional markers, size and zoom, appearance, map styling and behaviour."},{"src":"https:\/\/ps.w.org\/prodev17-location-map\/assets\/screenshot-3.png?rev=3745870","caption":"Live map preview on the settings page."},{"src":"https:\/\/ps.w.org\/prodev17-location-map\/assets\/screenshot-4.png?rev=3746587","caption":"Import and export of settings as JSON, plus how to place the map on a page."}],"raw_content":"<!--section=description-->\n<p><strong>PD17 Map<\/strong> adds a fast, modern <strong>vector<\/strong> map to your site using <strong>MapLibre GL JS<\/strong> and open <strong>OpenStreetMap<\/strong> data. No Google or Yandex account, no API keys, no ads, no tracking.<\/p>\n\n<p>It is perfect for an office or contact page, or for several locations. Drop the <code>[office_map]<\/code> shortcode anywhere, or add the widget to a sidebar.<\/p>\n\n<h4>Why it stands out<\/h4>\n\n<ul>\n<li><strong>Vector maps (MapLibre GL JS).<\/strong> Crisp at any zoom with smooth panning and rotation \u2014 the feel of commercial maps, at zero cost.<\/li>\n<li><strong>Truly key-free.<\/strong> No credit card, no quota and no \"invalid API key\" failures.<\/li>\n<li><strong>Privacy-friendly by default.<\/strong> The map loads without accounts or analytics, and the optional address search can be turned off completely.<\/li>\n<li><strong>Fine-grained styling.<\/strong> Recolor 17 layer categories (roads, water, parks, buildings, labels, POI and more) and hide anything you don't need.<\/li>\n<li><strong>One-click look presets<\/strong> \u2014 a bright detailed palette and a warm muted palette.<\/li>\n<li><strong>Multilingual labels<\/strong> (Russian, English, Belarusian, German, Polish and more).<\/li>\n<\/ul>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><code>[office_map]<\/code> shortcode and a widget.<\/li>\n<li>Visual settings page with a live preview.<\/li>\n<li>Multiple markers, each with its own icon, color and rich popup.<\/li>\n<li>Optional on-map address search with server-side rate limiting and one-day caching.<\/li>\n<li>Width presets (\"block\", \"full width\", custom in % or px), fixed zoom or auto-fit to all markers.<\/li>\n<li>Fullscreen button, mouse-wheel zoom toggle and custom marker images.<\/li>\n<li>Import \/ export of all settings as JSON, to move a configuration between sites.<\/li>\n<li>Graceful fallback: if the tile server is unreachable, the office title and address are still shown.<\/li>\n<\/ul>\n\n<h4>Shortcode<\/h4>\n\n<p>The simplest form uses the settings from the plugin page:<\/p>\n\n<pre><code>[office_map]\n<\/code><\/pre>\n\n<p>You can override individual options:<\/p>\n\n<pre><code>[office_map lat=\"53.9006\" lng=\"27.5590\" zoom=\"16\" height=\"420\" title=\"Our office\" style=\"liberty\"]\n<\/code><\/pre>\n\n<h4>External services<\/h4>\n\n<p>This plugin connects to external services only when a feature that needs them is used. The map is loaded whenever it is displayed; the address search is <strong>off by default<\/strong> and is used only when you enable it (or when you use the address search on the settings page).<\/p>\n\n<ul>\n<li><strong>OpenFreeMap<\/strong> (<code>tiles.openfreemap.org<\/code>) \u2014 vector map tiles, styles, fonts and icons built from OpenStreetMap data. Loaded every time a map is displayed. No account, no API key and no cookies are used. Data sent: only the standard tile\/style requests for the map area being viewed. Privacy policy: <a href=\"https:\/\/openfreemap.org\/privacy\/\">https:\/\/openfreemap.org\/privacy\/<\/a>. Project: <a href=\"https:\/\/openfreemap.org\/\">https:\/\/openfreemap.org\/<\/a>.<\/li>\n<li><strong>Nominatim<\/strong> (<code>nominatim.openstreetmap.org<\/code>) \u2014 OpenStreetMap geocoding, used <strong>only<\/strong> for the address search. Data sent: the text you type, plus the site URL and the site administrator's email in the <code>User-Agent<\/code> header, as required by the service's usage policy. Requests are limited to one per second and cached for one day. Usage policy (terms of use): <a href=\"https:\/\/operations.osmfoundation.org\/policies\/nominatim\/\">https:\/\/operations.osmfoundation.org\/policies\/nominatim\/<\/a>. Privacy policy: <a href=\"https:\/\/osmfoundation.org\/wiki\/Privacy_Policy\">https:\/\/osmfoundation.org\/wiki\/Privacy_Policy<\/a>.<\/li>\n<\/ul>\n\n<p>Map data \u00a9 OpenStreetMap contributors, available under the ODbL: <a href=\"https:\/\/www.openstreetmap.org\/copyright\">https:\/\/www.openstreetmap.org\/copyright<\/a>. The map attribution is required by that license and must not be removed.<\/p>\n\n<h4>Privacy<\/h4>\n\n<ul>\n<li>The map tiles are loaded from OpenFreeMap without cookies or tracking.<\/li>\n<li>The address search is disabled by default. When you enable it, the text you type is sent (through your own server) to OpenStreetMap Nominatim; requests are rate-limited and cached. Nothing else is sent.<\/li>\n<li>No data is collected or stored by the plugin author; the plugin does not create accounts and does not track users.<\/li>\n<\/ul>\n\n<h3>Source code<\/h3>\n\n<p>All source is shipped with the plugin: the PHP, JavaScript and CSS are readable and unminified, and no build step is required to run it. The bundled MapLibre GL JS library keeps its own 3-Clause BSD license and attribution in <code>assets\/vendor\/maplibre-gl\/<\/code>.<\/p>\n\n<p>Development happens at <a href=\"https:\/\/github.com\/pro-d-e-v\/pd17-location-map\">https:\/\/github.com\/pro-d-e-v\/pd17-location-map<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install the plugin from the WordPress plugin directory, or upload the <code>prodev17-location-map<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the \"Plugins\" screen.<\/li>\n<li>Open <strong>PD17 Map<\/strong> in the admin menu and set your coordinates and address.<\/li>\n<li>Add the <code>[office_map]<\/code> shortcode to the page with your office, or use the \"PD17 Map\" widget.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20google%20maps%20api%20key%3F\"><h3>Do I need a Google Maps API key?<\/h3><\/dt>\n<dd><p>No. PD17 Map does not use Google or Yandex at all. It renders OpenStreetMap data with MapLibre GL JS, so there is no API key, no billing account and no usage quota.<\/p><\/dd>\n<dt id=\"how%20do%20i%20add%20a%20map%20to%20a%20page%3F\"><h3>How do I add a map to a page?<\/h3><\/dt>\n<dd><p>Add the <code>[office_map]<\/code> shortcode (a Shortcode block in the block editor, or the classic editor), or place the \"PD17 Map\" widget in a sidebar. The map uses the settings from the plugin page, and you can override individual options directly in the shortcode.<\/p><\/dd>\n<dt id=\"can%20i%20use%20it%20as%20a%20contact%20or%20office%20map%3F\"><h3>Can I use it as a contact or office map?<\/h3><\/dt>\n<dd><p>Yes, this is the main use case. Set the coordinates and the address once and drop the map on your contact page, in the footer or in a sidebar.<\/p><\/dd>\n<dt id=\"can%20i%20show%20several%20locations%20on%20one%20map%3F\"><h3>Can I show several locations on one map?<\/h3><\/dt>\n<dd><p>Yes. Add several markers, each with its own icon, color and popup, and let the map fit all of them automatically, or set a fixed zoom.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20colors%20and%20hide%20map%20layers%3F\"><h3>Can I change the colors and hide map layers?<\/h3><\/dt>\n<dd><p>Yes. The visual style editor lets you recolor 17 layer categories (roads, water, parks, buildings, labels, POI and more) and hide anything you do not need, plus ready-made look presets.<\/p><\/dd>\n<dt id=\"does%20it%20work%20without%20cookies%20or%20tracking%3F\"><h3>Does it work without cookies or tracking?<\/h3><\/dt>\n<dd><p>Yes. The map is loaded without accounts, cookies or analytics, which makes it a good fit for privacy-focused and GDPR-sensitive sites.<\/p><\/dd>\n<dt id=\"can%20i%20use%20it%20without%20the%20address%20search%3F\"><h3>Can I use it without the address search?<\/h3><\/dt>\n<dd><p>Yes. The search is off by default; the map works fully without it, and no request is made to any geocoder.<\/p><\/dd>\n<dt id=\"can%20i%20show%20several%20maps%20on%20one%20page%3F\"><h3>Can I show several maps on one page?<\/h3><\/dt>\n<dd><p>Yes. Each map gets a unique identifier and works independently.<\/p><\/dd>\n<dt id=\"is%20attribution%20required%3F\"><h3>Is attribution required?<\/h3><\/dt>\n<dd><p>Yes. Attribution for OpenStreetMap and OpenFreeMap is added automatically and must not be removed.<\/p><\/dd>\n<dt id=\"where%20do%20the%20map%20tiles%20come%20from%3F\"><h3>Where do the map tiles come from?<\/h3><\/dt>\n<dd><p>From OpenFreeMap, which serves OpenStreetMap-based vector tiles. No OpenStreetMap editing or hosting account is required.<\/p><\/dd>\n<dt id=\"is%20the%20plugin%20translated%3F\"><h3>Is the plugin translated?<\/h3><\/dt>\n<dd><p>The plugin is translation-ready (English is the source language) and is translated on translate.wordpress.org.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.9.1<\/h4>\n\n<ul>\n<li>Renamed the plugin to \"PD17 Map\". The slug and text domain are unchanged (<code>prodev17-location-map<\/code>), so no action is required.<\/li>\n<li>Refreshed the directory banner.<\/li>\n<\/ul>\n\n<h4>1.9.0<\/h4>\n\n<ul>\n<li>Renamed the plugin to \"PD17 Map\"; the text domain is now <code>prodev17-location-map<\/code>.<\/li>\n<li>English is now the source language; all user-facing strings are translatable.<\/li>\n<li>MapLibre GL JS is now bundled locally (5.24.0) \u2014 no code is loaded from a third-party CDN.<\/li>\n<li>The on-map address search is off by default and is clearly documented as an external service.<\/li>\n<li>The address search now uses OpenStreetMap Nominatim only (the Photon fallback was removed).<\/li>\n<li>Geocoder requests use a proper User-Agent with a contact address, are rate-limited and cached.<\/li>\n<li>Added <code>uninstall.php<\/code> to clean up options and transients on deletion.<\/li>\n<li>Modernized the plugin headers; requires WordPress 6.0 and PHP 7.4.<\/li>\n<li>Added a <code>languages\/*.pot<\/code> template for translators (translation files are served by translate.wordpress.org).<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>The open\/closed state of the settings blocks is saved with the settings. Only the first block is open by default; open the ones you need and press \"Save\" \u2014 they stay open after reload.<\/li>\n<\/ul>\n\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>The \"Zoom\" field is shown only in \"Fixed zoom\" mode; it is hidden in \"Fit all markers\" mode.<\/li>\n<li>Marker protection: a snapshot of the last state with markers is kept and a \"Restore markers\" button appears if the markers are lost.<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>Import and export of settings as JSON: move the address, markers, colors and all styling to another site (images are exported as URLs).<\/li>\n<li>On-map search field styling: the field and the button are now on one line.<\/li>\n<li>A new \"Search on the map\" subsection in \"Map styling\": background, text, border, button background\/text and corner radius.<\/li>\n<\/ul>\n\n<h4>1.6.3<\/h4>\n\n<ul>\n<li>Settings blocks reordered logically: \"Main address\" (coordinates and search), then \"Additional markers\", \"Size and zoom\", \"Appearance\", \"Map styling\", \"Behaviour\".<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>Protection against losing settings: an empty or broken form submission no longer overwrites the saved data (coordinates, points, styles).<\/li>\n<li>A backup of the previous settings is created before each save.<\/li>\n<li>Added a \"Roll back the previous settings\" button on the settings page.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>New \"Map styling\" section: color and opacity for 17 layer categories (land, water, rivers, parks, forest, sand, ice, buildings, roads, road casings, highways, highway casings, rail, borders, labels, label halo, POI icons).<\/li>\n<li>Layer visibility: hide POI, buildings (2D), 3D buildings, terrain, borders, rail and transit, all labels; terrain opacity.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Each additional marker can have its own icon (media library) and its own color.<\/li>\n<li>The additional-marker address became a textarea with HTML support, like the main one.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>New: map language selection \u2014 feature labels (from OpenMapTiles <code>name:xx<\/code> fields) and the geocoder response language.<\/li>\n<li>Compact settings page: latitude\/longitude and other fields in rows; width \"Value\/Unit\" visible only for the \"Custom\" preset.<\/li>\n<li>Settings sections can be collapsed (state remembered).<\/li>\n<li>\"Copy shortcode with current settings\" button.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Map width setting: \"Block\" and \"Full width\" presets, plus a custom width in % or px.<\/li>\n<li>Address search: OpenStreetMap-based geocoder on the settings page and on the map itself.<\/li>\n<li>Several markers with popups and a \"Fit all markers\" zoom mode.<\/li>\n<li>A \"Fullscreen\" button for the map.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Upload a custom marker image through the WordPress media library.<\/li>\n<li>Live preview: the map updates automatically as fields change.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Beautiful vector maps with OpenStreetMap and MapLibre GL \u2014 no API keys, no ads, no tracking. Shortcode, widget and a visual style editor.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/386935","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=386935"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/prodev17"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=386935"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=386935"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=386935"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=386935"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=386935"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=386935"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}