Changelog

Everything that shipped, with the date it shipped.

Taken straight from the plugin's own changelog rather than rewritten for the website, so what you read here is what is inside the download.

12releases
538documented changes
1.7.0current, September 2026

1.7.0 Current

September 2026

129 changes across free and Pro

Listora

Every price, credit figure and map now follows the site's own settings instead of a value baked into the code, and a switched-off feature stops advertising itself.

New

  • Site Health warns you when WooCommerce is set to a different currency from Listora, since a member would then see one currency and be charged in another. Listora shows one currency everywhere rather than mixing them, so this is the place it can be spotted.
  • Site Health tells you when your maps have no tile source and will therefore draw on a blank background, with a link to the setting. It stays quiet on a site whose listings have no locations, since there is nothing to draw.
  • Listora now tells you when a page it created is not linked from any menu, and offers to add it. A page can be published, mapped and working while no visitor can reach it, and every admin screen reported success - so the one thing missing was the one thing nobody was told about.
  • Settings > General > Pages offers Create page on any row reading Missing, so a deleted page can be brought back without hand-building one with the right block in it.
  • Listings on a plan that renews itself now do so from the member's credit balance instead of expiring. If the balance will not cover it the listing pauses rather than expiring, and comes back on its own the moment they top up.
  • Going to buy credits from the listing form no longer loses the listing. It is saved as a draft first, and the credits screen offers a link straight back to it, opened on the plan you were choosing.

Improve

  • The Submission form style setting now says that adding or editing from inside the member dashboard always uses the single page form. The setting only governs the standalone Add Listing page, and nothing said so - so it looked broken to anyone testing it from the dashboard.
  • It offers only pages people navigate to. Compare Listings and Buy Credits are reached from a button on a listing or a plan, so they are never suggested for a menu.
  • It adds to the menus you already use for Listora pages, which on themes with separate logged-in and logged-out menus means both - not just the one members see. A page you have deliberately placed in only one menu is left alone.
  • Listora admin screens now have a proper page heading, so screen readers announce where you are.
  • A Compare page built with the old [listora_compare] shortcode is recognised as your Compare page, so the plugin does not offer to create a second one beside it.
  • A Listora page is created once per site and never re-created behind your back, so a page you delete stays deleted.
  • A web address on its own is no longer accepted as a listing title. It became the business name on the card, the page and the permalink, which is what automated spam posting looks like. Names that contain a domain, such as Booking.com, are unaffected.
  • The Buy Credits link on a plan you cannot afford is a full-size tap target on phones, rather than a line of text under half the usual size.
  • Service prices follow the site currency everywhere they appear, so a directory trading in yen or euro no longer shows dollar amounts on listing pages and the member dashboard.
  • Zero-decimal currencies such as JPY render without decimal places, and whole amounts drop the trailing zeros.
  • The submission map picker draws the tile source configured in Settings > Maps, matching the directory map instead of always loading OpenStreetMap.
  • A directory with no tile source configured shows an unstyled picker rather than quietly loading a third party's tiles; panning, zooming and dropping a pin still work.
  • Photos uploaded through the submission form are now attached to the listing they belong to, so they appear under it in the Media Library instead of the Unattached pile.

Fix

  • The Upgrade and account links in the admin now point at pages that exist. Three of them led to 404s on the store.
  • Changing the listing type in search now narrows the Features checkboxes to the ones that type allows, instead of leaving the previous type's list on screen. Any feature that no longer applies is unticked rather than left filtering results down to nothing.
  • Submitting a listing with a feature its listing type does not allow is now refused with a clear error, naming the field. It used to return success while quietly discarding those features, so a member could not tell that part of what they chose had been thrown away.
  • Turning off Listing Submission now hides every invitation to submit, not just the dashboard button. The empty state still offered Add Your First Listing, and the form it led to then explained submissions were closed.
  • The dashboard header no longer leaves an empty bar when there is nothing to put in it.
  • Credit pack prices now show in your currency like every other price. The credits screen could show one currency while the rest of the site showed another.
  • Your currency setting is now used everywhere a price appears. Prices entered before you changed currency kept showing the old symbol, because the code stored on the row outranked your setting - so a site switched to yen still showed dollars on older listings.
  • Search engines are told the same currency your visitors see. The structured data read WooCommerce's currency instead of yours, so a site set to yen displayed one currency and reported another - and invented one entirely on sites with no WooCommerce.
  • The map on a listing now uses the map tile source you set in Settings. It ignored that setting entirely and always drew OpenStreetMap tiles, so a site that had configured its own tile server saw its choice applied to the submission map picker and nowhere else.
  • A page whose feature is switched off no longer serves visitors a blank page. It returns a proper 404 instead, and Settings > Pages marks the row Feature off with what to do about it. Turning the feature back on restores the page exactly as it was.
  • Admin notices on Listora screens are visible again. The pages had no heading for WordPress to place notices after, so they were being dropped into a hidden tab panel - present on the page, readable by nobody.
  • The Settings screen no longer draws its header twice.
  • Links to a Listora page are no longer dropped because the page was edited. Whether a link could be shown was worked out in four different places, and one of them required the page to still contain the original block - so rebuilding your Compare page with your own layout removed the Compare link from the site.
  • No Listora link now points at a draft page a visitor cannot open.
  • Editing one of the plugin's pages no longer creates a duplicate. Replacing the block on the Buy Credits page with your own layout made the plugin decide the page was not its own, create a second one at buy-credits-2, and point every Buy Credits link at the empty new page while the page you wrote sat orphaned.
  • Deleting one of the plugin's own pages no longer breaks the links that pointed at it. The page mapping kept the deleted page's identifier, so links to it rendered empty and buttons quietly fell back to whatever other address they knew. The mapping now re-attaches to a page carrying the same block, exactly as it already did when the mapping was missing altogether.
  • After paying for credits, the order confirmation now links straight back to the listing you were part-way through. The link was lost in the checkout redirect, so members finished paying and were left on a receipt whose only listing link started a new one.
  • The Add Listing block now has a Form Layout control in the editor. The setting existed and was honoured, but was never shown, so a block saved as a wizard or single form could not be changed back and a site owner who altered Settings > Submissions saw nothing happen with no way to find out why.
  • A listing type restricted to certain Features & Amenities now shows only those on the Add Listing form. Every feature on the site was offered whatever the type, so the setting had no visible effect.
  • Validating a Pro licence from the upgrade screen works again. It was checking a licence server on a retired domain, so every key came back as "could not be validated" - which reads as a bad key rather than a broken check. It now asks the Wbcom store, where the licence actually lives.
  • Plugin links, documentation links and the author link point at wbcomdesigns.com. Several went to a domain that no longer resolves, and a few others to store pages that had moved.
  • Autosave and Save Draft work throughout the form. Both were rejected until the Terms of Service box on the final step was ticked, and the failure was never shown, so nothing was saved while you were still typing.
  • Every autosave now updates the same draft. Only the first one was stored; later ones were turned away as duplicates while the form still reported "Draft saved".
  • Editing a listing no longer demands the Terms of Service box be ticked again. A saved draft still requires acceptance before it goes live, and that acceptance is now recorded against the listing.
  • A draft saved before the Terms of Service step no longer records an acceptance that was never given, which had pre-ticked the box on the way to publishing.
  • Members who buy credits through a mapped WooCommerce, MemberPress or Paid Memberships Pro product can see their Credits tab and balance again.
  • A directory selling credits only through a mapped product no longer tells members that credits are not on sale.
  • The Credit Transactions screen shows credit counts, so a 50-credit purchase reads as 50 rather than 5000.
  • The Credits Issued and Credits Used totals report credits instead of raw ledger values.
  • The Item ID column shows a dash on top-up rows instead of a meaningless zero; the purchase reference remains in the Note column.
  • The refund dialog lays out as a centred panel with its fields stacked and aligned.
  • Total Revenue follows the site currency instead of always showing a dollar sign.
  • Turning the Listing Submission feature off hides the dashboard Add Listing button, and the Add Listing page explains that new listings are closed rather than rendering an empty screen.
  • The directory's no-results empty state could still offer an Add a listing button after submissions were turned off, leading to a page that said new listings were closed. It is now hidden along with every other submission invitation.
  • Turning off new submissions no longer blocks editing an existing listing. The page used to show "New listings are closed" before checking whether you were editing, so an owner following an Edit link on their own listing saw that message instead of their listing.
  • Uploading photos in the submission form works again on WooCommerce sites. WooCommerce redirects members without publishing rights away from wp-admin, and the wizard's photo picker posted through wp-admin, so gallery and custom-image uploads had no working path for exactly the members submitting listings.
  • Permanently deleting a listing now deletes its featured image and gallery photos with it, instead of leaving every uploaded file behind on disk. An image still used by another listing is left alone.
  • Uninstalling the plugin now removes listing images along with everything else, instead of leaving gallery photos behind on any listing created before 1.7.0.
  • Buying credits directly with Stripe or PayPal (outside a WooCommerce, MemberPress, or Paid Memberships Pro product) now completes. Direct checkout was missing a required pricing configuration, so every attempt failed before reaching the payment gateway.
  • If the payment confirmation from the gateway is slow or does not arrive, credits now still land when you return to the site after paying, instead of never being added.
  • The credits screen no longer tells you credits have been added before they actually have. It now says payment was received while crediting is in progress, and confirms once your balance updates.
  • Settings and Credits screens no longer show misaligned field columns, labels sitting flush against the card edge, or fields spilling outside the card padding, wherever in the page a section renders.
  • Currency and product dropdowns in the admin no longer clip the bottom of their text.
  • The Save/Reset bar on long settings screens, such as Credits, now stays visible as you scroll instead of being left far up the page.
  • Admin buttons and links share one consistent style across the whole plugin section, instead of some picking up the active theme's button styling.

Security

  • Features outside a listing type's allowlist are refused when a listing is saved. Only the form limited the choice, so a direct API call could attach any feature to any type.
  • Files uploaded to prove a business claim are stored under an unguessable name, and the claimant is no longer handed a direct link to their own upload. The file kept the name it was given, so an address like /uploads/2026/08/drivers-licence-scan.png could simply be guessed.
  • The companion-plugin installer only downloads from the Wbcom store over HTTPS. It previously installed whatever download address the store replied with, so a spoofed or compromised reply could have installed other code.
  • Changing the email address on an account now needs the current password, and the new address has to confirm before anything moves. It used to change immediately, so a stolen session or an application password was enough to take the address and then reset the password.
  • A member without publishing rights can no longer put a listing live by asking for the expired status. It skipped moderation, the terms gate and the duplicate check, and the page was readable by anyone with the link.
  • Photos and files can only be attached to a listing or service by the member who uploaded them. Media IDs were accepted on trust, so any file in the library could be attached to someone else's listing and its address published.
  • Services switched off by their owner are no longer readable by the public. Asking for them by status, or by their own address, returned the title and price of a service the owner had deliberately hidden.
  • Credits are no longer granted for an order nobody has paid for. Cash on Delivery, cheque and bank-transfer orders move to processing while still unpaid, and the mapped credit pack was credited at that moment - a buyer could order, receive credits, spend them and never pay. Credits now wait until the payment is recorded, including when a shop marks a cash order completed later.

Dev

  • Added wb_listora_get_feature_allowlist_map(), used by both the submission form and the search filters.
  • wb_listora_refuse_disallowed_features restores the previous drop-and-accept behaviour for a site that prefers it.
  • Guardrail G18 fails the build on a frontend submission CTA that does not check the feature toggle.
  • Guardrail G16 fails the build on a hardcoded map tile URL, G17 on a price rendered with a per-row or hardcoded currency.
  • Documented what contract_version promises: it versions the shape of /settings/app-config and nothing else, not the values a field returns. See docs/REST-API.md.
  • Added the is_available page-registration key, wb_listora_hide_unavailable_pages, and Page_Registry::key_for_page().
  • Added wb_listora_get_public_page_url() and the default_shortcode registration key.
  • Added wb_listora_ensure_page() and wb_listora_create_page() as the single page-creation path, and the wb_listora_page_created action.
  • New `wb_listora_should_expire_listing` filter lets an extension keep a listing alive at the moment the expiry sweep would retire it, and `wb_listora_renew_listing()` runs the ordinary renewal from code that has no REST request to hand.
  • New `wb_listora_credit_purchase_paths()` reports which credit purchase routes are live, replacing three separate answers that could disagree with each other.
  • New `wb_listora_credit_purchase_paths` filter lets an extension declare its own purchase route.
  • New `wb_listora_delete_listing_media` filter turns off the image cleanup above for an owner who wants images kept; `wb_listora_listing_media_deleted` action fires with what was removed.
  • Admin RTL stylesheets are now generated at build time from their LTR source instead of hand-maintained, so they can no longer drift out of sync.
  • Deleting one of the plugin's pages now clears its page-mapping option immediately rather than leaving it pointing at a deleted page until next read. New `wb_listora_page_mapping_forgotten` action.

Compat

  • The bundled Wbcom Credits SDK is updated to 1.6.0, bringing gateway and adapter fixes that a forked copy had been holding back.

Listora Pro

Credit figures on the admin screens now match what members see, and a mapped product counts as a real way to buy. Ships in lockstep with WB Listora 1.7.0.

New

  • Turning on Reverse Listings now creates the Post a Need and Browse Needs pages, the way Compare and Buy Credits already did. The feature used to switch on with both of its entry points leading nowhere, and nothing said a page had to be made or which block belonged in it. Sites already running the feature get the pages on update.
  • A plan can renew itself from the member's credit balance. Tick Auto-renew on any plan with a listing duration; when the listing reaches the end of that duration the plan cost is deducted and it keeps running. No card is charged and no gateway is involved - members buy credits up front, so a renewal is only a deduction.
  • A listing whose owner is short of credits at renewal pauses instead of expiring, and resumes automatically as soon as they top up.
  • A pricing plan can be restricted to specific categories, so one part of the directory can be priced differently from another even when both share a listing type.

Improve

  • Switching a feature on from Settings still creates its page, since that is you asking for it.
  • The Credits Page setting is now only in Settings > General > Pages, alongside every other page, instead of also having a second picker on the Credits tab that wrote the same setting.
  • Buy Credits appears in Settings > General > Pages alongside the other pages, so it can be re-mapped and its status seen. It stays on the same setting, so nothing moves on update.
  • Needs has one address instead of two. The listings lived at both /needs/ and /browse-needs/, so a site owner customised one page while visitors, shared links and the "View Need" button led to the other, which ignored their layout. The page now answers /needs/ and the duplicate archive stands down for it.
  • Existing sites are moved onto the single address on update, and the old /browse-needs/ address redirects to it permanently, so bookmarks, menu links and search results keep working. A site that already has its own page at /needs/ is left exactly as it is.
  • The profile tab holding a member's own reviews is now called "Reviews I Wrote" instead of "My Reviews". On a listing page the two sat side by side and read as the same thing at a glance - especially in German, where they rendered as "Bewertungen" and "Meine Bewertungen" - so members looking for a listing's reviews opened their own history and concluded the listing had none. Site owners can change the wording with the wb_listora_pro_bp_reviews_nav_label filter.
  • The Buy Credits link on a plan the member cannot afford saves their listing as a draft before leaving, so nothing typed into the submission form is lost while they go and buy credits.
  • That link is a full-size tap target on phones, rather than a line of text under half the usual size.
  • The monetization notice names the route members can actually buy through, rather than only confirming that one exists.

Fix

  • The credit-packs API no longer advertises a Buy link for a pack that has no real checkout destination. A pack whose URL points back at the Buy Credits page reached apps and other API clients as a working link, while the website already hid it - so the same pack offered a dead button in one place and an honest "Checkout unavailable" in the other. Each pack now also states checkout_available.
  • Activating Pro no longer publishes pages onto your site uninvited. Comparison, Buy Credits and Reverse Listings each want a page, so activating with any of them already enabled added that page to your menus and sitemap without asking. Pro now tells you which pages are missing and creates them only if you press the button.
  • A need waiting for moderation no longer shows as Open. It read the marketplace status and ignored whether the need was actually published, so an owner was told their need was live and taking responses while nobody could see it. It now reads Awaiting review, on the dashboard and on the need page.
  • A need with no usable posted date shows Date unknown instead of November 30, -0001.
  • The My Needs badge counts down as you accept or reject, instead of holding the old number until the page is reloaded.
  • Activating Pro could fail outright with a fatal error naming a class, introduced earlier in this release cycle. Activation now completes.
  • The Compare link no longer disappears when you rebuild the Compare page with your own layout, and no longer goes stale for up to an hour after you re-map it.
  • Buy Credits and Compare Listings no longer create a duplicate page when you edit the one they made. Both are created through the same single path as every other Listora page now.
  • A page whose Needs page has been deleted serves the listings again rather than a dead link. The archive returns automatically whenever no page holds the address, and stands down again when one is created.
  • A need owner can see and act on the responses they receive again. The badge reported "1 response (1 pending)" while the list underneath said nobody had responded, so there was no way to accept or reject anyone - a dead end for the whole needs marketplace.
  • Posting a need no longer reports a failure that did not happen. The need was created, then a JavaScript error replaced the success message with "Cannot read properties of undefined", so members retried and posted twice.
  • My Needs and My Responses appear on the member dashboard as soon as Reverse Listings is turned on. Both tabs waited until the member had a need or a response before showing themselves, so a vendor with zero responses - exactly who the tab is for - could not see it, and turning the feature on appeared to do nothing.
  • Plugin and author links point at wbcomdesigns.com. They referenced a domain that no longer resolves.
  • Members who buy credits through a mapped WooCommerce, MemberPress or Paid Memberships Pro product can see their Credits tab and balance again.
  • A directory selling credits only through a mapped product reports as ready instead of claiming no credit packs exist.
  • The Credit Transactions screen shows credit counts, so a 50-credit purchase reads as 50 rather than 5000.
  • The Credits Issued and Credits Used totals report credits instead of raw ledger values.
  • The Item ID column shows a dash on top-up rows instead of a meaningless zero; the purchase reference remains in the Note column.
  • The refund dialog lays out as a centred panel with its fields stacked and aligned.
  • Total Revenue follows the site currency instead of always showing a dollar sign.
  • Credit Rate and Receipt Business Details on the Credits settings tab line up with every other field on the tab, instead of sitting flush left with no spacing above or below.
  • The Supported Payment Plugins list on Settings no longer breaks a provider's name mid-word or produces rows of uneven height; each provider is now a single full-width row.

Dev

  • Added the wb_listora_pro_feature_page_map filter for mapping a feature toggle to the pages it needs.
  • Added the wb_listora_needs_has_archive filter to restore the previous two-address behaviour on a site that needs it.
  • BuddyPress profile links are built through one version-aware resolver instead of calling functions BuddyPress has flagged for removal, and the profile menu is skipped rather than rendering relative links when BuddyPress cannot place the member yet.
  • Removed three admin methods that nothing could reach: the leftover Credit Mappings and Tools page renderers, whose menu entries have redirected to Settings since 1.2.0, and a duplicate verified-badge emitter the Verification feature already owns.
  • RTL admin and frontend stylesheets across Pro are generated from their LTR originals instead of hand-maintained, closing gaps of up to a thousand lines where RTL admins were seeing different CSS than everyone else.
  • Credit surfaces resolve through Free's `wb_listora_credit_purchase_paths()` rather than a second answer maintained here, so the two plugins can no longer disagree about whether a site can sell credits.

Compat

  • Requires WB Listora 1.7.0. Install both updates together.

1.6.0

August 2026

77 changes across free and Pro

Listora

Makes the interactions the interface already advertised actually work, gives automation and webhooks a published contract, and enforces Terms of Service acceptance on the submission API.

New

  • Listing photos display as a carousel, so every image stays reachable without scrolling back to the thumbnails.
  • The featured image box accepts a dragged file, which its label has always offered.
  • Members can set amenities when submitting or editing a listing, instead of only administrators from wp-admin.
  • Tags are a discovery dimension: they filter search, appear as a facet, and render as clickable chips on cards and listing pages.
  • A listing's video is rendered on the listing page rather than only stored.
  • Services can be added, edited and deleted from the member dashboard.
  • Automation and webhook subscribers can discover every available trigger from a published registry, with a JSON schema per event.
  • The submission API accepts a complete `categories` list for clients that manage the full set.
  • Features can be limited to specific listing types, so a Jobs page stops offering classified-ad amenities.

Improve

  • An icon chosen in the admin picker is always one the front end can draw, so a selected icon can no longer vanish.
  • Search filters and the submission form offer only the categories and features the selected listing type allows.
  • Every endpoint returns the same `featured_image` shape, so a client no longer has to handle three variants.
  • Every human-facing string leaves the API decoded, so ampersands and apostrophes render as typed.
  • Review criteria saved against a listing type are the criteria the review form and averages use.
  • Related Listings can be extended from a child theme through dedicated hooks.
  • Health Check reports whether the search index is actually populated and indexed, not merely that its table exists.
  • The dashboard checklist now guides owners through monetization setup in the order it has to happen.
  • Terms of service is mapped once, by choosing the page your site already has, and every surface links to it.

Fix

  • Editing a listing no longer deletes the categories the single-select form cannot display.
  • Saving a new listing type, and resetting settings, now confirm they worked instead of reloading silently.
  • Each member dashboard tab now titles the page after itself, instead of every tab reading "My Listings".
  • Upgrading records the map tile source it was already using, so existing maps keep rendering and the source is now visible and editable.
  • A map tile URL keeps its {z}/{x}/{y} placeholders when saved, so tiles load instead of every request returning 404.
  • The setup wizard asks for a map tile server, so a fresh install is not left with a map it cannot draw.
  • A site using Google Maps shows the map again, instead of an "unavailable" notice asking for a tile source Google never uses.
  • The "Open Map settings" link, and the dashboard checklist's map item, land on the Map tab instead of falling back to General.
  • Editing a service shows the category it is filed under, instead of an empty dropdown.
  • Preview Your Listing lists the features you ticked by name, instead of their numeric term IDs.
  • Service Categories has an admin screen, so the category dropdown on the member service form can actually be filled.
  • Preview Your Listing groups the features you ticked into one row, instead of repeating the heading for each one.
  • The listing header address no longer repeats the city and state, and no longer drops the postal code.
  • Brand-coloured text meets AA contrast whatever accent colour the site or its theme uses.
  • Credits status now reads the same on every screen, so members are no longer told to contact an administrator on a site that can take their payment.
  • A listing whose category sits outside its type's allowed list can be edited and saved again.
  • A search cache lifetime of 0 disables caching, rather than caching permanently.
  • Rebuild Search Index now rebuilds the index instead of reloading the page.
  • The map picker renders and accepts a dragged marker on the wp-admin listing editor.
  • The favourite heart on the dashboard sits over the card image and responds to clicks.
  • Approving or rejecting a claim from wp-admin now notifies the same listeners the API path does.
  • Category names containing an ampersand display correctly in the submission form.
  • A site missing a canonical page no longer white-screens after an update.
  • A review held for approval now says so and keeps saying so, instead of the confirmation being wiped by a page reload that had nothing to show.
  • Automation trigger labels translate again, and no longer fill the debug log with a notice on every page load.

Security

  • Submitting a listing now requires a valid listing type, so listings can no longer be created without one.
  • Terms of Service acceptance is enforced on `POST /submit`, which previously accepted a submission with no consent recorded. Clients that cannot send `agree_terms`, including sites that hide the checkbox, opt out with `add_filter( 'wb_listora_require_terms_acceptance', '__return_false' )`.

Dev

  • New helper `wb_listora_directory_is_operational()` reports whether an install is a working directory, wizard walked or not.
  • New public helpers: `wb_listora_render_icon()`, `wb_listora_get_icon_choices()`, `wb_listora_get_review_criteria()` and `wb_listora_decode_text()`.
  • New public helper `wb_listora_sanitize_tile_url()` sanitizes a tile template without stripping the placeholders Leaflet substitutes.
  • New hooks: `wb_listora_before_related_listings`, `wb_listora_after_related_listings` and `wb_listora_require_terms_acceptance`.
  • `/search` accepts a `tags` argument; `/settings/app-config` publishes `contact_path`.
  • Database version moves to 1.6.0; the migration clears cache entries written without an expiry and runs on activation.

Listora Pro

Adds the low-balance credit alert, restricts pricing plans to listing types, and rebuilds outgoing webhooks on the trigger registry Free now publishes.

New

  • Members are emailed once when their credit balance falls to the configured threshold, which the setting has always promised and nothing delivered.
  • A pricing plan can be restricted to specific listing types, so a plan only appears for the types it applies to.
  • The Moderators screen paginates, offers bulk actions, and searches all users, so moderators can be managed beyond the first fifty.

Improve

  • Outgoing webhooks offer only events that can actually be delivered, read from the trigger registry rather than a hand-maintained list.
  • Every webhook payload carries a schema version and a per-subscriber delivery id, and uses the same entity shapes the REST API returns.
  • Badge pill icons are rendered on the server, so they appear on the front end instead of staying blank.
  • Monetization setup appears on the Listora dashboard checklist, in the order it has to be done, and is hidden when monetization is off.
  • Comparing listings of different types now shows one table with every listing side by side, instead of a separate table per type.
  • The unlicensed-site notice describes only what an owner can act on today: updates are paused, website features are unaffected.

Fix

  • Saving a badge returns to the badge list instead of leaving the form open.
  • The Pro welcome banner no longer appears on a directory that is already live, and dismissing it is permanent.
  • Activating the licence on the Plugins screen is reflected in the Pro setup wizard, and the reverse.
  • The Saved Searches and Analytics dashboard tabs title the page after themselves.
  • Active Mappings shows the provider and product names, and falls back to their identifiers rather than blank cells.
  • Buy Credits, the member dashboard, Transactions and Credit Mappings all report the same monetization status.
  • The "Open Features" button shown when monetization is off now opens the Features settings, instead of a page that refuses access.
  • The compare shortcode renders the same table as the block, so both entry points behave identically.
  • Comparison column headers align with the values beneath them.
  • The /needs/ archive now shows the needs marketplace with search and filters, instead of a plain post list.
  • Quick Edit no longer clears a plan's listing-type restriction.
  • The claim audit trail records the listing a claim targets, and records approvals made from wp-admin.
  • Bulk moderator actions report how many rows were actually changed.
  • Posting a need with a listing type that does not exist is rejected, and existing needs that carried one are cleared on upgrade.

Dev

  • New filters `wb_listora_pro_email_credits_low_view_data` and `wb_listora_pro_email_credits_low_subject`, plus an overridable `emails/credits-low.php` template.
  • Claim and credit action listeners accept fewer arguments without fatal errors, so a third-party integration firing a public action cannot take the site down.

Compat

  • Requires WB Listora 1.6.0. Install both updates together.

1.5.0

August 2026

88 changes across free and Pro

Listora

Adds split-shift business hours and member blocking, corrects a credit unit mismatch that showed the wrong balance, and closes a data-exposure gap on listing services.

New

  • A day in Business Hours can now hold up to three time ranges, so a split shift such as 08:00-12:00 and 17:00-22:00 is finally expressible.
  • Members can block a reviewer from the review card and unblock from their dashboard, so blocking is no longer one-way.
  • Bulk Edit and Quick Edit can set the listing type, so retyping a batch of listings no longer means opening each one.
  • Administrators can change a listing's type directly from the listing screen.
  • Site owners choose which platforms the Social Links field offers, in Settings, rather than taking the full built-in list.
  • Site currency symbol, position, and decimal precision are now published to connected apps, so prices display the way the site formats them instead of falling back to a generic currency code.
  • Map tile source and attribution are published to connected apps, so native maps render the same tiles as the website.
  • Two repair commands, wp listora repair-locations and wp listora repair-credit-ledger, report what they would change and only act when asked; the credit repair adds a correcting entry and never removes credits already granted.

Improve

  • The plugin is fully translatable for the first time: 284 previously untranslatable strings were exposed, the JavaScript layer is translated, and ten locales ship complete.
  • The setup checklist no longer asks owners to configure settings that do not exist, so it can actually reach complete.
  • Owners are warned when a listing type is open for submission but has no categories, instead of members meeting an unusable form.
  • A review left by a since-deleted account reads as Former member, and one anonymized under a privacy request reads as Anonymous, rather than showing nothing.
  • Abbreviated and zero-decimal currencies render correctly, and a new filter allows a custom symbol, suffix position, or precision.
  • Records left behind by listings deleted on earlier versions are now cleared automatically by the daily cleanup, instead of only when the cleanup command was run by hand.
  • Filtering reviews or claims by status is substantially faster on large directories, and sorting listings by Views no longer scans the whole analytics history.
  • The admin Reviews screen loads author names and listing links in one batch instead of one lookup per row.

Fix

  • Right-to-left sites no longer request a stylesheet that does not exist on every page load.
  • A listing paused for credits can now be activated by a member who already has enough, instead of being told to buy credits they do not need.
  • A listing whose plan was deleted now says so, rather than promising it will activate on its own and sending the member to an empty credits store.
  • The listing header no longer shows Verified twice, and no longer repeats the city and state that are already part of the address.
  • The Reviews screen in wp-admin now distinguishes a review left by a deleted account from one anonymized under a privacy request, matching what the listing page shows.
  • Photos attached to a review now appear on the listing page; they uploaded correctly and were never shown back.
  • The My Listings counter now includes listings awaiting credits, and every other status the list shows; it could read zero above a listing you could see.
  • Keyboard focus stays inside an open dialog instead of moving to the page behind it.
  • The map now plots the search that is actually running: filtering the directory left the map showing pins for listings the results had excluded.
  • The saved-count beside a listing's Save button updates when you save, instead of waiting for a page reload.
  • Credits are awarded and spent as credits rather than the ledger's internal units, so buying a 50-credit pack adds 50 and the transaction history reads in credits.
  • The dashboard Favorites tab listed nothing for every member while the tab counter still showed the real number.
  • Opening hours were missing from the search-engine markup of every member-submitted listing, and a split shift showed as closed on the listing page.
  • Saving a listing in wp-admin no longer erases its location.
  • A directory with a single listing type has a working Add Listing form again.
  • The plugin's own admin notices no longer hide themselves.
  • Turning the sitemap setting off now drops every Listora post type rather than only listings.
  • A review count shown above a list now matches the reviews the reader can actually see, once blocking is taken into account.
  • The plain-text part of a notification email no longer carries the previous email's listing.
  • Business hours a competitor importer cannot interpret are preserved and reported instead of being discarded while the import reports success.
  • Deleted listings no longer count toward search result totals or page counts.
  • Translations are no longer shadowed by a stale compiled catalogue, which could serve older wording while every completeness check reported the language as fully translated.

Security

  • Service names, descriptions, and prices belonging to a draft, pending, or rejected listing are no longer readable by visitors; they now follow the listing's own visibility.

Dev

  • New wb_listora_search_args_from_url() builds search arguments from the URL for every surface that renders a filtered set, and a new wb_listora_map_query_args filter matches the grid's. Search accepts has_geo to page over mappable listings only.
  • New wb_listora_normalize_hours() and wb_listora_max_hours_slots() helpers: any reader of business hours must normalize through the former, and any writer must cap through the latter.
  • The credit balance REST response now states its units and adds the human-readable figure and currency alongside the existing field, which keeps its previous meaning.
  • New wb_listora_get_currency_format() and wb_listora_get_map_tiles() helpers, with wb_listora_currency_format and wb_listora_map_tiles filters, are shared by the website and the app payloads so the two cannot drift.
  • New wb_listora_social_platforms and wb_listora_credit_pack_sizes filters, and a new wb_listora_migrated_hours_unreadable action fired when an import cannot read a source's hours.
  • Database indexes added to reviews, claims, and analytics. The upgrade runs automatically on activation.

Compat

  • Aligned with WB Listora Pro 1.5.0. Install both updates together.

Listora Pro

Adds a gateway payments screen and refund reconciliation, closes a privilege-escalation route on pricing plans, and corrects rate limiting for sites behind a CDN.

New

  • A Payments screen shows what the gateway actually charged for each transaction, so an owner can reconcile a refund against the payment that produced it.
  • Member suspensions are recorded in the audit log alongside every other moderator action.
  • The License screen now shows which product the key is for, who it is licensed to, and how many of its sites are in use, so those questions no longer need a support ticket.
  • Members can activate a listing that is paused for credits once their balance covers the plan, without waiting for another top-up.

Improve

  • Pro is translated for the first time, with 200 shipped strings exposed and ten locales complete.
  • Multi-criteria review averages respect member blocking, so the score matches the reviews the reader can see.
  • Post a Need and Needs Grid no longer appear when the reverse listings feature is off; previously the form rendered and submitting it failed.
  • Needs calls to action now resolve to the pages a member can actually reach rather than pointing at wp-admin.
  • The Transactions screen and the Credits settings tab are hidden while monetization is off, so credit rates and payment gateways can no longer be configured for a subsystem that is not running.
  • The Coupons screen is paginated and its counter shows the real total; previously only the 50 newest coupons were reachable and the count always read 50.
  • The webhook delivery screen is paginated, and every declared list limit is now enforced instead of being accepted and ignored.
  • Moderator queue sizes are accurate above 500 items and load in a single query instead of one per moderator.
  • Need responses, audit log, webhook delivery, and the Transactions summary are faster on large sites.
  • Reassigning a listing clears only the affected posts from the object cache rather than flushing all of it.
  • An unlicensed site is now told that app access is switched off too, rather than discovering it later.
  • Repeated licence activation attempts are throttled, so the form cannot be used to guess keys.

Fix

  • Deactivating a licence now clears every stored record of it; one was left behind, which could leave the site still counted as licensed.
  • Activating a licence on the Plugins screen and in Settings now report the same status; activating in one place could leave the other showing Not activated.
  • A listing paused while carrying only its assigned plan is now resumed by a top-up; previously no top-up could ever release it.
  • The listing detail page no longer shows the Verified badge twice when both plugins draw it.
  • Review webhooks now send the rating the reviewer left; every review webhook previously reported a rating of 0.
  • The setup wizard's third step creates a pricing plan, as its label always claimed.
  • Google Places imports keep both halves of a day that has a lunch break, instead of storing only the evening shift.
  • Both CSV exports are correct: one returned every row regardless of the range requested, the other stopped silently part-way.
  • Credit figures in the Needs quote notice read in credits rather than the ledger's internal units.
  • Pro's own admin notices no longer hide themselves.
  • A lead is counted however the message arrived, rather than only when it came through one particular route.
  • Sites behind a CDN or load balancer now apply rate limits per visitor instead of treating all visitors as one, which could return "too many requests" to everyone.
  • The required WB Listora version is now enforced accurately, so an out-of-date free plugin is reported instead of leaving premium features silently inactive.
  • Quotes with nothing in them are no longer charged for.
  • A webhook that fails to deliver is retried rather than dropped once the sweep reached its bound.
  • Programmatic SEO pages detect whether the theme already printed the page heading instead of assuming it did, so the heading is no longer duplicated.
  • Approving a listing that was held for moderation now posts the BuddyPress activity that publishing it directly would have.
  • Translations are no longer shadowed by a stale compiled catalogue, which could serve older wording while every completeness check reported the language as fully translated.

Security

  • Pricing plans can now only be created, edited, or deleted by users who can manage Listora settings. Previously any user able to publish posts could add a zero-cost plan and apply it to their own listing.
  • Editing, closing, or deleting a posted need now requires being signed in as its author.
  • Signed receipt links now expire.
  • A need response is blocked when either party has blocked the other.

Dev

  • New wb_listora_pro_plan_capabilities filter restores the previous pricing-plan permissions for sites that intentionally delegated them.
  • Every outbound network call now carries a timeout, so a slow third-party service cannot hold a request open.
  • Database indexes added to need responses, audit log, and webhook log. The upgrade runs automatically on activation.

Compat

  • Aligned with WB Listora 1.5.0. Install both updates together.

1.4.1

August 2026

12 changes across free and Pro

Listora

Hardens the plugin against corrupted or unexpected stored data and completes cleanup when a listing is permanently deleted.

Improve

  • The wp listora cleanup command now removes records orphaned by listings deleted on earlier versions.

Fix

  • The submission form no longer shows an error page when select, radio, or multiselect options were added through the listing type editor; stored options are normalized to a canonical shape on read and on save.
  • Permanently deleting a listing now also removes its reviews, review votes, favorites, claims, services, and analytics records. Trashing a listing keeps everything so restore is lossless.
  • Corrupted or legacy-shaped stored data (dashboard statistics cache, gallery, social links, review reports, and data supplied by extensions to the calendar, categories, and review criteria hooks) renders safely instead of producing an error page.

Dev

  • New wb_listora_listing_data_deleted and wb_listora_purge_orphaned_listing_data actions let extensions clean their own listing-scoped data alongside the core cleanup.
  • Field options and review criteria are normalized on save, and render-time hook returns are shape-checked before use.

Compat

  • Aligned with WB Listora Pro 1.4.1. Install both updates together.

Listora Pro

Hardens premium features against corrupted or unexpected stored data. Install both updates together.

Fix

  • Permanently deleted listings now clean up their need responses and coupon usage records through the free plugin's new delete cascade; payment and audit records are kept for accounting and audit history.
  • The visual importer no longer stops with an error on uploaded files containing malformed rows, list-valued taxonomy properties, or incomplete geometry.
  • The audit log screen no longer errors on change entries recorded as plain text.
  • Saved searches, badges, photo reviews, and credit packs tolerate corrupted or legacy-shaped stored data instead of erroring.

Compat

  • Aligned with WB Listora 1.4.1. Install both updates together.

1.4.0

August 2026

24 changes across free and Pro

Listora

Adds password sign-in for the mobile app, with an owner switch and the brute-force protections that route needs.

New

  • Members can sign in to the mobile app by typing the WordPress password they already have, instead of walking the browser approval screen.
  • Settings > Advanced carries an App sign-in switch so the site owner decides whether password sign-in is offered. Turning it off leaves the browser flow and does not sign out members who already use the app.
  • Signing in again from the same install replaces that install's credential instead of adding another, so a member's app-password list stops growing on every reconnect.

Improve

  • The app is told which sign-in doors this site offers before it draws the screen, so it never presents a path the site will refuse.
  • Sign-in failures answer identically whether the username or the password was wrong, so the endpoint cannot be used to discover which accounts exist.
  • Repeated failed sign-ins are throttled per address and per account, and only wrong passwords count toward the limit.
  • Sites running two-factor authentication are never bypassed; the app is handed back to the browser flow so the second factor can complete.

Fix

  • Members can delete their own listings again. The permission check refused the owner and allowed only administrators.
  • Custom badges now appear on directory cards and in Quick View, and a featured listing no longer shows the Featured label twice.
  • The single-form submission layout no longer hides its own steps.
  • Status colours now meet contrast requirements in dark mode.
  • The owner contact form and the Pro lead form share one submit path, so a listing shows one working form rather than two competing ones.

Dev

  • The server advertises its own contact and lead-form routes; clients no longer hardcode them.
  • Card view data now carries through anything added by the wb_listora_card_view_data filter, so an extension's additions reach the card templates.
  • New filters: wb_listora_app_scheme, wb_listora_app_connect_schemes, wb_listora_app_connect_bridge and wb_listora_app_password_login_enabled, plus the wb_listora_app_credential_issued action.

Compat

  • Ships in lockstep with WB Listora Pro 1.4.0. Install both updates together.

Listora Pro

Custom badges now reach the surfaces they were always meant to. Install both updates together.

Improve

  • The lead form advertises its own REST route so the client no longer hardcodes it.

Fix

  • Custom badges appear on directory cards and in Quick View, not only on the listing detail page.
  • A featured listing no longer shows the Featured label twice; a badge is suppressed when the surrounding card or modal already draws that chip itself.
  • A card badge no longer covers the favourite button; the badge column drops below it when one is shown.
  • Removed a Credits plans route that was registered but never reachable, and the unused code behind it.
  • The plan-selection step no longer relies on a stylesheet override to stay visible in the single-page submission layout, so a theme cannot hide it.

Dev

  • New filters: wb_listora_pro_card_native_badge_slugs, for a theme that draws its own Featured or Verified chip, and wb_listora_pro_quick_view_badges for the Quick View badge list.

Compat

  • Ships in lockstep with WB Listora 1.4.0. Install both updates together.

1.3.0

July 2026

36 changes across free and Pro

Listora

Includes a product-wide money-flow and data-integrity audit: every credit charge, refund, and credit-facing surface was verified end to end.

Fix

  • Submitting a listing now requires an account. Anonymous guest submission (and its email-verification step) has been removed: guests could never upload media, so the flow always dead-ended. The former block "Require Login" control was removed to match, and the inert enable_guest_submission flag no longer appears in the app-config REST response.
  • The listing submission form and dashboard no longer show credit pricing or a Buy Credits link on installs that have no configured way to buy credits.
  • Per-listing credit fees are now charged at the correct amount; a money-unit mismatch could charge a fraction of the configured fee.
  • A custom Buy Credits URL set by the site owner is now honored on every credit call-to-action, including paused-listing emails.
  • Listings awaiting email verification now carry a proper status label and valid status transitions instead of appearing unlabeled.
  • Updating settings through the REST API now uses the same validation as the admin screen, so a headless client can no longer corrupt list-limit or notification settings.
  • Activation reliably records the Directory page in settings, and a redundant page-creation routine was removed.

Dev

  • The shared payments table definition is kept byte-identical across Free and Pro so a version upgrade never rewrites it.
  • Custom capabilities and their uninstall cleanup derive from a single list; uninstall removes them without stripping WordPress core capabilities.
  • Added internal-audit guardrails (rating source, Free-Pro option boundary, payments schema, credit-surface gating) to the local-CI gate.

Compat

  • Ships in lockstep with WB Listora Pro 1.3.0. Install both updates together.

Listora Pro

Money-flow, uninstall, and admin hardening. Install both updates together.

New

  • Credit Rate setting under Listora - Settings - Credits, so owners can run a non 1-to-1 credit economy from the admin instead of the database.

Fix

  • Payment webhook no longer marks a payment completed before the credits actually land; a failed credit releases the row to pending and the gateway retry heals it, so a charged member is never left with a zero balance.
  • Refunds use the credit rate the purchase was bought at (snapshotted on the payment), so changing the rate later only affects new purchases and never mis-credits a past refund.
  • Refund by payment id now applies the credit rate correctly for non 1-to-1 rates and non-two-decimal currencies.
  • Public REST rate limiter is now atomic on shared hosting without an object cache (Redis or Memcached), using a MySQL counter, so per-IP caps hold under concurrency.
  • Deleting the plugin only removes data when Delete data on uninstall is enabled, matching Free; it no longer wipes plans, coupons, badges, needs, or webhooks unless the owner opted in.
  • Uninstall now drops every Pro table, including the search-terms and rate-limit tables that were previously left behind.
  • Publishing a saved draft on a monetized site now runs the plan and credit path, so a plan-gated listing can no longer go live without a credit hold.
  • Coupon list REST endpoint is paginated instead of returning every coupon.
  • Need creation is gated on a capability, need responses are rate limited, and need-response errors return their real HTTP status.
  • Badge edit form no longer stranded on the left of the admin card with an empty gutter.
  • Pro feature-flag cache is invalidated in the same request when a toggle changes.
  • Visual import upload response returns a filename instead of the server absolute path.
  • A failed plan activation or need response no longer reverses an earlier, already-committed charge, so vendors can no longer end up with a free plan or lead.
  • The payment webhook no longer activates a paused listing twice, so the plan cost is charged only once per top-up.
  • Credit receipts show the correct credit amount instead of raw storage units.
  • Concurrent duplicate refunds of the same purchase are now rejected atomically, so credits are never refunded twice.
  • Single-use and limited coupons can no longer be redeemed more than allowed under concurrent submissions.
  • A payment webhook that omits a transaction id no longer re-credits on a delayed gateway retry.
  • Programmatic SEO pages and BuddyPress profile listings show the real star rating and review count, and SEO pages sort higher-rated listings first.
  • Uninstall removes the reverse-listing (needs) capabilities from every role.
  • The Compare page link refreshes immediately when the page is repointed in Settings instead of serving a stale URL for up to an hour.
  • Direct Stripe partial refunds no longer over-revoke credits, and direct-gateway top-ups and refunds use the correct credit amount (applies when direct gateway checkout is enabled).

Dev

  • Feature defaults, the Free-Pro purchase-path check, and credit-surface gating each derive from one source to prevent drift.

Compat

  • Ships in lockstep with WB Listora 1.3.0. Install both updates together.

1.2.2

June 2026

5 changes across free and Pro

Listora

Packaging fix for the 1.2.1 release, which shipped incomplete bundled SDKs.

Improve

  • A missing or incomplete bundled library now shows a soft admin notice and disables only the dependent features, instead of risking a fatal error.

Fix

  • The bundled Credits SDK and license/update SDK sources were stripped from the 1.2.1 package, disabling credit-based features and auto-updates on fresh installs. Both now ship complete.
  • Distribution excludes are now anchored to the plugin root so bundled libraries under libs/ are never stripped, and the release build fails fast if any SDK source is missing from the zip.

Listora Pro

Lockstep release with WB Listora 1.2.2. Install both updates together.

Fix

  • Restores credit-based features and license updates on fresh installs, which the free plugin's 1.2.1 package broke by shipping incomplete bundled SDKs.

Compat

  • Requires WB Listora 1.2.2. Install both updates together.

1.2.1

June 2026

14 changes across free and Pro

Listora

Adds the Wbcom family Integrations page, a notification action for suite aggregators, and a wave of onboarding and QA fixes.

New

  • Integrations page showcasing the Wbcom plugin family with product logos, store links, and one-click companion install.
  • wb_listora_notification_created action so suite-wide tools can aggregate Listora notifications.

Improve

  • Color and elevation tokens aligned to the Wbcom Community-OS design system.
  • Demo seeder is now autoloadable everywhere, with an autoload-resolution gate to prevent activation errors.

Fix

  • Activation redirect to the setup wizard no longer gets lost, and the setup notice is scoped and persists correctly.
  • Suppressed the duplicate setup wizard so Free and Pro no longer launch two wizards.
  • Analytics, media privacy, submission preview, and carousel QA fixes.
  • Card and comparison field values truncate with a real ellipsis instead of a literal HTML entity.

Listora Pro

Frontend performance plus comparison and quick-view reliability fixes. Update alongside WB Listora (free) 1.2.1.

Improve

  • The comparison block now ships compiled JavaScript with a build gate, so it loads reliably without a local build step.
  • The admin stylesheet no longer loads on the frontend; comparison styles moved into the block for a lighter frontend.

Fix

  • Quick View overlay no longer renders on non-Listora pages.
  • Analytics now tracks logged-in clicks and shares, and the comparison View Listing button works correctly.
  • Comparison browse and remove actions, plus the activation redirect, are fixed.
  • Pro defers to the Free setup wizard so both plugins no longer launch a second wizard.

1.2.0

June 2026

58 changes across free and Pro

Listora

Feature release: background imports, analytics-lite, email tooling, privacy compliance, and a 13-card QA fix wave.

New

  • Demo packs and large CSV imports run as resumable background jobs with a live progress widget and a per-column field-mapping UI.
  • Analytics-lite view tracking: per-listing view counts on the dashboard, an admin Views column, and a REST field. Defers to Pro analytics when active.
  • Email template editor under Settings - Notifications: override any notification subject and body per event, honored on every send path.
  • Bulk actions on the listings table: approve, reject, feature, unfeature, and assign category. Invalid status transitions are reported, never silently applied.
  • One-click unsubscribe links (RFC 8058 signed tokens) in marketing email footers, plus a review-reminder opt-out on the profile tab and admin toggles.
  • WordPress privacy-tools integration: personal-data exporter and eraser cover claims, reviews, and favorites.
  • Review-reminder notification event, and an Open now / Closed badge on listing detail computed from business hours.
  • HivePress migrator joins the competitor migration set.
  • Inline add and edit listing forms inside the dashboard, so owners never leave My Listings.
  • Submission form style setting: choose the step-by-step wizard or a single page form site-wide; a block whose author picked a layout in the editor keeps that choice.

Improve

  • The Media step now says "Add a featured photo to continue" instead of a generic required-field error, and validation messages are translatable and filterable per field.
  • Dashboard sidebar restyled as an elevated card panel; tab navigation gains a scroll affordance on small screens.
  • Hours builder gives live Open-24h and Closed feedback; small buttons meet the 40px tap-target floor; featured images get an alt-text fallback.
  • Database migrations run automatically after a plugin update, no manual trigger needed.

Fix

  • Background import no longer sticks at Running after an error: failed chunks retry up to 3 times from the saved cursor, then the run is marked Failed with a clear message.
  • Featured Listings block renders a proper empty state instead of silently vanishing when its listing type has no listings.
  • Manage Services on My Listings opens in a modal dialog next to the listing instead of a panel at the bottom of the page.
  • My Listings Active filter no longer shows deactivated, draft, pending, or rejected listings.
  • Favorites dashboard tab moved to an overridable template file (tab-favorites.php), matching every other tab.
  • Settings Documentation buttons deep-link to the live docs site sections instead of 404 pages.
  • Submission map picker keeps Leaflet controls below fixed theme headers while scrolling.
  • Keyword search shows a single clear icon: the native browser cancel control no longer stacks under the plugin's clear button.
  • Post-submission success message is centered as a unit on every theme width, with stacked full-width buttons on mobile.
  • Map picker now loads on the dashboard inline Add Listing form (single-form layout); it previously initialized only when stepping through the wizard.
  • Single-form submission shows the Submit button directly and hides the redundant Back/Continue navigation, with full field validation run on submit.
  • Onboarding dismissal is stored under the wb_listora_onboarding_dismissed key (auto-migrated from the legacy unprefixed key).
  • Removed a "translation loading triggered too early" notice (WordPress 6.7+) by deferring email-template filter registration to the init hook.
  • Featured Listings block no longer crashes the page (division by zero) when its columns value reaches the server as 0 via the editor preview API or saved content; columns now floor at 1.
  • Listing Grid and Categories blocks also clamp a 0 columns value, which previously collapsed the layout to zero columns.
  • Featured count and Grid per-page values of 0 no longer crash search pagination; the search engine floors page and per_page at 1.

Dev

  • New hooks: wb_listora_search_resolved, wb_listora_dashboard_credit_row_actions, wb_listora_before/after_dashboard_favorites, wb_listora_show_credits (lets Pro's new Monetization toggle hide credit surfaces), and a reusable rating-recompute entry point. Removed the dead listing-detail view.js.
  • Relocated QA artifacts from tests/qa to docs/qa and adopted the portfolio-standard pre-release smoke model.
  • New release gates against the fatal class above: PHPStan now analyzes blocks/, a block-attribute guard detector runs in coding-rules (Rule 7), and an adversarial block-attribute journey fuzzes every block via the preview REST API.

Compat

  • Aligned with WB Listora Pro 1.2.0. Install both updates together.

Listora Pro

Monetization-polish release: receipts, refunds, search analytics, background migration, and opt-in credits. Update alongside WB Listora (free) 1.2.0.

New

  • Monetization is now opt-in: new installs start with credits and paid plans OFF so visitors can submit listings free; enable the Monetization toggle on the Features screen when you are ready to charge. Existing sites keep their current behavior.
  • Printable receipts and invoices for credit purchases: browser-print friendly, linked from credit history and the purchase confirmation, with your business details from Settings - Credits.
  • Token-signed public receipt links embedded in refund emails, so buyers can open their receipt without logging in.
  • Admin Refund credits flow on the payments screen: idempotent, over-refund guarded, with a buyer notification email and refund-cause pause copy.
  • Search analytics: keyword recorder on every search, a search_terms aggregate table, and a Search tab on the Analytics screen with onward actions.
  • Competitor migration runs in the background on the shared import pipeline, with retry on failure, progress messages, and a View Listings link.
  • Pricing plans support a trial or free-tier duration, and plan or credit-pack admin screens surface the store currency.
  • Coupon usage is visible on three surfaces: an admin redemption column, the customer receipt, and credit history.
  • Webhook delivery log REST surface with per-delivery retry.
  • Privacy-tools exporter and eraser cover audit-log rows and lead-form submissions.
  • Buy Credits onboarding prompts surface gateway and credit-pack configuration gaps instead of dead-ending.

Improve

  • BP profile My Listings and My Reviews tabs are fully styled (card grid, pagination, empty states) and respect the directory per-page setting.
  • Shared bot detection with the free plugin and a retention-health readout on the Analytics screen.
  • Translations regenerated at 1.2.0 with French sync and JS translation files.

Fix

  • Comparison table labels wrap inside their column instead of painting over the adjacent value cell.
  • Refund modal opens reliably; refund clicks no longer collide with delete-confirm delegation.
  • HivePress migration routes through the standard migrator registry.
  • Needs Grid block clamps a 0 columns value, which previously collapsed the layout to zero columns (same hardening as the free plugin's listing blocks).
  • Credit Packs block clamps a fractional columns value that slipped past its guard, and Needs Grid floors its per-page value at 1.
  • Switching notification mode from digest back to instant now cancels the recurring digest task, so Action Scheduler no longer logs a daily failure for an orphaned job with no handler.

Security

  • The public token receipt endpoint is rate limited per IP, closing a volumetric token-guessing gap.

Dev

  • 14 internal hooks renamed to the wb_listora_pro_ namespace with deprecated bridges kept until 2.0.
  • Relocated QA artifacts from tests/qa to docs/qa and corrected three QA journey checks (cron hook inventory, webhook audit-log query, deprecated-hook grep).

Compat

  • Requires WB Listora (free) 1.2.0. Install both updates together.

1.1.0

June 2026

58 changes across free and Pro

Listora

Bug-fix, performance, and reliability release.

New

  • Pro feature toggles now register into the Features screen, so all features are managed in one place when WB Listora Pro is active.
  • WP-CLI gains wp listora test-email and cleanup subcommands.

Improve

  • Demo import is faster and more resilient: per-image timeout reduced from 30s to 10s, gallery images capped, repeated image URLs downloaded once, and a failed image is skipped instead of stalling.
  • CSV import and export now support the Location taxonomy and offer a per-column field-mapping UI, so listings round-trip without data loss.
  • Listing-grid ratings are batch-prefetched, the admin Reviews and Claims tables and the dashboard Claims tab are paginated, and the calendar recurring-events query is bounded.
  • The settings option no longer autoloads on every request, and a composite index speeds per-user review pagination.
  • The Write a Review form is fully styled and responsive (criteria stack on mobile, full-width submit, clearer spacing and star states).
  • Reporting a review now uses an accessible modal instead of the native browser prompt.
  • Submission preview and the location map are hardened so a single failing section cannot blank the preview and the map recalculates as soon as it is visible.

Fix

  • A build missing a bundled SDK no longer white-screens the site; the license and credits SDKs ship composer-free and load defensively.
  • Credit purchases are idempotent: webhook replays cannot double-credit, refunds carry the real amount, and PayPal refunds link back to the original transaction.
  • Schema.org JSON-LD and canonical tags no longer duplicate when Yoast SEO or Rank Math is active, and og:locale is emitted in Open Graph output.
  • Breadcrumbs and BreadcrumbList schema now come from one canonical trail, and the listing-detail REST schema field respects the Schema.org toggle.
  • Admin script no longer 404s during demo import; it now loads from the packaged build path.
  • Documentation buttons now open the correct docs host instead of an unreachable domain.
  • Search field clear and near-me icons no longer touch the field edges.
  • The /search REST endpoint no longer returns a zero rating average for rated listings.
  • Business hours now appear in the listing submission preview, the Business Hours builder is aligned, and the submission map stays contained in its step.
  • Selecting a listing-type tab no longer increments the filter count, and the active type tab is now highlighted.
  • Listing dashboard service and more-actions controls now open as expected, and the submission success card resolves the Dashboard link reliably.
  • Map no longer errors when marker clustering is disabled.
  • The Listings per page setting is now respected by the grid on first load.
  • The Required Skills field on Job listings is now usable instead of showing only a label.
  • The review form respects the configured minimum review length, and report reasons validate against a fixed vocabulary.
  • Pagination active-page text stays visible under aggressive theme link styles, and dark-mode contrast is corrected on BuddyX.
  • Renewal modal errors are announced to screen readers, and small buttons meet the tap-target floor.
  • Settings REST endpoints return structured listora_unauthorized (401) / listora_forbidden (403) codes on denial.

Dev

  • Wbcom Credits SDK re-homed from a git submodule to a committed composer-free libs/ copy that loads defensively when absent.
  • CSV importer and migrator base consolidated onto the shared Term_Helper; claims queries consolidated into a canonical Claims_Model.
  • wb_listora_send_notification filter now receives the recipient address as its 4th argument.
  • Off-canon CSS breakpoints consolidated, and the WP-CLI table-status query is prepared.

Compat

  • Aligned with WB Listora Pro 1.1.0. Install both updates together.

Listora Pro

Payment-hardening, SEO, and bug-fix release. Update alongside WB Listora (free) 1.1.0.

New

  • Programmatic SEO landing pages now render inside the active theme.
  • Public read REST endpoints are rate-limited.
  • Pro feature toggles register into Free's Features screen; the separate Pro tab is removed.

Improve

  • BuddyPress Listings and Reviews profile tabs, the Outgoing Webhooks admin list, and the dashboard Needs feed are paginated, removing several N+1 queries.
  • Saved-search alert cron and reverse-listings counts use bounded count-only queries, and the notification queue, map styles, and credit packs options no longer autoload.

Fix

  • Payment webhooks are idempotent: credits are recorded before being granted, replayed events are ignored, and a webhook without a transaction id can no longer double-credit.
  • Refunds deduct the real refunded amount, and a refund arriving after plan activation rolls the plan back.
  • Saving a coupon no longer triggers a "headers already sent" warning or a blank page; the action is handled before output.
  • Private visibility no longer returns 403 for every non-admin viewer.
  • Notification digests no longer drop review notifications, and owner digest emails send to the stored recipient address.
  • Listing-paused and listing-resumed emails use real palette keys instead of emitting undefined-key warnings.
  • SEO pages defer head meta and schema to the active SEO plugin, the sitemap provider registers through wp_register_sitemap_provider, and unrated listings stay in the grid.
  • Infinite scroll rel-prev/next links honour active search filters, and the result counter no longer undercounts.
  • Comparison and Quick View are enabled by default, and Quick View gallery arrows meet the 44px tap target.
  • The Load More button disables while fetching, and lead-form submission results are announced to screen readers.
  • The Visibility settings tab only appears when Coming Soon is enabled, and the Coming Soon splash supports dark mode.
  • The Reverse Listings admin budget column respects each need's currency.
  • The analytics tracker declares its wp-api-request dependency, and BuddyPress loop templates no longer reference undefined view data.
  • Photo-review and criteria-average styles moved to the frontend stylesheet, and customer-facing buttons drop the theme button class.
  • The White Label feature description now matches its actual scope (plugin name and admin menu relabel).
  • Analytics and Photo Reviews REST endpoints return structured listora_unauthorized (401) / listora_forbidden (403) codes on denial, and ownership failures now correctly return 403.

Security

  • Audit log IP capture is hardened against spoofing.
  • Saved-search update and delete enforce an ownership guard as defence in depth.

Dev

  • Pro consumes Free's bundled EDD SL SDK and reads verified badges through the wb_listora_is_verified() resolver.
  • Need Matcher proximity routes through Free's geo_query service, and the codebase passes PHPStan level 7.

Compat

  • Requires WB Listora (free) 1.1.0. Install both updates together.

1.0.4

May 2026

22 changes across free and Pro

Listora

New

  • Public Page Registry helper and new block render hooks for theme and Pro extensions.
  • All 6 scheduled jobs migrated to Action Scheduler for reliable background processing at scale.
  • Network timeout handling with a clear retry message on slow connections.

Improve

  • Consistent page shells, cards, badges, and empty states across all 11 blocks.
  • REST listing queries prefetch caches, saving about 100 queries per request on large directories.

Fix

  • Setup wizard no longer renders a blank page after completing on restricted accounts.
  • Approve, reject, and expiry notification emails reach listing owners again.
  • Map popups show the listing featured image, and a map fatal on activation is resolved.
  • Business Hours time picker works in Firefox.
  • Services photo upload, helpful votes, owner reply form, and filter-count badge restored.

Dev

  • Architecture invariants enforced between Free and Pro; WPCS and PHPStan baselines green.

Compat

  • Aligned with WB Listora Pro 1.0.4. Install both updates together.

Listora Pro

New

  • Executable QA journeys and Pro smoke supplements protect every release.

Improve

  • All 7 scheduled jobs run on Action Scheduler; consistent design primitives across the 5 Pro blocks.
  • Webhook receiver enforces strict HMAC signatures with replay rejection by default.

Fix

  • Coupon-create page rendered blank when Pricing Plans was disabled.
  • Paid pricing plans bypass moderation correctly.
  • Outgoing webhooks fire on listing approve and reject again.
  • Visibility gate applies site-wide for non-admins instead of listings only.

Security

  • Lead form and analytics endpoints verify per-listing nonces with daily caps.

Dev

  • Credits SDK consumed from the free plugin; Pro options renamed to the wb_listora_pro_ prefix with one-shot migration.

Compat

  • Requires WB Listora (free) 1.0.4. Install both updates together.

1.0.0

April 2026

15 changes across free and Pro

Listora

Initial release.

New

  • 11 Gutenberg blocks: grid, search, map, detail, reviews, submission, categories, featured, calendar, card, and user dashboard.
  • Dynamic listing types with 22 custom field types.
  • Frontend submission wizard with guest registration and spam protection.
  • Review system with star ratings, helpful votes, owner replies, and reporting.
  • Business claims, favorites, business hours, services, and recurring events.
  • Import and export for JSON, GeoJSON, and CSV plus 4 competitor migration tools.
  • Full-text search with facets and geo-distance queries on dedicated database tables.
  • REST API, extensive hooks, WP-CLI commands, and 14 email notification templates.

Listora Pro

Initial release.

New

  • Google Maps and Places integration with address autocomplete and custom map styles.
  • Credit-based payment economy with pricing plans, coupons, and payment webhooks.
  • Payment integrations: WooCommerce, WooCommerce Subscriptions, MemberPress, PMPro, and WooMemberships.
  • Advanced and saved search with email alerts and infinite scroll.
  • Multi-criteria and photo reviews, lead forms, and verification badges.
  • Analytics, audit log, outgoing webhooks, and white-label mode.

Compat

  • Requires WB Listora (free) 1.0.0. Install both updates together.

Free and Pro ship together on the same version number, so a Pro update always has a free release beside it. Updating one without the other is not a supported combination. Full release notes also live on wbcomdesigns.com.

Updates come with the licence.

An active Pro licence keeps updates and support flowing. The free plugin updates from wordpress.org regardless.