Directory / plugin
Ruhler Community Resource Directory
v0.3.4 · by ruhler
Manage locations, hours, and services from wp-admin, and publish an accessible directory with search, an optional map, and Near Me. No API key.
About this plugin
Ruhler Community Resource Directory lets any nonprofit or community service organization — a food bank, a clothing closet, a legal-aid clinic, a tutoring program, a health clinic network — manage its physical locations and the services offered at each one, entirely from wp-admin, and publish an accessible public directory that visitors can search and filter.
Every core feature works on a plain WordPress installation. No API key, account, or paid service is required to publish a complete, useful directory.
Manage your locations in wp-admin
- A dedicated “Resource Locations” area in wp-admin, using WordPress’s own familiar publish/draft/trash workflow — no separate approval step, no new login for your staff to learn.
- A “Services Offered” taxonomy so you can organize and later filter locations by the services each one provides.
- Address and contact fields (street, city, state, postal code, phone, website).
- A weekly hours editor supporting hours-not-provided, closed, specific open/close times (including overnight hours that run past midnight), and open-24-hours — plus dated exceptions for a specific day (for example, a holiday closure) that override the regular weekly schedule.
- Map coordinates for a location are entered by hand, with clear checks for common mistakes: out-of-range values, decimal commas, degree-style entries, a latitude/longitude pair pasted into one field, and latitude and longitude entered in each other’s fields. Reversed values are explained with a one-click “Swap” action; nothing is ever swapped or rewritten automatically, and saved coordinates are never discarded because of an invalid edit.
- When the optional map is turned on, a map position preview in the location editor shows the marker. Click the map or drag the marker to propose a position; the coordinate fields update to match, and nothing is saved until you update the location. The coordinate fields remain a complete keyboard alternative.
- An optional “Find address on map” button, off by default, can look up the location’s address with OpenStreetMap Nominatim and list possible matches for you to choose from. See “Address finder privacy” below.
- A one-time, dismissible reminder on your Dashboard confirms your directory page is live and points you to “Add your first location.” It disappears permanently once you publish your first location, and never appears anywhere except the Dashboard and Plugins screens.
What visitors see
- A searchable, filterable public directory: search by name, description, city, state, or ZIP/postal code; filter by service; and an “Open Now” toggle — all without JavaScript. Every one of these is a real page reload with a real URL, so it works exactly the same with JavaScript on or off.
- Locations are always listed with the ones open right now first, then locations opening later today, then closed, then locations with no hours entered yet — so a visitor never has to hunt through closed locations to find one that’s actually open.
- Each location shows its current status in plain language — “Open now,” “Open until 5:00 pm,” “Opens at 9:00 am,” “Opens later today,” “Closed today,” “Open 24 hours,” or “Today’s hours unavailable” when hours simply haven’t been entered yet.
- An individual page for every location — name, status, description, services, address, phone, website, weekly hours, and any upcoming schedule exceptions — instead of the generic blog-post layout (author byline, post navigation, comments) WordPress would otherwise use. This replacement page works the same way on both classic and block themes, and your theme can override it (see the FAQ).
- “Near Me,” an optional, visitor-initiated distance sort. Nothing happens until a visitor clicks “Use my location” — no background or automatic location request is ever made. Near Me works whether or not the map is turned on.
- An optional map view, described fully in “Map privacy” below.
Customize the directory’s appearance
Administrators can open Resource Locations Appearance to customize the public directory without writing CSS:
- Accessible presets — start from Calm blue, Evergreen, or Deep plum, each chosen so its button text meets WCAG AA contrast for normal text.
- Custom brand color — or pick your own brand color with the standard WordPress color picker.
- Card surface — theme background, a soft brand tint, or a solid system surface.
- Corner style — square, soft, or rounded corners applied consistently to cards, controls, and badges.
- Spacing density — compact, comfortable, or spacious spacing and control size.
- Representative live preview — a sample directory card updates as you change each control, before anything is saved.
- Automatic high-contrast button text — the plugin calculates whether black or white text has the stronger contrast against your brand color and uses it for primary buttons.
- Restore defaults — one action removes the saved appearance option entirely and returns the directory to its unchanged theme-adaptive presentation.
With no saved customization, the plugin emits no appearance override CSS and keeps the theme-adaptive default styling. The Appearance screen makes no external requests and collects no tracking data. Appearance settings follow the plugin’s preserve-data uninstall policy.
The controls change the plugin’s existing scoped CSS custom properties; they do not create a separate theme layer. Saved overrides are attached after the plugin’s public stylesheet through WordPress’s normal enqueue API and only target .crd-locator-finder and .crd-locator-single. Theme styles and Additional CSS can still override those properties using normal cascade order or a more specific selector. If you add your own CSS, verify text/background and focus contrast after both sets of choices are applied.
Add it to a page
Two ways to publish the directory, and both support the same options:
- The
[crd_locator_finder]shortcode. - A “Resource Directory Finder” block in the block editor’s inserter, with the same settings available as a visual panel instead of shortcode attributes.
By default, either one shows every published location with no restrictions. Two optional settings let you scope a single instance of the directory:
- Limit to one service — shortcode:
[crd_locator_finder service="legal-aid"](using the service’s slug); block: the “Limit to one service” dropdown in the block’s settings panel. Once set, that instance only ever shows locations offering that service — visitors cannot switch it to another service or back to “All services,” and a search or “Open Now” filter a visitor applies still only searches within that one service. This is meant for a page dedicated to one kind of help (for example, a “Find Legal Aid” page), not a general-purpose filter a visitor can change. - Maximum locations to show — shortcode:
[crd_locator_finder count="5"]; block: the “Maximum locations to show” setting. Shows only the top N locations (by the same open-first ordering described above). Leave it at 0, or omit it, to show every matching location with no limit.
Both settings can be combined, and you can place as many separately-configured instances of the shortcode or block on your site as you like — each one works independently.
Map privacy
The map is a completely optional feature, off by default. Turning it on is a deliberate, informed choice:
- Map mode does nothing until an administrator visits the map settings screen, chooses a tile provider (the recommended OpenStreetMap default, which needs no API key, or the advanced custom XYZ raster tile option), and explicitly checks an acknowledgment box after reading the disclosure shown on that same screen. A custom tile URL must use HTTPS and include the
{z},{x}, and{y}placeholders. That acknowledgment is required again any time the provider, URL, or attribution text changes. - The map-drawing library (Leaflet, an open-source project) is bundled with this plugin. It is never loaded from an external CDN.
- The ready-made OpenStreetMap option requests tiles from OpenStreetMap’s tile service, subject to the OpenStreetMap tile usage policy and OpenStreetMap Foundation privacy policy. If you configure a custom provider, you are responsible for its permission, attribution, availability, privacy terms, and usage limits.
- Once enabled, a visitor’s own browser requests map tile images directly from whichever provider you chose. Tile requests necessarily reveal the approximate map area being viewed, and the provider also receives the ordinary information any web request carries (such as IP address and browser information), subject to that provider’s own policies. Resource names, descriptions, addresses, phone numbers, and every other database record from your directory are never included in a tile request.
- People editing a location can open the map position preview, which requests tiles from the same provider for their own browser — only after they select “Show map preview.”
- Near Me is entirely separate from the map and does not require it. A visitor’s location, when they choose to share it, is read directly from their browser and used only in that browser to sort the list by distance for that page view. This plugin does not store it, and does not send it anywhere — not to this plugin’s own site, and not to the map tile provider.
Address finder privacy
The address finder is a separate, optional feature, off by default and independent of the map. It uses an external service, OpenStreetMap Nominatim, operated by the OpenStreetMap Foundation.
- Nothing is sent until an administrator chooses Nominatim on the map settings screen and checks a separate acknowledgment, and then someone editing a location selects “Find this address.” There is no autocomplete, background lookup, bulk lookup, or lookup by site visitors.
- Each button press sends one request from your site’s server containing only that location’s street address, city, state or region, and postal code. Phone numbers, descriptions, services, contacts, and other site data are never sent.
- As the service’s usage policy requires, the request identifies this plugin and your site’s web address (in its User-Agent and Referer headers). The service also receives your server’s IP address and ordinary request information, subject to its own policies.
- Requests are limited to one per second for the whole site, and identical searches are answered from your site’s cache for up to seven days.
- Service availability and response quality are controlled by the OpenStreetMap Foundation and cannot be guaranteed by this plugin.
- Possible matches are listed for you to choose from; none is chosen automatically, and nothing is saved until you update the location.
- Results are © OpenStreetMap contributors, available under the Open Database License. See the Nominatim usage policy, the OpenStreetMap Foundation privacy policy, and OpenStreetMap copyright and licence.
- Developers can replace or remove the address service with the
crd_locator_geocoder_providersandcrd_locator_geocoder_active_providerfilters.
What this version does not include
- Automatic or bulk geocoding, and address verification. Coordinates are entered by hand, or — only when an administrator turns it on — looked up one location at a time with the optional address finder (see above).
- Importing locations from a spreadsheet or an external service’s API.
- Any integration with a third-party provider database.
- Built-in analytics or reporting.
- A ZIP-radius search backed by a postal-code distance dataset (search and Near Me both work today; a dedicated ZIP-radius dataset is not included).
- Any automatic, ongoing synchronization with an external data source.
None of the above requires an account, subscription, or API key to use this plugin’s current features — they are simply not part of this version.