=== Web Directory Free ===
Contributors: mihail-chepovskiy
Donate link: https://www.salephpscripts.com/
Tags: directory, classified plugin, listings, maps, search
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 2.2.1
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

A searchable business directory for WordPress: categories, locations, fields, maps. Everything included for free, except frontend submit and payments.

== Description ==

Web Directory Free turns WordPress into a searchable business directory. Sort listings into categories, locations and tags, build your own listing form, drop the directory onto any page with a shortcode, and let visitors search and browse - as a list, as cards, or on an interactive map.

In the free edition you add and edit listings from the WordPress admin, and visitors browse, search and view them on the front end.

**Live demo:** [directory.salephpscripts.com](https://directory.salephpscripts.com/)

= What you can build =

A local business directory, a member or staff directory, a property or vehicle catalogue, a venue or event guide, a service-provider index, a classifieds board. Anything that is a list of places or things with fields, categories and a map.

= Organise your listings =

* **Categories and locations** are hierarchical, so Country, Region, City nests the way you expect, and each level gets its own page.
* **Tags** for the cross-cutting labels that do not fit a hierarchy.
* Each category can carry its own **marker icon and colour**, so the map reads at a glance.
* Every category, location and tag page is a real URL with its own listings, search and map.

= Build the listing form yourself =

The form builder is drag and drop: arrange fields in rows and columns, and add your own on top of the built-in ones. Field types included:

* Title, Content, Excerpt
* Categories, Tags
* Address and Map
* Images & Videos - photos plus YouTube or Vimeo links, shown in one gallery with a lightbox
* Contact info, Phone, Email, Website URL
* Text/string, Number, Price
* List - as a dropdown, radio buttons or checkboxes
* Date-Time
* Opening hours
* File upload

Every field can be placed independently on the listing card, the listing page, the search form and the map popup, so a field can be searchable without cluttering the card.

= Put the directory anywhere =

Each directory has a page builder: choose which elements appear on the home, category, location and listing pages, and in what order - search form, map, categories block, listings grid, slider, breadcrumbs, page title, buttons.

If you would rather place things by hand, every element is also a shortcode: `[webdirectory]`, `[webdirectory-search]`, `[webdirectory-map]`, `[webdirectory-listings]`, `[webdirectory-categories]`, `[webdirectory-locations]`, `[webdirectory-slider]`, `[webdirectory-breadcrumbs]`, `[webdirectory-listing-page]` and more. They work in the block editor, in Elementor and in WPBakery.

= Maps =

* Three engines: **Google Maps**, **Mapbox** and **MapLibre** with MapTiler tiles. Pick per site.
* Marker **clustering**, so thousands of listings stay usable.
* Per-category and per-listing **marker icons**.
* Rich **popups** built from the fields you chose, with the listing photo.
* A **map sidebar** that lists what is currently in view, and follows as the visitor pans.
* **Radius search** from an address, in miles or kilometres.
* Several layouts, including a full-width hero map and a sticky map beside the listings.

= Search that finds things =

The search form is built the same way as the listing form: drag in the elements you want.

* Keyword, categories, locations, address plus radius, rating.
* Any custom field you added becomes a filter - a price range, a number range, a date, a dropdown.
* A "More filters" separator to keep the visible form short.
* Sorting by newest, oldest, title, rating, random, or any numeric or date field you defined.
* Grid and list views, with the visitor's choice remembered.

= Ratings =

Built in, no add-on: visitors rate a listing, the average shows on the card, the listing page and the map popup, and rating becomes a search filter and a sort option. Ratings can be switched off entirely.

= Bulk work =

* **CSV import and export** for listings, including categories, locations, tags, custom fields, images and video links. Import creates or updates; export round-trips.
* A **thumbnail regeneration** tool for when you change image sizes.

= Housekeeping =

* **Colour palette** controls so the directory matches your theme, with several presets.
* **Email notifications** with editable subjects, each one switchable.
* **Google reCAPTCHA** (v2 or v3) on the listing contact form.
* A **diagnostics page** that checks the directory is wired up correctly and tells you what to fix if it is not.
* An **install wizard** that creates the pages and the first directory for you.
* **Translation ready**: ships a POT file for any standard gettext or PO editor.
* Built for **large directories**: a dedicated search index and sort index keep tens of thousands of listings responsive, and both rebuild in the background.

This plugin uses external services (map providers and, if you enable it, Google reCAPTCHA). See the **External Services** section below.

= What is not in the free edition =

Front-end submission. In the free edition listings are created and edited in the WordPress admin; visitors browse and search. The paid version adds front-end submission with membership plans, listing expiry and renewals, and WooCommerce checkout for paid, featured and upgraded listings.

**Get the full version:** [Web 2.0 Directory on CodeCanyon](https://codecanyon.net/item/web-20-directory-plugin-for-wordpress/6463373)

== Installation ==

1. Upload the plugin folder to `/wp-content/plugins/`, or install the ZIP via Plugins -> Add New -> Upload Plugin.
2. Activate **Web Directory Free** from the Plugins menu.
3. Open the settings page, pick your map engine and enter its API key/token (Google Maps API key, Mapbox token, or MapTiler key).
4. Create your categories and locations, build the listing form, add listings, and place the directory on any page with the shortcode.

== Frequently Asked Questions ==

= Who can add listings in the free edition? =
Listings are created and edited from the WordPress admin. Front-end submission (with optional moderation, expiration and renewal) is part of the full version.

= Do I need API keys? =
For maps, yes - each map provider needs its own key/token, entered on the settings page. Keys are stored on your site and are never sent to us.

= Which map providers are supported? =
Google Maps, Mapbox, and MapLibre with MapTiler tiles. You pick one on the settings page.

= Is it translation ready? =
Yes. A `languages/w2dc.pot` template is included; translate it with any standard gettext/PO editor.

= How do paid listings and membership plans work? =
Paid submission, membership plans and WooCommerce checkout come with the full version of Web 2.0 Directory, not the free edition.

== External Services ==

Web Directory Free uses the following third-party services. Nothing is sent until you use the matching feature:

* Map providers (Google Maps, Mapbox, MapTiler / MapLibre) - when a map loads or an address is geocoded, the request (coordinates, the address being searched, and your API key/token) is sent to the provider you chose. See that provider's terms and privacy policy.
* Google reCAPTCHA - when you turn it on for the contact form, the visitor's interaction is checked with Google. See Google's terms and privacy policy.

The free edition does not contact the author's servers: it gets updates through WordPress.org and does no license or "phone-home" checks.

== Screenshots ==

1. Setup wizard progress bar on the Settings step, showing the numbered stepper and Next button.
2. Setup wizard on the Form Builder step, showing the drag-and-drop listing form editor.
3. Setup wizard on the Edit Directory step, showing the directory page builder canvas.
4. Setup wizard - Demo content step: choose sample listings to import (adds a Demo tab to the CSV import screen).
5. Setup wizard - Create a map step: build your first standalone map before finishing setup.
6. The Create page with this directory button in the Edit Directory toolbar, which publishes a page containing the [webdirectory id=N] shortcode.
7. A published directory page (a page containing [webdirectory]) as visitors see it - page title, search form, category grid, map, and listings grid together.
8. The directory search form rendered by the search element, showing the keyword, location, and taxonomy filters.
9. The member dashboard 'My Listings' tab, where users manage their own listings.
10. The four top-level menus Web 2.0 Directory adds to the WordPress admin sidebar: Directories, Directory listings, Maps and Directory Admin.
11. Creating a directory: the General settings (labels, URL slugs, listing template) on the left of the directory edit screen.
12. The drag-and-drop Form Builder assembling a listing form from the field palette (text, price, date, opening hours, address, image upload).
13. A category term's icon picker offering a Font Awesome glyph with colour, a bundled PNG, or an uploaded image.
14. Choosing the map engine (Google Maps / Mapbox / MapLibre + MapTiler), entering the API key, and using the Test map engine keys button.
15. Building the on-map search form by dragging keyword, address+radius, category and custom-field slots onto the canvas.
16. The Customization tab under Directory Admin -> Settings, showing the Color palette dropdown and the Main colors / Links & buttons / Images sections.

== Changelog ==

= 2.2.1 - 2026-09-07 =
* New: the sticky badge is now per plan. Each plan can carry its own badge text, "Featured" if you leave it empty, and its own badge colour, picked right under Sticky listings. Leave the colour alone and the badge looks exactly as it always has; choose a pale one and the text switches from white to dark by itself, so the badge stays readable whatever you pick. The map popups, the grid cards, the map sidebar and the slider all show the same badge, because they all now build it from one place.
* New: form templates can be duplicated. Every row in Form Builders now has a "Make duplicate" link, the same one the Maps list has: it copies the layout into a new template, opens it, and leaves the original alone. Building a variant no longer means rebuilding the form by hand.
* Improvement: the summary labels on a plan row stay visible while the plan is open. They used to vanish the moment you expanded the row, which is exactly when they are worth having: the settings they summarise are spread over several groups, and the labels are the one line telling you what the plan now adds up to.
* Improvement: the listing-page element is now called "Images & Videos gallery". Videos attached to a listing appear in that same gallery, after the images, and the old name sent people looking for a separate video element that does not exist.
* Improvement: the listing form calls the field "Images & Videos" only while videos are actually switched on for it. Set Max videos to 0 and the video box disappears, so the heading goes back to "Images" rather than offering something the form does not have. A name you typed in yourself is left alone.
* Improvement: saving now says what it saved. Instead of a bare "Saved", the Plans screen reports how many plans were written and how many were already up to date, so a save that had nothing to do is no longer indistinguishable from one that quietly failed.
* Improvement: the plan editor leads with "Highlight this plan on submission table" instead of burying it below the other display settings, and two lines of help text that only restated the field names above them are gone.
* Fix: a listing video with no preview image is shown instead of being dropped. The listing gallery left such videos out entirely, so a listing could have three videos attached and display none of them. A YouTube preview is now worked out from the link itself, and a video that genuinely has none gets a play panel rather than vanishing.
* Fix: the Plans screen no longer loses your edits to the main Save Changes button. The tab used to carry its own separate save buttons, and the big Save Changes at the top of the page saved only the settings: it reported success and dropped every plan edit. There is one save for the whole page now, and it writes the plans, the plan changes table and the settings together.
* Fix: saving a plan on a large directory no longer times out. Any edit to a plan re-indexed thousands of its listings inside the same request, so past a certain size the save never finished at all. Only the two settings that actually affect listing order and rating display cause a re-index now, and even then most of the work is spread over later page loads instead of the save itself.
* Fix: plans whose feature list had been replaced by the single word "Array" are cleared on upgrade. An earlier saving bug overwrote those lists, and the leftover word was being shown to visitors as a feature on the plan cards and the pricing table. The original lines cannot be brought back, so such a plan now simply lists no features of its own until you write them again.
* Fix: the self-test no longer says a directory page may render blank when it is rendering perfectly well. It looked only for the name of the script file, which caching and minifying plugins routinely rename, so a healthy page failed the check and the cure it suggested, "Always load front assets", could not have changed anything. It now checks whether the directory itself is on the page, tells you which of the two is actually missing, and gives the fix that matches.
* Fix: plans migrated from Web 2.0 Directory keep the limit on which custom fields their listings may fill. That limit was not carried over at all, so every migrated plan came out allowing every field, and a plan that allowed no custom fields at all came out allowing all of them - looser than the level it replaced, with nothing to say so. It is now translated during the migration, and a site that migrated before this release is repaired by itself the next time an administrator opens wp-admin. A plan whose fields you have already set by hand is left exactly as you set it.
* Fix: editing a directory no longer reverts plan settings that were changed somewhere else. The Edit Directory screen re-sent every setting of every plan it offers, using the values it had read when the page was opened, so saving anything there - even a layout change that touched no plan - quietly rolled back whatever had been altered meanwhile in Settings, Plans or in a second tab, on a plan every other directory shares. It now sends only what you actually changed on that screen, the same rule the plan name already followed.
* Fix: turning Sticky listings on or off no longer takes the directory sort index out of service. Flipping it on a plan with more than a couple of hundred listings used to re-index them a few hundred at a time and hand the rest to a background crawl, and that crawl switches the fast ordering path off for the whole site until it has walked every listing - so on a large directory the edit meant to put listings on top was itself what stopped them getting there, sometimes for hours. The sticky flag is one value per listing, so it is now written directly in a single step, however many listings the plan has, and the index keeps serving throughout.
* Fix: re-running the import no longer detaches the plans from your directories. The import seeds the plan offer of each directory, along with its categories and locations, from the legacy record, and it rewrote all three on every run - so a second run replaced whatever you had attached since with whatever the old record still said, and emptied the offer outright when that record listed nothing. Listings kept their own plan, but the editor showed them as having none, because that plan was no longer among the ones the directory offered. All three are now written only for a directory that has no value for them yet, which is the rule the listing template and the submission switch already followed.
* Fix: the buttons the map draws on your pages are no longer flattened by the theme. Their colours were set by single-class rules, which carry exactly the same weight as the "button" reset most themes ship, so whichever stylesheet loaded last won - and a theme always loads after a plugin. On such a theme the sidebar tab, the search-form buttons and the close and Get-directions buttons in the map panels came out with a see-through background, the theme link colour and a stray border. Those rules now name the element as well as the class, which puts them out of reach of that reset without resorting to !important, so the controls keep the colours you picked in Customization.
* Fix: Reset, Everything now really does drop everything. It cleared the two tables the mapping engine creates but left the directory sort index behind, so a reset meant as a clean slate kept an index full of ordering rows for listings it had just deleted. The wording on that screen also named tables it was not touching; it now says what it does.
* Fix: the import no longer brings expired listings back to life. It republished every listing that had already expired and threw its expiry date away, so paid listings that had run out came back as current premium ones, with no date left and no copy of the old one anywhere. Dates and statuses are now left exactly as they are, and a listing that carries no date at all expires according to its plan.
* Fix: the coordinates in a listing structured-data block are written as plain numbers again, for example -17.95834 rather than -17.95833999999999974761522025801241397857666015625. Some servers are set to print floating-point numbers at full binary precision, which made the block far larger than it needed to be; the plugin now asks for the normal short form while writing its own data, and rounds coordinates to five decimals as the rest of the plugin already does.
* Fix: category and location archive links now point at a directory that actually holds listings in that category. Every term was linked under one directory, so an XML sitemap listed all of them under the same base - restaurant categories filed under the accommodation directory, for example. The base is now worked out from where the listings really are; while a visitor is browsing inside a directory the links keep pointing there, as before. After updating, rebuild your SEO plugin data (in Yoast: SEO, Tools, Optimize SEO data) so the sitemap picks up the new addresses.
* Fix: a page whose own canonical could not be worked out no longer ends up with no canonical at all. The plugin removed the SEO plugin version before adding its own, and skipped the adding step when it had nothing to add.
* Fix: a new form template is now saved as a new template instead of overwriting an existing one. On "Add New Template" the builder was handed the id of the first form template on the site, so Save wrote the new layout over that one and renamed it to whatever you had typed, while the template you thought you were creating stayed an invisible draft that never reached the Form Builders list. The builder now works on the template you actually opened, a new one is published under the name you gave it, and a save aimed at a template that no longer exists reports an error instead of writing somewhere else.
* Fix: pressing Enter in the form builder no longer runs a WordPress post save behind it. The builder sits inside the WordPress post form, which keeps a hidden save button to own the Return key, so Enter in the name or slug box saved an empty post rather than the layout.
* Fix: listing, category and location pages now show their own title, description, link and share image with every SEO plugin, not only some of them. Yoast, Rank Math, All in One SEO, SEOPress and The SEO Framework each produced a different mix before, from everything to nothing, and some of them left a second set of social tags behind as well.
* Fix: the share image on a listing page is no longer missing. A listing with no logo set now uses the first of its own photos, so a link to it previews with a picture instead of the site logo or nothing.
* Fix: search engines now read the right structured data on a listing, category or location page. The SEO plugin was describing the page the directory renders on rather than the listing itself, and that description is now the listing's own; the site-wide details you set in the plugin are left as they are.
* Fix: dropdowns in the form builder now fill their column instead of stopping partway across it. wp-admin caps every dropdown at a fixed width, so once the Field Properties panel was widened past that cap, controls such as "Display as" were left cut off with empty space beside them.
* Fix: a greyed-out field in the form builder palette now says why. A core field is greyed out once it is already in the form, but nothing said so, and a form built before the Images field was renamed still carries the old "Images" label - so the entry you were trying to add did not look like the one already there. Hovering a greyed-out entry now shows "Already in this form".
* Fix: undo in the form builder now reaches the plan checkboxes and the "Show for all categories" box. The plan selection was outside the history altogether, and the categories undid correctly while only their checkbox lied, so a field could show as limited to plans or categories it was no longer limited to.

= 2.2.0 - 2026-08-31 =
* New: every email in Settings, Email notifications now has its own Subject line you can edit, and its own switch to stop sending it. That covers all ten: the activation, expiry and pre-expiry emails, the new-user welcome, the two admin alerts for new and edited listings, the approval email and the three claim emails. Leave a subject empty to keep the built-in one. The [tags] work in the subject as well as the body.
* New: the plans table tells you at a glance what each plan is. A collapsed row now shows how long a listing stays live, whether it is limited to certain roles, whether its listings are sticky, and whether it allows all categories and locations or only some. The plan name box is a fixed width so those labels have room.
* New: the "Videos number" limit in the Plans constructor now defaults to 3 for new plans.
* New: the Images field is now "Images & Videos" - attach a YouTube or Vimeo link (short or long form) alongside your photos. Video previews show a play icon in the listing gallery and open in the same lightbox as images, now with a built-in player.
* New: CSV import/export now carries video links and captions the same way it already does images.
* New: CSV Import -> Demo tab can now download the demo content archive (sample listings and photos) from salephpscripts.com, so you can try the demo the same way as the full version.
* New: the Slider element can show a set number of slides at once - "Slides per view", with a separate value for phones (one by default, since three side by side are unreadable). Leave it at 0 to keep sizing slides by height as before.
* Improvement: the Email notifications tab is easier to read: each email now has its own heading, with its on/off switch and timing setting grouped under it.
* Improvement: the directory self-test is more honest. It now counts your listings (nothing did before, so a site with none came back all green), names the exact page it tested instead of silently testing a different one, says when a check could not run rather than staying quiet, and no longer suggests a fix that could not have worked on a page-builder page.
* Improvement: no admin screen loads an icon from an outside server any more. Those icons were emoji, which WordPress swaps for images hosted elsewhere; they are now drawn from the icon font the plugin already ships.
* Fix: the radius slider in the search form showed as a bare circle with no track on themes that strip the native styling from form controls (Hueman and others). It now draws its own track and handle, so it looks the same whatever the theme does.
* Fix: "Save plans" in Settings, Plans no longer fails with "There has been a critical error on this website." The screen re-saved every plan on the site each time, and each one re-indexed up to 5000 of its listings, so the request ran out of time or memory. A plan you did not touch is now left alone.
* Fix: saving in Settings, Plans no longer wipes the feature list of every plan. The list was being stored as the single word "Array".
* Fix: server replies now read as a plain sentence with a status code and a pointer to the error log instead of raw HTML, on every admin screen and on the front-end listing and contact forms.
* Fix: the Edit Listing screen now saves everything you set on it, including plugin boxes such as Yoast (rich text ones too), the permalink, Author, Published on, Discussion settings and a status change made in the Publish box.
* Fix: the SEO title and description you set in Yoast, Rank Math or All in One SEO now appear on listing, category and location pages, with the SEO box present on the Edit Listing screen and listings listed in the SEO plugin's own settings.
* Fix: the Edit Directory screen tells you when something failed. A failed Save, Export or Add page was recorded and never shown, and a directory that failed to load left an empty page builder with no explanation at all. You now get the reason, with a Reload button when the directory could not be loaded.
* Fix: a plan is no longer renamed from the Edit Directory screen. The same plan can be offered by several directories, so typing a new name there quietly renamed it for all of them. A saved plan now shows its name as plain text and is renamed in Settings, Plans; a plan you are still creating can of course be named on the spot.
* Fix: a category or location page no longer emits duplicate, conflicting SEO structured data (Yoast/Rank Math) alongside the correct one; a category/location with no description now gets a sensible default instead of none.
* Fix: migrating from the old plugin now also brings over any videos attached to a listing, including their captions - a one-time catch-up covers sites that had already finished migrating before this update.
* Fix: the meta description no longer comes out with a non-breaking space between every word on listings whose text was pasted from Word, a PDF or another site.
* Fix: an Address field that collects only Country / State / City through the dropdowns - with "Enter address fields" switched off - can be submitted again. It answered "Address is required." no matter what you picked, because the check still asked for a street line the form did not offer.
* Fix: a directory page built with Elementor showed nothing. Elementor keeps its widgets outside the page content, where the plugin was not looking, so the page never loaded the script that draws the directory. Pages built with WPBakery or the classic editor were never affected.
* Fix: the quotes around a listing title no longer arrive as &quot; in the activation email subject.
* Fix: the Search and Reset buttons in the search form fill their slot again. A theme that resets button widths (Hello Elementor and others) shrank them to the width of their own labels.
* Fix: the current page in a listings pager takes your directory colour instead of a fixed blue.
* Fix: the page area in the directory constructor no longer shows a scrollbar when the page already fits on screen.

= 2.1.3 - 2026-08-25 =
* New: an option to convert imported images to WebP during CSV import (in the import step) - WebP files are typically 25-35% smaller than JPEG; skipped automatically if the host's image library can't write WebP.
* New: set a specific expiration date - or "Never" - for any listing right on the Edit Listing screen. Your choice overrides the plan and is kept when the plan changes; leave it on "Default" to follow the plan as before. The "Listing status" and "Listing Info" boxes are now merged into one.
* New: the directory list view now lays out each listing as a row - a fixed-width image on the left, details on the right - instead of a single-column grid. Set the list image width per directory in Edit Directory → Listings; the image keeps the Card image ratio you chose.
* New: when you search by address + radius, sort the listings by "Distance" (nearest first), and every listing card shows its distance from the search point - matching the map popups and sidebar.
* New: limit how much of the Content field shows on directory cards (Edit Directory → Listings → Card fields, default 25 words, 0 for no limit), next to the existing Rating icon-size control.
* Improvement: a listing's status now shows as a coloured badge on the Edit Listing screen, matching the listings table.
* Improvement: filter the listings table by the "Paused" status, and the Directory / Plan column shows "All directories" for a listing that appears in every directory.
* Improvement: the Listing history now records plan changes and expiration-date changes, whether made by hand or automatically (auto-upgrade, renewal).
* Improvement: pause or resume a listing from your front-end dashboard too, and the "Change expiration date" screen now uses the same Default / date / Never control.
* Improvement: searching or browsing a directory by category, location or tag is much faster on large directories - it now uses the directory sort index (the same fast path as sorting and the opening-hours filter) on both the map and the listing grid, instead of a full database scan.
* Improvement: the "Maps Reset" tool's destructive options (listings/maps/templates, or everything) now require typing DELETE to confirm, on top of the existing warning.
* Fix: logging in, registering, resetting your password and logging out now work correctly on a site with no separate Dashboard page.
* Fix: search form fields keep a consistent height regardless of the active theme.
* Fix: a directory search now stays scoped to its own directory when the page carries more than one directory block (e.g. a separate mobile layout).
* Fix: paused or expired listings no longer stay visible in the directory (list and map) after being re-published from Quick Edit, a bulk action or another plugin.
* Fix: map marker coordinates are sent to the browser at normal precision again (some server configurations were appending a long trail of decimal places).
* Fix: the Opening hours field again shows a green "Open" / red "Closed" badge, with correctly coloured day labels, on listings and in map popups.
* Fix: the Edit pencil next to a listing's title (on cards, in map popups and in the map sidebar) is shown again to signed-in users who can edit that listing - the public map's cache-friendly requests were dropping the sign-in check.
* Fix: a listing that has expired can no longer be paused or resumed (from the Listing Info box or the front-end dashboard) - an expired listing must be renewed. Pausing an expired listing used to hide its expired state, and resuming could put it back on the front end past its expiration date.
* Fix: a migrated custom field (or list option) whose icon was an uploaded image no longer shows a broken icon - the fix now also cleans up sites that were migrated earlier, and covers the per-option icons of list fields (dropdown, radio, checkbox), not just the field's own icon. Affected fields fall back to no icon.
* Fix: after migrating from the old Web 2.0 Directory, a category or location link could route to an obsolete page (an old ?page_id= URL) instead of the directory's own address. The router now ignores leftover host-page entries whose directory no longer exists, and a one-time cleanup removes those stale entries.
* Fix: a listing's own image gallery (grid or slider) always opens the click-to-view lightbox now, regardless of the "Enable image lightbox" setting - that setting still controls map popups and the sidebar.

= 2.1.2 - 2026-08-19 =
* New: an "Always load front assets" option (Settings → Advanced → JavaScript & CSS) loads the directory's JavaScript and CSS on every page, so a [webdirectory] or [webdirectory-map] shortcode placed in a page-builder header, footer, widget or dynamic template (Divi, Elementor and similar) that is not part of the page's own content still shows its map and listings - no more hidden helper section on every page.
* Fix: toggling the "Enable automatic user Geolocation" switch on the Edit Map screen now activates the Save button.
* Fix: creating a listing no longer reports a false "is required" error on a custom field that is already filled.
* Fix: map markers no longer disappear when another plugin or theme also loads Google Maps on the page.
* Fix: map search form fields keep their border and full width regardless of the active theme.
* Fix: HTML in a field's Description (help text) now renders on the listing form instead of showing as raw tags.

= 2.1.1 - 2026-08-12 =
* New: the Listing body element can hide the name (label) of any field individually on the listing page.
* Improvement: a directory listing page now shows an images gallery under the title by default.
* Improvement: after an update, the migration wizard opens automatically when there is legacy data to migrate.

= 2.1.0 - 2026-08-11 =
* New: the [webdirectory-listings] shortcode accepts "categories" and "locations" attributes (term ids or slugs, comma-separated) to pin a listings grid to specific categories/locations.
* New: label-type map markers (the Rating chip and field-value labels) now take per-source background AND text colours - set them in Edit Map → Markers (the same colour control the dots use); background default white, text default #333. The Opening hours label gets two backgrounds - one for Open, one for Closed.
* New: an alternative HTML marker mode - map markers rendered as real DOM elements instead of on the canvas, switchable in the Markers "Advanced" panel (canvas stays the default).
* New: a Globe projection option for Mapbox and MapLibre directory maps (Edit Map, next to the map style) - a 3-D globe when zoomed out, flattening to the normal map as you zoom in.
* New: give a directory a default filter (category, location, tag, author, custom fields or specific listings). A visitor's search overrides it field by field.
* New: "Hide listings until search" option for the Listings block - the grid stays empty until the visitor searches.
* New: a Slider element for directories - a looping, swipeable carousel of listing logos with an optional name, rating and "Featured" badge. Also the [webdirectory-slider] shortcode and WPBakery / Elementor elements.
* New: the listing-page Images gallery gains a Display option - Gallery or Slider; clicking an image still opens the lightbox.
* New: a one-click front-end self-test that checks the directory works on the live site, catching problems caused by other plugins.
* New: a dismissible notice on the plugin's admin pages introducing the full Web 2.0 Directory edition (front-end submission, membership & payment plans, technical support).
* Improvement: the [webdirectory-map] shortcode now takes a map by id, slug or name - use id="..." (the old map_id still works) - and with no map given it shows all listings on a map with the default settings.
* Improvement: the directory's Map element shows a "Create new map" button when the site has no maps yet, instead of an empty picker.
* Improvement: with "Follow the map" on, the Listings block shows the map's matching listings as the normal grid - count, sort and pagination - instead of the scrolling sidebar.
* Performance: on a page with a map and search but no listings grid, the map search loads only the markers.
* Improvement: the reCaptcha settings page lists which forms reCAPTCHA protects, above the enable switch.
* Improvement: listing cards, map popups and the map sidebar lead with the photo as a cover image - flush to the top edge, rounded top corners, softer card corners.
* Improvement: a new directory opens with its General settings filled in - labels, slugs and the listing form template - instead of blank boxes. These are the values it already used behind the scenes, so existing directories are unchanged.
* Fix: the rating field's "Icon size (px)" box (search-form builder and the directory's rating element) now accepts any value you type - it no longer jumped to the maximum when you typed a smaller number such as 20.
* Fix: a directory whose page is built with the [webdirectory custom_home] shortcode (for example inside a page builder like Divi or Elementor) is now recognised as that directory's page, so "Open page" opens it instead of offering to create a duplicate.
* Fix: migrating a custom field whose icon was an uploaded image no longer produces a broken icon - such fields fall back to their default icon.
* Fix: a label marker’s connector “tip” no longer detaches or collapses to a sliver at steep/diagonal angles - it now hugs the pill’s rounded corner cleanly (canvas and HTML markers).
* Fix: the directory layout now adapts at the tablet / mobile endpoints set in the layout editor, instead of a fixed ~782px width.
* Fix: the on-map search form's collapse toggle is now shown only in full-screen - where its folded/expanded state is remembered - so leaving full-screen returns the form to expanded instead of leaving it stuck folded on the page.
* Fix: the search form's Radius slider spans the full form width now, aligned with the other fields (its stray side padding is gone).
* Fix: in the setup wizard, the map step opens the map created during setup or migration instead of starting a blank one and leaving you a duplicate.
* Fix: the rating marker's text size now actually resizes the label on Mapbox and MapLibre maps, and markers stay locked to their spot while the globe rotates.
* Fix: the directory map no longer shows a false "Google Maps API key is not configured" notice when the key is set - it was removing its own map script along with conflicting ones.
* Fix: permanently deleting a listing no longer leaves empty "ghost" cards in its directories - stale search-index rows now go with the listing, so the results count matches.
* Fix: words no longer break in the middle at the end of a line. The 4-line trim on Content and other text fields used a legacy CSS box that ignored word-wrapping rules (most visible in Firefox); it now trims by height, so text wraps at spaces. Pasted text is also cleaned of invisible characters that force breaks, and the listing page's field values and the directions panel are covered too.
* Fix: the admin reminder about a missing Google Maps API key shows its bold text and settings link instead of raw HTML tags.
* Fix: in the listing-form builder, a field's chosen icon shows in the Field Properties panel right away instead of looking blank until you re-select it.
* Fix: in the listing-form builder, dropping a field back in the same place no longer leaves it dimmed.
* Fix: deactivating and reactivating the plugin no longer breaks permalinks - rewrite rules are flushed on the next page load, once the post types and URL rules are registered.
* Fix: on page-builder pages (Elementor, WPBakery, blocks), listing links point to the correct directory URL instead of the raw /w2dc_listing/ address.
* Fix: when editing a map, the live preview applies unsaved settings again (style, colours, controls).
* Fix: the image lightbox's previous / next arrows are vertically centred whatever the theme's button styles.
* Fix: migration now carries over the map engine and API key, and no longer adds a map where the old site had none.
* Fix: migrated directories come with a working search form (Address, Radius, Keyword, Categories, Locations) instead of an empty search area.
* Fix: with Yoast SEO, listing, category and location pages get their own page title again.
* Fix: a website address can be entered without "https://", and an email pasted with a stray space is no longer rejected.
* Fix: when a cookie-consent plugin (for example Avada's Privacy option) holds back the Google Maps script, the map now says it is waiting for consent - and loads once cookies are accepted - instead of "Google Maps API key is not configured".
* Fix: an enabled "Content" field shows on listing cards and map popups again. On some sites (typically after migrating) it was silently dropped even though the listing editor still showed it.
* Fix: the listings pager no longer shows the theme's bullet points in front of the page numbers.
* Fix: "Show radius circle" now works on the live map, not just the Edit Map preview - drawn at load from the map's own "Show markers in radius" radius, moved to a visitor's address + radius search, and framed by the camera when it is wider than the saved zoom.
* Developer: the shared listing-field markup (cards, map popups, sidebar) now carries neutral `…-listing-content__*` class names alongside the historical `…-popup__*` ones. Custom CSS keyed on the old names keeps working - they are kept as deprecated aliases.

= 2.0.5 - 2026-08-06 =
* New: a listing's images can be reordered by dragging their handle in the editor - the first image (or the one marked as the logo) becomes the main image.
* New: the on-map search form gains a collapse/expand toggle beside the drag handle - both shown by the "Allow form drag and toggle" option (Edit Map → Search form).
* Fix: choosing a different main image (logo) - or reordering a listing's images - now takes effect on the front. The listing renderer was reading a pre-rebuild image key and ignored edits made in the editor, so the main image "stuck" on the first image; it now honours the current image order and the chosen logo.
* Fix: after migrating a legacy site, category / location / listing links no longer open the directory home instead of the right page - the migration deterministically rebuilds the directory URL rules, and a "Rebuild directory routing" button on Tools → W2DC Migration re-applies them on demand.

= 2.0.4 - 2026-08-05 =
* New: the directory elements are available in both the WPBakery / Visual Composer and Elementor page builders, using the same element names, so pages built with them render and stay editable.
* New: listing cards gain a Cover / Contain image-fit option alongside the aspect-ratio control.
* Fix: migrating from a legacy directory no longer risks published listings being switched to Draft - old carried-over expiration dates are grandfathered to "never expire" and the hourly expiration check is paused until the migration finishes (with automatic repair of any listings a previous run had suspended).
* Fix: the migration no longer stalls with an "Unexpected token" error on large sites - the heaviest step now runs one custom field per request and automatically retries and resumes after a server timeout.
* Fix: listing and directory links work right after migration - permalinks are refreshed automatically (no need to re-save Settings → Permalinks).
* Fix: the "Preview" button and "View Listing" link are back on the listing editor.
* Fix: migrated directories show a working map instead of an empty map area.

= 2.0.3 - 2026-08-04 =
* New: a "Map language" setting - show Google Maps place labels, Places autocomplete and the geocoder in a chosen language (e.g. English), independent of the site language.
* Fix: a new listing created in the WordPress admin now publishes reliably even when the form takes more than a minute to fill in - WordPress' autosave could previously leave it as an unpublished draft that was missing from the Listings list and the map.
* Fix: the public directory map no longer breaks with a "Cookie check failed" (403) error on cached pages or after a long-open session - its read-only data is now fetched without a REST nonce, so full-page caches and expired sessions can't stop it loading.

= 2.0.2 - 2026-08-03 =
* Security: only users allowed to submit listings can upload files; uploads are limited to safe file types and a maximum size, and low-privilege users are rate-limited.
* Security: through the API, users can now only view and edit their own listings.
* Security: anonymous star ratings are counted once per visitor and rate-limited (with optional reCAPTCHA) to stop rating spam.

= 2.0.1 - 2026-08-02 =
* Packaging: restore the historical main plugin file name so updates from earlier versions apply cleanly without deactivating the plugin. No functional changes.

= 2.0 - 2026-07-31 =
* Rebuilt on the shared SalePHP engine: the directory core (categories, locations, tags), the custom listing-form builder, maps (Google, Mapbox, MapLibre) and advanced search.
* Hardened request-input sanitization across admin handlers; added a nonce and capability check to the license-notice endpoint; guarded a CSV image path against traversal.
* No self-hosted updater or license checks - updates are delivered through WordPress.org.
* Trimmed the bundled demo payload (removed compressed archives and the large country sample data).
* Routed internal diagnostics through a WP_DEBUG-gated logger so production logs stay quiet.
