{"id":403670,"date":"2026-11-13T06:08:22","date_gmt":"2026-11-13T06:08:22","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/softicon-store-locator\/"},"modified":"2026-11-13T09:53:18","modified_gmt":"2026-11-13T09:53:18","slug":"softicon-store-locator","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/softicon-store-locator\/","author":23588681,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.1.4","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"SoftIcon Store Locator \u2013 Store Finder Map, No API Key","header_author":"softiconai","header_description":"A store locator block with an OpenStreetMap map. Visitors find the nearest store by town, postcode or their location. No Google Maps API key.","last_updated":"2026-11-13 09:53:18","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/profiles.wordpress.org\/softiconai\/","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":{"1.0.0":{"tag":"1.0.0","author":"softiconai","date":"2026-11-13 06:07:56","revision":3799747},"1.0.1":{"tag":"1.0.1","author":"softiconai","date":"2026-11-13 09:53:18","revision":3800144}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3799747,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3799747,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3799747,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3799747,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"softicon\/store-locator":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"softicon\/store-locator","version":"1.0.1","title":"Store Locator","category":"widgets","description":"A list of your stores with a map. Visitors find the nearest one by town, postcode or their location. No Google Maps API key.","keywords":["store locator","store finder","dealer","map","location","branch","openstreetmap"],"textdomain":"softicon-store-locator","attributes":{"stores":{"type":"array","default":[]},"loadOnClick":{"type":"boolean","default":false},"tileUrl":{"type":"string","default":""},"tileCredit":{"type":"string","default":""},"search":{"type":"boolean","default":true},"geocodeSearch":{"type":"boolean","default":true},"nearMe":{"type":"boolean","default":true},"units":{"type":"string","enum":["km","mi"],"default":"km"},"radius":{"type":"number","default":0},"directions":{"type":"string","enum":["google","apple","osm",""],"default":"google"},"layout":{"type":"string","enum":["left","right","below","map"],"default":"left"},"mapHeight":{"type":"number","default":480},"zoom":{"type":"number","default":0},"markerImageUrl":{"type":"string","default":""},"markerImageId":{"type":"number","default":0},"markerColor":{"type":"string","default":""},"clusterColor":{"type":"string","default":""},"buttonBg":{"type":"string","default":""},"buttonColor":{"type":"string","default":""}},"supports":{"html":false,"align":["wide","full"],"color":{"background":true,"text":true,"link":true},"typography":{"fontSize":true}},"example":{"attributes":{"stores":[{"id":"s1","name":"Riverside Store","address":"12 Market Street","city":"Bristol","postcode":"BS1 1JQ","country":"United Kingdom","phone":"+44 117 000 0000","lat":51.4545,"lng":-2.5879},{"id":"s2","name":"Old Town Store","address":"4 High Street","city":"Bath","postcode":"BA1 5AW","country":"United Kingdom","phone":"+44 1225 000 000","lat":51.3811,"lng":-2.359}]}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css","viewScript":"file:.\/view.js","render":"file:.\/render.php"}},"tagged_versions":["1.0.0","1.0.1"],"block_files":["\/tags\/1.0.1\/build\/index.js","\/tags\/1.0.1\/build\/index.css","\/tags\/1.0.1\/build\/style-index.css","\/tags\/1.0.1\/src\/index.js","\/tags\/1.0.1\/src\/index.css","\/tags\/1.0.1\/src\/style-index.css"],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3799747,"resolution":"1","location":"assets","locale":"","width":1348,"height":639},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3799747,"resolution":"2","location":"assets","locale":"","width":1348,"height":668},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3799747,"resolution":"3","location":"assets","locale":"","width":1440,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3799747,"resolution":"4","location":"assets","locale":"","width":1440,"height":900},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3799747,"resolution":"5","location":"assets","locale":"","width":1440,"height":900},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3799747,"resolution":"6","location":"assets","locale":"","width":780,"height":1688}},"screenshots":{"1":"The store locator on a page: search, map and store list side by side.","2":"Searching a town: the stores sorted by distance, with the place on the map.","3":"Editing a store in the block: find the address on the map and drag the pin.","4":"Importing stores from a CSV file, with the columns matched for you.","5":"Layout, colors and your own marker.","6":"On a phone: the search, the map and the list below it."}},"plugin_section":[172757],"plugin_tags":[1220,14959,2909,6105,6102],"plugin_category":[49],"plugin_contributors":[287127],"plugin_business_model":[],"class_list":["post-403670","plugin","type-plugin","status-publish","hentry","plugin_section-block","plugin_tags-block","plugin_tags-dealer-locator","plugin_tags-map","plugin_tags-store-finder","plugin_tags-store-locator","plugin_category-maps-and-location","plugin_contributors-softiconai","plugin_committers-softiconai"],"banners":{"banner":"https:\/\/ps.w.org\/softicon-store-locator\/assets\/banner-772x250.png?rev=3799747","banner_2x":"https:\/\/ps.w.org\/softicon-store-locator\/assets\/banner-1544x500.png?rev=3799747","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/softicon-store-locator\/assets\/icon-128x128.png?rev=3799747","icon_2x":"https:\/\/ps.w.org\/softicon-store-locator\/assets\/icon-256x256.png?rev=3799747","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/softicon-store-locator\/assets\/screenshot-1.png?rev=3799747","caption":"The store locator on a page: search, map and store list side by side."},{"src":"https:\/\/ps.w.org\/softicon-store-locator\/assets\/screenshot-2.png?rev=3799747","caption":"Searching a town: the stores sorted by distance, with the place on the map."},{"src":"https:\/\/ps.w.org\/softicon-store-locator\/assets\/screenshot-3.png?rev=3799747","caption":"Editing a store in the block: find the address on the map and drag the pin."},{"src":"https:\/\/ps.w.org\/softicon-store-locator\/assets\/screenshot-4.png?rev=3799747","caption":"Importing stores from a CSV file, with the columns matched for you."},{"src":"https:\/\/ps.w.org\/softicon-store-locator\/assets\/screenshot-5.png?rev=3799747","caption":"Layout, colors and your own marker."},{"src":"https:\/\/ps.w.org\/softicon-store-locator\/assets\/screenshot-6.png?rev=3799747","caption":"On a phone: the search, the map and the list below it."}],"raw_content":"<!--section=description-->\n<p><strong>SoftIcon Store Locator<\/strong> adds a <strong>Store Locator<\/strong> block to the block editor. Add your shops, branches or dealers right in the block, or import them from a CSV file, and the page shows them as a list with a map. Visitors type their town or postcode, or press <strong>Near me<\/strong>, and see the nearest stores first.<\/p>\n\n<p>https:\/\/www.youtube.com\/watch?v=KFmGVqEHBQo<\/p>\n\n<p><strong>New to it?<\/strong> Watch <a href=\"https:\/\/www.youtube.com\/watch?v=yX8TMUX9QKg\">Every setting, explained<\/a>, a 2-minute video tutorial.<\/p>\n\n<ul>\n<li><strong>No Google Maps API key, no billing<\/strong> \u2013 the map uses OpenStreetMap. Nothing to sign up for, no key that stops working.<\/li>\n<li><strong>Build it in the editor<\/strong> \u2013 the block shows the real map and list while you edit. Add a store, press <strong>Find on map<\/strong>, and drag the pin to the exact spot.<\/li>\n<li><strong>Free CSV import and export<\/strong> \u2013 bring hundreds of stores from Excel or Google Sheets at once. Columns are matched for you, and stores without coordinates are placed on the map with one click.<\/li>\n<li><strong>Find the nearest store<\/strong> \u2013 visitors search by town, postcode or store name. Stores in your list are matched instantly; any other place is looked up and the stores are sorted by distance, in kilometres or miles, within the radius they choose.<\/li>\n<li><strong>Near me<\/strong> \u2013 the visitor's location, given by their browser, sorts the stores by distance. It never leaves the browser.<\/li>\n<li><strong>Directions<\/strong> \u2013 a link under each store opens the route in Google Maps, Apple Maps or OpenStreetMap.<\/li>\n<li><strong>Privacy friendly<\/strong> \u2013 optional \"load the map on click\": nothing is loaded from the map server before the visitor asks for it. No cookies, no tracking.<\/li>\n<li><strong>Works without JavaScript<\/strong> \u2013 the store list is real HTML with addresses, phone numbers and links, so search engines can read it and every visitor can see it.<\/li>\n<li><strong>Fast<\/strong> \u2013 the map's code loads only on pages with the block, only when the block comes near the screen.<\/li>\n<li><strong>Your layout and colors<\/strong> \u2013 list left, right or below the map, or the map only; the map height; the starting zoom; marker, marker group and button colors; your own marker picture; and the background, text and link colors and text size from the block editor.<\/li>\n<li><strong>Clusters<\/strong> \u2013 stores close together are grouped into one numbered marker until visitors zoom in.<\/li>\n<li><strong>Phone friendly<\/strong> \u2013 on phones the list goes under the map and the search field never makes the page zoom.<\/li>\n<\/ul>\n\n<h4>Privacy<\/h4>\n\n<p>The plugin sets no cookies and stores nothing about visitors. Your stores are saved in the block, inside your post. The map and the place search use OpenStreetMap services, described under <strong>External services<\/strong> below. With <strong>Load the map on click<\/strong> turned on, visitors see a short note and a <strong>Show map<\/strong> button first, and nothing is loaded from the map server before they press it. <strong>Near me<\/strong> uses the location the visitor's browser gives; it is used only in the browser and is never sent anywhere.<\/p>\n\n<h4>External services<\/h4>\n\n<p>This plugin connects to these outside services. It sends nothing else, and nothing at all when a page has no Store Locator block.<\/p>\n\n<p><strong>OpenStreetMap map tiles<\/strong> (tile.openstreetmap.org), run by the OpenStreetMap Foundation.\nThe map is made of small images (tiles) that the visitor's browser loads from this server when a page shows the map, and in the block editor. The server receives the visitor's IP address, their browser's user agent and the address of the page (the Referer), as for any image from another website. With <strong>Load the map on click<\/strong>, this happens only after the visitor presses <strong>Show map<\/strong>. You can set another tile server in the block's Map settings.\nTile usage policy: https:\/\/operations.osmfoundation.org\/policies\/tiles\/ \u2013 Terms of use: https:\/\/osmfoundation.org\/wiki\/Terms_of_Use \u2013 Privacy policy: https:\/\/osmfoundation.org\/wiki\/Privacy_Policy<\/p>\n\n<p><strong>Nominatim place search<\/strong> (nominatim.openstreetmap.org), run by the OpenStreetMap Foundation.\nIt turns an address into a place on the map. It is asked only when a person presses a button, at most once a second:\n* in the block editor, when you press <strong>Find on map<\/strong> or <strong>Find the places of \u2026 stores<\/strong>: the store's address (street, postcode, town, country) is sent;\n* on the page, when a visitor presses <strong>Search<\/strong> and nothing in your store list matches: the text they typed, the language of the page and the area of your stores are sent. Turn this off with <strong>Look up other places<\/strong> in the block's Search settings.\nThe service receives the IP address of the person's browser, as with any request.\nUsage policy: https:\/\/operations.osmfoundation.org\/policies\/nominatim\/ \u2013 Terms of use: https:\/\/osmfoundation.org\/wiki\/Terms_of_Use \u2013 Privacy policy: https:\/\/osmfoundation.org\/wiki\/Privacy_Policy<\/p>\n\n<p><strong>Directions links<\/strong> to Google Maps (google.com\/maps), Apple Maps (maps.apple.com) or OpenStreetMap (openstreetmap.org) are plain links. Nothing is sent to these services unless the visitor clicks a link, which opens that service's own website or app with the store's coordinates. Google's privacy policy: https:\/\/policies.google.com\/privacy \u2013 Apple's: https:\/\/www.apple.com\/legal\/privacy\/ \u2013 OpenStreetMap's: https:\/\/osmfoundation.org\/wiki\/Privacy_Policy<\/p>\n\n<h4>Third-party libraries<\/h4>\n\n<ul>\n<li>Leaflet 1.9.4 (npm package leaflet) by Volodymyr Agafonkin and contributors \u2013 <a href=\"https:\/\/leafletjs.com\/\">leafletjs.com<\/a> \/ <a href=\"https:\/\/github.com\/Leaflet\/Leaflet\">github.com\/Leaflet\/Leaflet<\/a> \u2013 BSD 2-Clause License. Bundled in build\/leaflet.js and build\/style-index.css; license in build\/leaflet-LICENSE.txt.<\/li>\n<li>Leaflet.markercluster 1.5.3 (npm package leaflet.markercluster) by Dave Leaver and contributors \u2013 <a href=\"https:\/\/github.com\/Leaflet\/Leaflet.markercluster\">github.com\/Leaflet\/Leaflet.markercluster<\/a> \u2013 MIT License. Bundled in build\/leaflet.markercluster.js and build\/style-index.css; license in build\/leaflet.markercluster-LICENSE.txt.<\/li>\n<li>Papa Parse 5.7.0 (npm package papaparse) by Matthew Holt \u2013 <a href=\"https:\/\/www.papaparse.com\/\">papaparse.com<\/a> \/ <a href=\"https:\/\/github.com\/mholt\/PapaParse\">github.com\/mholt\/PapaParse<\/a> \u2013 MIT License. Bundled in build\/papaparse.js, used only in the block editor to read CSV files; license in build\/papaparse-LICENSE.txt.<\/li>\n<\/ul>\n\n<p>The unminified source of this plugin is in the src folder, with package.json and webpack.config.js. Build it with <code>npm install<\/code> and <code>npm run build<\/code>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install the plugin from Plugins \u2192 Add New, or upload the zip.<\/li>\n<li>Activate it.<\/li>\n<li>In the block editor, add the <strong>Store Locator<\/strong> block.<\/li>\n<li>Press <strong>Add store<\/strong>, or <strong>Import CSV<\/strong> to bring many stores at once.<\/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. The map uses OpenStreetMap, which needs no key and no account.<\/p><\/dd>\n<dt id=\"is%20there%20a%20video%20tutorial%3F\"><h3>Is there a video tutorial?<\/h3><\/dt>\n<dd><p>Yes: <a href=\"https:\/\/www.youtube.com\/watch?v=yX8TMUX9QKg\">Every setting, explained<\/a> (2:06). Jump to a part:<\/p>\n\n<ul>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=yX8TMUX9QKg&amp;t=13s\">Add a store and find it on the map<\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=yX8TMUX9QKg&amp;t=27s\">Import and export CSV<\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=yX8TMUX9QKg&amp;t=45s\">Search box, Near me, distance and radius<\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=yX8TMUX9QKg&amp;t=67s\">Directions, layout, map height and colors<\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=yX8TMUX9QKg&amp;t=90s\">Load the map on click, starting zoom and tile server<\/a><\/li>\n<\/ul>\n\n<p>The empty block, the CSV import and the Help panel in the block's settings link to it too.<\/p><\/dd>\n<dt id=\"where%20do%20i%20add%20my%20stores%3F\"><h3>Where do I add my stores?<\/h3><\/dt>\n<dd><p>In the block itself. Select the block and open the <strong>Stores<\/strong> panel in the sidebar: add a store, fill in its address, and press <strong>Find on map<\/strong>. You can also click on the map to place a store, or drag its orange pin.<\/p><\/dd>\n<dt id=\"how%20should%20my%20csv%20file%20look%3F\"><h3>How should my CSV file look?<\/h3><\/dt>\n<dd><p>One store per row, with the column names in the first row. The block recognises common names such as name, address, city, postcode (or zip), country, phone, email, website, hours, lat (or latitude) and lng (or lon, longitude), and you can match any other column yourself. Commas or semicolons both work. Save the sheet as \"CSV UTF-8\" so accents stay right. If the file has no coordinates, press <strong>Find the places of \u2026 stores<\/strong> after the import. <a href=\"https:\/\/www.youtube.com\/watch?v=yX8TMUX9QKg&amp;t=27s\">See an import in the video<\/a>.<\/p><\/dd>\n<dt id=\"a%20store%27s%20pin%20is%20in%20the%20wrong%20place\"><h3>A store's pin is in the wrong place<\/h3><\/dt>\n<dd><p>Place search is free but not perfect, especially for new streets or some countries. Open the store and drag its orange pin to the right spot, or type the latitude and longitude. Stores found without their postcode are marked in the list so you can check them. <a href=\"https:\/\/www.youtube.com\/watch?v=yX8TMUX9QKg&amp;t=13s\">See it in the video<\/a>.<\/p><\/dd>\n<dt id=\"how%20many%20stores%20can%20one%20block%20hold%3F\"><h3>How many stores can one block hold?<\/h3><\/dt>\n<dd><p>Up to 500. For more, add a second Store Locator block, for example one per country.<\/p><\/dd>\n<dt id=\"is%20it%20gdpr%20friendly%3F\"><h3>Is it GDPR friendly?<\/h3><\/dt>\n<dd><p>It sets no cookies and tracks nothing. Turn on <strong>Load the map on click<\/strong> in the Map settings so nothing is loaded from OpenStreetMap until the visitor asks, and mention OpenStreetMap in your privacy policy. You can also turn off the place search for visitors. <a href=\"https:\/\/www.youtube.com\/watch?v=yX8TMUX9QKg&amp;t=90s\">See it in the video<\/a>.<\/p><\/dd>\n<dt id=\"my%20site%20has%20a%20lot%20of%20visitors\"><h3>My site has a lot of visitors<\/h3><\/dt>\n<dd><p>OpenStreetMap's own tile server is meant for light use. For a busy site, set the address of another tile server in the block's Map settings (many providers offer free plans), with the credit they ask for.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20caching%20and%20optimization%20plugins%3F\"><h3>Does it work with caching and optimization plugins?<\/h3><\/dt>\n<dd><p>Yes. The block uses no AJAX calls, and it finds its own files even when an optimization plugin combines or moves its scripts.<\/p><\/dd>\n<dt id=\"can%20i%20use%20my%20own%20marker%3F\"><h3>Can I use my own marker?<\/h3><\/dt>\n<dd><p>Yes: pick a picture (your logo or an icon) in <strong>Colors and marker<\/strong>. Or keep the pin and choose its color.<\/p><\/dd>\n<dt id=\"can%20developers%20change%20the%20map%20or%20the%20place%20search%3F\"><h3>Can developers change the map or the place search?<\/h3><\/dt>\n<dd><p>Use the <code>alsl_config<\/code> filter. For example, to use another tile server and geocoder on the whole site:<\/p>\n\n<pre><code>add_filter( 'alsl_config', function ( $config ) { $config['tiles'] = 'https:\/\/tiles.example.com\/{z}\/{x}\/{y}.png'; $config['geocoder'] = 'https:\/\/geocoder.example.com\/search'; return $config; } );\n<\/code><\/pre>\n\n<p>The geocoder must answer like Nominatim's <code>\/search<\/code> (JSON) or Photon (GeoJSON).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>The video tutorial \"Every setting, explained\" is linked from the empty block, the CSV import and the Help panel.<\/li>\n<li>The readme shows the promo video and links each FAQ to its part of the tutorial.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"A store locator block with a free OpenStreetMap map. Visitors find the nearest store by town, postcode or their location. No Google Maps API key.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/403670","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=403670"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/softiconai"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=403670"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=403670"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=403670"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=403670"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=403670"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=403670"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}