{"id":350839,"date":"2026-08-19T14:05:19","date_gmt":"2026-08-19T14:05:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/groundwork-common-location-finder\/"},"modified":"2026-08-20T01:00:09","modified_gmt":"2026-08-20T01:00:09","slug":"groundwork-common-location-finder","status":"publish","type":"plugin","link":"https:\/\/pcd.wordpress.org\/plugins\/groundwork-common-location-finder\/","author":23544815,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0.4","requires":"6.3","requires_php":"7.4","requires_plugins":null,"header_name":"Groundwork Common Location Finder","header_author":"Groundwork Common LLC","header_description":"A map-and-list location finder whose fields you define yourself. Only the name and coordinates are built in; everything else is configured in wp-admin.","assets_banners_color":"412234","last_updated":"2026-08-20 01:00:09","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/www.groundworkcommon.com\/support\/","header_plugin_uri":"https:\/\/github.com\/Groundwork-Common\/groundwork-common-location-finder","header_author_uri":"https:\/\/www.groundworkcommon.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":53,"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":"groundworkcommon","date":"2026-08-20 01:00:09"}},"upgrade_notice":{"1.0.0":"<p>First release.<\/p>"},"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3654769,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3654769,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3654769,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"groundwork-common-location-finder\/finder":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"groundwork-common-location-finder\/finder","title":"Location Finder","category":"widgets","icon":"location-alt","description":"A searchable map and list of your locations.","textdomain":"groundwork-common-location-finder","keywords":["map","locations","finder","directory"],"attributes":{"showMap":{"type":"boolean","default":true},"height":{"type":"number","default":0},"label":{"type":"string","default":""}},"supports":{"align":["wide","full"],"spacing":{"margin":true,"padding":true},"color":{"text":true,"background":true,"link":true},"typography":{"fontSize":true,"lineHeight":true},"html":false,"multiple":true},"editorScript":"file:.\/edit.js","render":"file:.\/render.php","style":"gwc-lfndr-finder","viewScript":"gwc-lfndr-finder"}},"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3654769,"resolution":"1","location":"assets","locale":"","width":1307,"height":863},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3654769,"resolution":"2","location":"assets","locale":"","width":404,"height":975},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3654769,"resolution":"3","location":"assets","locale":"","width":1307,"height":863},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3654769,"resolution":"4","location":"assets","locale":"","width":1307,"height":863},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3654769,"resolution":"5","location":"assets","locale":"","width":1307,"height":863},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3654769,"resolution":"6","location":"assets","locale":"","width":1307,"height":863}},"screenshots":{"1":"The finder on desktop \u2014 map, filters, and results side by side.","2":"On a phone, with the map above the list.","3":"A location's details, opened in place.","4":"Defining a field: type, label, and where it appears.","5":"Recurring hours \u2014 \"1st and 3rd Tuesday\" without a plugin-specific syntax.","6":"Appearance presets."}},"plugin_section":[],"plugin_tags":[4595,351,2909,16164,6102],"plugin_category":[49],"plugin_contributors":[276508],"plugin_business_model":[],"class_list":["post-350839","plugin","type-plugin","status-publish","hentry","plugin_tags-leaflet","plugin_tags-locations","plugin_tags-map","plugin_tags-openstreetmap","plugin_tags-store-locator","plugin_category-maps-and-location","plugin_contributors-groundworkcommon","plugin_committers-groundworkcommon"],"banners":{"banner":"https:\/\/ps.w.org\/groundwork-common-location-finder\/assets\/banner-772x250.png?rev=3654769","banner_2x":"https:\/\/ps.w.org\/groundwork-common-location-finder\/assets\/banner-1544x500.png?rev=3654769","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/groundwork-common-location-finder\/assets\/icon-256x256.png?rev=3654769","icon_2x":"https:\/\/ps.w.org\/groundwork-common-location-finder\/assets\/icon-256x256.png?rev=3654769","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/groundwork-common-location-finder\/assets\/screenshot-1.png?rev=3654769","caption":"The finder on desktop \u2014 map, filters, and results side by side."},{"src":"https:\/\/ps.w.org\/groundwork-common-location-finder\/assets\/screenshot-2.png?rev=3654769","caption":"On a phone, with the map above the list."},{"src":"https:\/\/ps.w.org\/groundwork-common-location-finder\/assets\/screenshot-3.png?rev=3654769","caption":"A location's details, opened in place."},{"src":"https:\/\/ps.w.org\/groundwork-common-location-finder\/assets\/screenshot-4.png?rev=3654769","caption":"Defining a field: type, label, and where it appears."},{"src":"https:\/\/ps.w.org\/groundwork-common-location-finder\/assets\/screenshot-5.png?rev=3654769","caption":"Recurring hours \u2014 \"1st and 3rd Tuesday\" without a plugin-specific syntax."},{"src":"https:\/\/ps.w.org\/groundwork-common-location-finder\/assets\/screenshot-6.png?rev=3654769","caption":"Appearance presets."}],"raw_content":"<!--section=description-->\n<p>Most location finders decide in advance what a location is: a store with a phone number, or a clinic with services. If your locations do not fit that shape, you end up storing \"Wheelchair accessible\" in a field labeled Fax.<\/p>\n\n<p>This plugin has three built-in fields \u2014 <strong>name, latitude, longitude<\/strong> \u2014 and nothing else. Every other field is one you define in wp-admin: its type, its label, whether it shows on the result card or only in the detail pane, whether it is searchable, whether it becomes a filter. A food bank defines Services and Eligibility. A clinic defines Specialties and Languages Spoken. Neither pretends to be the other.<\/p>\n\n<h4>Field types<\/h4>\n\n<p>Nine simple types \u2014 text, textarea, URL, email, phone, number, yes\/no, select, multi-select \u2014 plus three composites that are genuinely hard to do by hand:<\/p>\n\n<ul>\n<li><strong>Address<\/strong> \u2014 six subfields, a formatted one-line version, and a directions link.<\/li>\n<li><strong>Recurring hours<\/strong> \u2014 not just \"9\u20135 Monday\", but \"2nd and 4th Tuesday, 9am\u20134pm\". Consecutive days collapse on display, so seven rows read as \"Mon\u2013Fri 9am\u20135pm\".<\/li>\n<li><strong>Temporary closures<\/strong> \u2014 a date range with a reason. While one is active, the location shows a closure notice and stops reporting itself as open.<\/li>\n<\/ul>\n\n<h4>What visitors get<\/h4>\n\n<p>A map with pins and a list beside it, on one screen. Type to search; the typeahead suggests location names, cities, and the values of your own choice fields. Filter with chips. Press the crosshair button on the map to sort by distance from where you are \u2014 it is a sort, not a radius, so the nearest location is always shown even when it is 40 miles away. Selecting a location opens its details in place, without a page load.<\/p>\n\n<p>It works without JavaScript, too: the page renders a plain list of locations that search engines can read and JavaScript replaces on boot.<\/p>\n\n<h4>Theming<\/h4>\n\n<p>The stylesheet ships structure, not opinions. Colors come from <code>currentColor<\/code> and the CSS system colors, so the finder inherits your theme's palette, follows dark mode, and survives Windows High Contrast without configuration.<\/p>\n\n<p>If you do want to color it, the Appearance tab has fifteen presets and twenty-five individual settings. Preset colors are all checked to WCAG AA contrast. Settings that override your theme do so with custom properties and no <code>!important<\/code>, so a theme that deliberately styles the finder still wins.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>The plugin sets no cookies, adds no tracking, and sends nothing about visitors to your server or anyone else's. Location data stays in your database. The locate button reads the browser's geolocation only after the visitor presses it, and the coordinates are used in the browser and never transmitted.<\/p>\n\n<p>By default the map does not load until the visitor asks for it \u2014 see <em>Ask before loading the map<\/em> below. When they do, the choice is remembered in <code>sessionStorage<\/code> for that browsing session only. That is the one thing the plugin stores in a visitor's browser: a single flag, never sent anywhere, gone when the tab closes.<\/p>\n\n<p>See <em>External services<\/em> below for what does leave the site.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin relies on external services. Both are optional in the sense that they can be pointed elsewhere, but the defaults contact third parties, so here is exactly what is sent and when.<\/p>\n\n<p><strong>1. Map tiles \u2014 OpenStreetMap or CARTO<\/strong><\/p>\n\n<p>The map is drawn from tile images fetched by the <strong>visitor's browser<\/strong>, directly from the tile provider. That means the provider receives the visitor's IP address, user agent, and the map area being viewed. No other data is sent.<\/p>\n\n<p>Because the request comes from the visitor rather than from your server, nothing server-side can prevent it once a map is on screen. So <strong>the plugin does not load tiles until the visitor asks it to.<\/strong> The map area shows a placeholder naming the provider and a <em>Show map<\/em> button, and no request reaches the provider until that button is pressed. The search, filters, location list and detail pane all work regardless \u2014 a visitor who never loads the map still gets a working finder.<\/p>\n\n<p>This is on by default and can be turned off under Locations \u2192 Settings \u2192 Behavior (<em>Ask before loading the map<\/em>). It is skipped automatically when the tiles come from your own site, since there is no third party to ask about.<\/p>\n\n<p>Which provider depends on the Map style setting under Locations \u2192 Settings \u2192 Appearance:<\/p>\n\n<ul>\n<li><em>OpenStreetMap<\/em> (default) \u2014 <code>https:\/\/tile.openstreetmap.org<\/code>\nTerms: <a href=\"https:\/\/operations.osmfoundation.org\/policies\/tiles\/\">OSMF tile usage policy<\/a>\nPrivacy: <a href=\"https:\/\/wiki.osmfoundation.org\/wiki\/Privacy_Policy\">OSMF privacy policy<\/a><\/li>\n<li><em>Light<\/em>, <em>Voyager<\/em>, <em>Dark<\/em> \u2014 <code>https:\/\/basemaps.cartocdn.com<\/code> (CARTO)\nTerms: <a href=\"https:\/\/carto.com\/legal\/\">CARTO legal<\/a>\nPrivacy: <a href=\"https:\/\/carto.com\/privacy\/\">CARTO privacy policy<\/a>\nNote: CARTO's free basemap tier is for non-commercial use. Commercial sites should use OpenStreetMap, or set a Custom tile URL for a provider they have an account with. The settings screen states this next to those three styles and again whenever one of them is the active choice.<\/li>\n<li><em>Custom<\/em> \u2014 whatever URL you enter. Nothing is sent anywhere else.<\/li>\n<\/ul>\n\n<p>Attribution is a license condition, not decoration. The plugin prints the provider's required attribution on the map and it must not be removed.<\/p>\n\n<p><strong>2. Address lookup \u2014 Nominatim (OpenStreetMap)<\/strong><\/p>\n\n<p>Used <strong>only in wp-admin<\/strong>, and only when a logged-in editor types into the address field of a location and asks for suggestions. The address text typed into that box is sent to <code>https:\/\/nominatim.openstreetmap.org\/search<\/code> from your server, and the matching addresses and coordinates come back. Visitors never trigger it, and no visitor data is involved.<\/p>\n\n<p>Nominatim's usage policy requires an identifying contact address in the request, so the plugin sends the site URL and the contact email from Locations \u2192 Settings \u2192 Advanced (your admin email, by default). Requests are throttled to one per second per user.<\/p>\n\n<p>Terms: <a href=\"https:\/\/operations.osmfoundation.org\/policies\/nominatim\/\">OSMF Nominatim usage policy<\/a>\nPrivacy: <a href=\"https:\/\/wiki.osmfoundation.org\/wiki\/Privacy_Policy\">OSMF privacy policy<\/a><\/p>\n\n<p><strong>Not a service call:<\/strong> the <em>Get directions<\/em> link points at Google Maps or Apple Maps. It is an ordinary link \u2014 nothing is sent until a visitor clicks it, and then it is their browser making the request, not your site.<\/p>\n\n<h3>About Groundwork Common<\/h3>\n\n<p>This plugin is built and maintained by Groundwork Common, a technology practice for nonprofits: fractional technology leadership, project work, and training for organizations that need senior help and cannot carry a full-time technologist.<\/p>\n\n<p>One of our working principles is that good technology work should leave an organization more capable, not more dependent on whoever did it. Releasing this plugin is that principle applied. A food bank or a clinic should be able to put its locations on a map without commissioning custom work or renting something this ordinary by the month.<\/p>\n\n<p>If you find this plugin useful, three things genuinely help:<\/p>\n\n<ul>\n<li><strong>Recommend us.<\/strong> Mention us to a nonprofit who might benefit from our services. Referrals are how our business continues to grow its impact and reach.<\/li>\n<li><strong>Support our WordPress plugins directly.<\/strong> While we offer the plugin free to you, it costs us to maintain it \u2014 the security updates, the compatibility testing against each new WordPress release, the bug nobody but you has hit. We can't do it without your support, and we appreciate whatever support you can give.<\/li>\n<li><strong>Report what broke.<\/strong> A clear bug report is worth more to us than most feature requests.<\/li>\n<\/ul>\n\n<p><a href=\"https:\/\/www.groundworkcommon.com\">www.groundworkcommon.com<\/a><\/p>\n\n<h3>Third-party libraries<\/h3>\n\n<p>The plugin bundles one library and loads it from your own server. Nothing is fetched from a CDN, and there is no build step \u2014 every file the plugin ships is the file it runs.<\/p>\n\n<p><strong>Leaflet 1.9.4<\/strong> \u2014 <code>assets\/leaflet\/<\/code>\nLicense: BSD 2-Clause, included at <code>assets\/leaflet\/LICENSE<\/code>\nSource: <a href=\"https:\/\/github.com\/Leaflet\/Leaflet\/releases\/tag\/v1.9.4\">Leaflet 1.9.4 release<\/a><\/p>\n\n<p>The bundled <code>leaflet.js<\/code> and <code>leaflet.css<\/code> are the official minified release files, byte for byte, with no modifications. The unminified source and the build tooling that produced them are at the URL above. The five PNGs under <code>assets\/leaflet\/images\/<\/code> are Leaflet's own marker and layer sprites, under the same license.<\/p>\n\n<p>All other code in this plugin is unminified and readable as shipped. The plugin's own icons are inline SVG written directly in the source, not image files.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>Go to <strong>Locations \u2192 Settings \u2192 Fields<\/strong> and define the fields your locations need. You can also start with none \u2014 name and coordinates alone work.<\/li>\n<li>Add a location under <strong>Locations \u2192 Add New<\/strong>. Type an address and the coordinates fill in for you.<\/li>\n<li>Put the finder on a page with the <strong>Location Finder<\/strong> block, or the <code>[gwc_lfndr_finder]<\/code> shortcode.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20an%20api%20key%3F\"><h3>Do I need an API key?<\/h3><\/dt>\n<dd><p>No. Maps use OpenStreetMap tiles and a copy of Leaflet bundled with the plugin. Nothing to sign up for, nothing to pay, no key to leak.<\/p><\/dd>\n<dt id=\"how%20many%20locations%20can%20it%20handle%3F\"><h3>How many locations can it handle?<\/h3><\/dt>\n<dd><p>Comfortably a few hundred. The whole set is embedded in the page so that search and filtering are instant, which costs roughly 1KB per location \u2014 around 35KB compressed at 200 locations. Past about a thousand, that page weight stops being a fair trade and this becomes the wrong plugin.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20if%20i%20delete%20a%20field%3F\"><h3>What happens to my data if I delete a field?<\/h3><\/dt>\n<dd><p>Nothing is erased. The field moves to a <strong>Retired<\/strong> list, and its data stays on every location. Restore it and the values are still there. Permanently deleting the data is a separate action behind a typed confirmation.<\/p>\n\n<p>Field keys cannot be renamed after creation for this reason \u2014 a rename is a delete plus a create, which routes through retirement, so data is never lost quietly.<\/p><\/dd>\n<dt id=\"does%20uninstalling%20delete%20my%20locations%3F\"><h3>Does uninstalling delete my locations?<\/h3><\/dt>\n<dd><p>Never. Uninstalling removes the plugin, not your records \u2014 locations and their field values survive, and reinstalling picks up where you left off. If you also want the field schema and settings removed, that has to be armed deliberately:<\/p>\n\n<pre><code>update_option( 'gwc_lfndr_allow_destructive_uninstall', true );\n<\/code><\/pre>\n\n<p>Even then, the locations themselves stay.<\/p><\/dd>\n<dt id=\"can%20i%20have%20two%20sets%20of%20hours%2C%20or%20two%20addresses%3F\"><h3>Can I have two sets of hours, or two addresses?<\/h3><\/dt>\n<dd><p>Yes. Add as many as you like \u2014 \"Pantry hours\" and \"Office hours\", or \"Mailing address\" and \"Visiting address\". One of each is marked as the one that drives behavior: which address the map pin and directions use, which hours the \"Open now\" badge reads. The others display and search normally.<\/p><\/dd>\n<dt id=\"the%20finder%20doesn%27t%20match%20my%20theme.\"><h3>The finder doesn't match my theme.<\/h3><\/dt>\n<dd><p>Check Locations \u2192 Settings \u2192 Appearance. If it looks close but wrong, the theme is probably styling <code>button<\/code> or <code>select<\/code> globally; the presets exist to override that. If it looks unstyled entirely, the stylesheet is not loading \u2014 the finder must be added as a block or shortcode, not pasted as raw HTML.<\/p><\/dd>\n<dt id=\"is%20it%20accessible%3F\"><h3>Is it accessible?<\/h3><\/dt>\n<dd><p>That was a design constraint, not a pass at the end. Native elements throughout, the reorder controls are buttons with live announcements rather than drag-and-drop, and every preset meets WCAG AA contrast.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"A map-and-list location finder whose fields you define yourself. Only the name and coordinates are built in.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/350839","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=350839"}],"author":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/groundworkcommon"}],"wp:attachment":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=350839"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=350839"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=350839"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=350839"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=350839"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=350839"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}