Appearance
Voxel Toolkit Changelog
Release notes for every Voxel Toolkit release, newest first. The current release is 1.9.3.
Updates install through the normal WordPress updates screen once your license is active — see Installation & Licensing.
Back up before updating a production site
Voxel Toolkit writes to post meta, taxonomy terms, and Voxel's own data structures. Update on staging first where you can.
1.9.3 — September 11, 2026
Push Notifications
- Fixes the announcements tick box appearing to work while saving nothing. Broadcasts only reach people who tick "also send me announcements", and ticking it silently did nothing whenever the browser had subscribed before anyone signed in. The box is saved as a background-style resync, which is not allowed to change who owns a device — a guard that exists so a shared computer cannot hand one person's notifications to another. It was also refusing to write a row that belonged to nobody, which is the same browser, subscribed logged out, and claiming it takes nothing from anyone. Meanwhile the widget said "you will also receive announcements" without checking, so the site owner saw subscribers on the Push screen and a broadcast audience of zero, with a ticked box explaining neither.
- Someone else's device is still never reassigned, and the widget now shows what was actually stored rather than what was clicked.
MCP Server
- Fixes field and filter keys being lowercased before they are looked up. Voxel lowercases the keys it generates itself, but not the ones you type on fields and search filters — a field really can be keyed
Organizer-relation. Those keys were passed throughsanitize_key(), so the field was never found and an update fell through to the create path: at best a confusing "this field needs a type and label" for a field that plainly exists, at worst a second field carrying the lowercased key while every stored value stayed under the original. Keys now keep their spelling, and one that differs only by case is refused with the exact key to use rather than guessed at. Applies to upserting and deleting both fields and filters.
Recently Viewed
- Fixes the newest post missing from every list shown to logged-out visitors. Signed-in visitors get their cards drawn with the page; everyone else keeps their history in the browser, so the cards are fetched in a second request afterwards. After rendering a card that request puts the previously current post back — but where there was none to put back it made the call with nothing at all, which raised an error at the end of the first card and discarded markup that had already been built. A list of six arrived as five, always missing the newest; a visitor who had viewed one listing got an empty widget.
- Cards fetched that way arrived unstyled. Only the first card of a list carries the stylesheet for the rest, so the discarded card took the styling with it — which is what made icons render at full size.
- Fixes "was enqueued with dependencies that are not registered" notices naming
elementor-post-.... Elementor attaches each card's stylesheet to its main frontend stylesheet. Where that handle is absent — an optimisation plugin that deregisters it, or a request that never registers it — WordPress refuses to print the card's stylesheet at all and, since 6.9.1, first prints a notice naming the handle. The unsatisfiable dependency is now dropped so the card keeps its own CSS, and the widget no longer contributes notices to the page. - Card styling is printed once per template alongside the markup it styles, rather than once per card.
Post Feed Numbered Pagination
- Fixes the page numbers disappearing after reloading on the last page. How many pages to draw is worked out from the total result count, and on the last page that total is worked out locally instead of asked for — the one page where nothing else supplies it. A reload takes the current page from Voxel's feed configuration, which describes the filters a feed was built with and does not always carry the page number, so the sum restarted from page one and came out as a single page's worth. One page means no numbers to draw, and the list emptied itself. The page number is now read from the address bar, where it is already kept, and a total that contradicts the feed's own Previous button is checked against the server rather than trusted.
1.9.2 — August 31, 2026
Image Optimization
- Fixes uploads being saved twice. Uploading through the WordPress media modal created two attachments: the untouched original and the optimized, renamed copy. Our handler declared a priority so it would run before WordPress's own — but passed it in the wrong argument position, so it ran after, by which point WordPress had already started uploading the original. Optimizing and restarting the queue then sent the file a second time. Reported for WebP, but it affected every image type.
- Media → Add New now optimizes at all. That screen builds its uploader directly rather than through the component the rest of wp-admin uses, and the optimizer only ever attached to the latter — so images uploaded there were saved full size, unrenamed and unwatermarked, with nothing to indicate the function had been skipped.
Active Filters
- A numeric filter set to 1 no longer reads "Yes". Any active filter whose value was
1was labelled "Yes", so a "Number of seats: 1" chip said "Number of seats: Yes". The widget now asks Voxel what kind of filter it is, and only switcher-style filters get Yes/No.
Push Notifications
- The broadcast button now says why it is disabled. It unlocks only after you check the audience, so nobody sends to a number they have not seen — but it never explained that, and read as broken.
Synonym Search
- Fixes bulk generation writing blank synonyms while reporting success. The AI call asked for 200 tokens — fine for a model that answers directly, useless for a reasoning model, which spends that budget thinking and returns nothing visible. The empty reply was saved to the term and counted as generated, so a run could report "generated: 122, skipped: 0" while blanking every term, including synonyms that were already there and correct. Empty replies are now skipped rather than saved, and the token budget scales with how many synonyms were asked for.
- British English is now a response language, so a UK site gets tyres and worktops rather than tires and countertops. The prompt also asks the model not to restate the category name with minor rewording.
Redirect Posts
- Users who can edit the post are no longer redirected. The documentation has always said an editor-capable user passes through to the real pending or draft post; nothing in the code checked, so an author following a link to their own unpublished listing was bounced to the archive along with everyone else.
Guest Submissions
- Fixes field visibility rules seeing guests as logged in. To render the form for a logged-out visitor at all, the function stands in a placeholder account — which also made the site answer "yes" when asked whether the visitor was logged in. A field set to hide from logged-in users, like the email address a guest fills in, was therefore hidden from guests too, which is the one audience it exists for. Login-state rules now report the visitor's real state, for every field on the form.
Schedule Posts
- The scheduling field no longer appears on the confirmation screen. After publishing, the date and time inputs were still drawn on the "your post has been published" screen, flickering as the page settled. The check meant to catch that screen looked at the success icon's CSS classes — but the icon is chosen in Elementor, so a site using its own icon had nothing to match. It now keys off the container Voxel renders only on that screen.
- Removed debug logging that was being written to the browser console on every page with a create-post form.
Notification Preferences
- The dash marking a channel an event never uses can be turned off. A new widget switch; leave it on for the current look, turn it off to leave those cells empty.
- Rename any event or section heading. Voxel supplies these names in English only, with no translation file behind them, so Loco Translate and similar tools have nothing to work from — 1.9.1's WPML and Polylang support did not help sites using anything else. Every name the widget shows now has a box in the function's settings, placeheld with Voxel's own wording. On a single-language site this is the translation; on a multilingual one the renamed wording is what WPML and Polylang pick up.
Poll (VT)
- Lock votes once cast (new). A per-poll option: voters get one answer and cannot change it. Enforced on the server, not just hidden in the page, and the poll shows as answered rather than offering controls that would be refused.
- Fixes every logged-out visitor sharing a single vote. Guest votes were all recorded against user id 0, so in a single-choice poll one guest voting silently removed the previous guest's vote, and a guest could cancel a vote that was not theirs. Logged-out voters are now told apart. Votes already recorded before this are kept and still counted, but belong to no one and cannot be changed.
1.9.1 — August 27, 2026
Fixes reported after the 1.9 release.
Auto-Share to Timeline
- Listings with a gallery no longer fall back to the site logo. The link preview looked for images in fields named
cover,logo,galleryorimage— a guess that misses any site whose gallery field is called something else, such asphotosorlisting-images. It now falls back to scanning whatever image fields the post type actually defines, so a listing with pictures uses one. - Previews recover when images arrive after the share. Voxel uploads frontend submissions in a later request, so a post could be shared before its images existed. Only the featured image was watched for this, which left a listing that has no featured image showing the placeholder permanently. Gallery and other image fields are now watched too, and saving an affected listing repairs its preview.
Notification Preferences
- Event names can be translated. Voxel's app event labels ("New order placed by customer") are plain literals with no translation call behind them, because they were only ever meant for the admin — so on a translated site the widget showed them in English with nothing for a translation plugin to hook. They are now registered with WPML and Polylang, and exposed through the
voxel_toolkit/notification_preferences/labelfilter for sites using neither.
1.9 — August 26, 2026
Eleven new features, including four that open up parts of Voxel the theme never exposed: filters that render anywhere on the page, submissions without an account, moderation from the front end, and the site installable as an app.
Detached Filters (New)
- Render any Search Form filter anywhere — a sidebar, a sticky bar, the feed area, or a "More filters" dialog — while keeping one search form, one filter state and one request. No post type configuration and no names to type.
- A "More Filters" dialog in two clicks — every filter row gains a Move to More Filters toggle; the trigger appears at the end of the filter row automatically, with an active-count badge, Clear all and Show results.
- Filter Slot (VT) widget — drop it in a sidebar, connect it to the search form, pick which filters it shows. Search and Reset can move into the dialog too, and Update URL with search values now works for submit-to-page forms, so a header search arrives at the results page still filled in.
Advanced List: Moderation Actions (New)
- Approve, Decline and Verify as native Advanced List actions — approve or decline pending posts (firing Voxel's own notifications to the author) and toggle the verified badge, from any template.
- Build your own moderation panel — a feed of pending submissions plus an Advanced List is a complete frontend queue. Approve listings from your phone.
- Always on, and the actions render for nobody without moderation capability.
Guest Submissions (New)
- Submit without an account — logged-out visitors can fill in and submit the Voxel create-post form for the post types you choose. The listing attaches to an account matching their email, created on the spot, and a claim link lands in their inbox — so submitting doubles as registering.
- Moderation-first — guest posts are forced to pending review by default, with per-IP rate limiting and a honeypot guarding the open form.
- The claim email is a real app event, with dynamic-tag templates, per-recipient toggles and automatic Push/SMS support.
Notification Preferences (New)
- Members choose their own notifications — a widget showing every enabled app event against its channels (email, in-app, push, SMS), enforced server-side across all four, including notifications Voxel itself sends.
- Admins stay in charge — the widget only ever narrows what's enabled, and exclusions keep critical events out of members' hands.
PWA (New)
- Install your site as an app — web app manifest, home-screen icons from a single upload, theme colours and iPhone meta tags, with no third-party PWA plugin (and none of the service-worker conflicts they cause with Push Notifications).
- PWA Install (VT) widget — one-tap install on Chrome and Android, a guided Add to Home Screen on iPhone, hidden automatically once installed.
Create Parent Post (New)
- Create the venue while submitting the event — a "create new" switcher spawns the related parent post from temporary fields and links it through the relation field, in one submission.
- Reuses an existing parent of the same name rather than duplicating, can assign the listing plan, and indexes the new post so it appears in search and maps immediately.
Timeline Post Timing (New)
- Schedule timeline posts for a future date; they publish automatically and can be cancelled beforehand.
- Edit the time of published posts and reviews via a clock button, permissioned by role, membership plan or listing plan and configured separately for posts and reviews. Times can move backwards only, so feeds can't be gamed.
OAuth for the MCP Server (New)
- Connect from claude.ai, Claude Desktop Connectors and Cowork — add the endpoint as a custom connector with no username, password or headers, and approve access on a WordPress consent screen. Revoke any time from your profile. Requires HTTPS; existing header-based clients are unaffected.
Poll: image options (New)
- Images on poll options, shown in both voting displays, with widget controls for height, fit, width, alignment, radius, spacing and border. The widget also previews a sample poll in the Elementor editor.
Favicon Notification Counter (New)
- Unread badge on the tab icon — the unread count as a red bubble on the favicon, restored when everything is read. On by default.
No Results Conditional (New)
- Voxel visibility rules for empty feeds — "Post feed has no results (VT)" and "Post feed has results (VT)" control any element's initial render.
- Live classes for AJAX searches —
vt-show-on-no-resultsandvt-hide-on-no-resultsupdate as visitors search, with no reload. Always on.
Anonymous Timeline
- Owners answer reviews as themselves — on walls where anonymity is forced, replies by the listing's own author are no longer forced anonymous, so a business responding to a review speaks as the business.
Fixes
- Every wp-admin page could fatal in the footer during 1.9 beta (No Results Conditional's visibility rules registered before Voxel loaded), freezing the Toolkit settings page among others.
- Title Notification Badge and Listing Plan Notifications settings were silently dropped on save.
- The MCP page's claude.ai tab Copy button now copies just the endpoint URL.
- Tested up to WordPress 7.0.
1.8.0.3 — August 24, 2026
- Saved Search — "Load search" now returns to the page your search form actually submits to. A form on the homepage that sends results to an archive was rebuilding the link against the homepage, losing the post type from the URL, so nothing happened on arrival. The destination is recorded when the search is saved. Searches saved before this update should be saved again to pick up the correct destination.
- Saved Search — the dialog text is fully translatable. "Save Search", "Load Search", "Save", "Cancel", "Enable notifications", "No matching searches" and the other popup labels were hardcoded in English inside the templates; they now use the plugin's text domain and appear in the translation file. (Text you type into the widget's own fields is Elementor page content — translating that needs WPML or Polylang.)
- Saved Search — the Load Search button's Button Width is now responsive, matching Save Search.
- Recently Viewed — the slider's next/previous arrows no longer sit behind cards.
1.8.0.2 — August 22, 2026
- Recently Viewed widget — responsive Columns now apply in Slider layout, not just Grid. Slider cards derive their width from the same column setting the grid uses, so tablet and mobile counts work as configured. (1.8.0.1 fixed Grid only; slider layout sizes its cards through different CSS.)
- Recently Viewed widget — the column limit is raised from 5 to 10, and slider card widths now account for your Gap setting instead of assuming 20px, so changing the gap no longer leaves cards slightly mis-sized or paging slightly off.
1.8.0.1 — August 20, 2026
- Split View — "Track Selection in URL" now writes
?vt-preview=123instead of?preview=123; the old name is WordPress's reserved post-preview parameter, which put pages into preview mode for logged-in editors and could break other widgets (like the search form's location popup). Old shared links still work. A shimmering skeleton loader now fills the preview pane while listings load, with a new Loading style section (Skeleton / Spinner / None, colors, and a "Loader on Every Change" toggle). The pane can no longer get stuck loading if a template script fails. - Day of Week / Month filters — new per-filter "Popup min width" control (default 300px); at Voxel's base width, themes with larger buttons wrapped the Clear/Save row onto two lines.
- Push Notifications — subscribed devices now automatically repair themselves if another plugin's service worker (a PWA plugin, OneSignal, etc.) had taken over and was later removed — the cause of "undefined" notification titles. The opt-in widget gains typography controls for the button and the announcements checkbox.
- Recently Viewed widget — the responsive Columns control now applies per breakpoint; the desktop count was overriding tablet/mobile.
- Team Members — the Invite button now follows the create-post widget's secondary button styling like every other form button.
- No more CDN dependencies — Select2, Chart.js, Vue, SortableJS, intl-tel-input and Intro.js are now bundled with the plugin; ad-blockers or offline environments blocking CDNs could previously freeze admin screens or break widgets.
- Reliability — several settings screens that silently failed to save are fixed (Listing Analytics, Booking Reminders, Anonymous Timeline, Title Notification Badge, Listing Plan Notifications); custom app events registered by the Toolkit are no longer invisible to Admin Notifications and SMS Notifications; three admin cards with blank icons fixed.
1.8
The biggest Voxel Toolkit release to date.
Push Notifications (New)
- Voxel's notifications, delivered to the browser - Sends the notifications your site already produces — messages, reviews, bookings, post approvals, follows and the rest — as browser push notifications on desktop and mobile. Nothing to configure: wording, links and images come from your existing Voxel notification settings, and your per-event toggles apply. No third-party accounts or API keys; signing keys generate themselves.
- Opt-in widget - Add the Push Notifications (VT) widget wherever members should turn notifications on. iPhone/iPad requires adding the site to the Home Screen (an Apple platform rule).
- Broadcasts - Send one-off announcements from Voxel Toolkit → Push: title, message, destination link. Target by user role, membership plan and/or listing plan; a separate announcements opt-in keeps promotional messages consented. Delivery runs in the background with progress, and an activity log shows what was sent and why anything was skipped.
Anonymous Timeline (New)
- Post and review anonymously - A "Post anonymously" option on post walls and review feeds. Readers see a stable pseudonym ("Anonymous Falcon #4821") with a generic avatar and no profile link — applied on the server, so the real identity never reaches the browser.
- Staff see through - Administrators see the real name marked "(anonymous as Handle)"; the Users screen gains an Anonymous Handle column. Optionally the wall owner can see through as well.
- Notifications keep the secret - Notification subjects and event emails about anonymous posts use the handle.
- Forced mode per widget - A Timeline widget can be set so every post made through it is anonymous, with no choice shown.
- Profile timelines excluded by design - anonymity is offered where it can't self-identify: post walls and reviews.
Split View (New)
- Browse without leaving the page - Link the Split View (VT) widget to a post feed and clicking a card opens the full listing in a side pane, Indeed-style. Choose the template per post type, optionally auto-load the first result, style the selected card, and get a slide-in drawer on mobile. Canonical URLs stay clean and preview visits count in Voxel's visit tracking.
Listing Analytics (New)
- Per-listing analytics - Card impressions and clicks in search results, page views, action clicks (call, website, directions, message, follow, save and more), shares, form submissions and attributed order revenue — tracked per listing with privacy controls (bot exclusion, DNT/GPC, hashed or no IP storage, retention limits).
- Promotion and plan views - Stats segment by promotion period (spend, ROAS, promoted-vs-organic) and by listing plan (cost = plan price). Dashboards under Voxel Toolkit → Analytics and → Plan Stats, with hourly heatmaps and device breakdowns.
- Widgets for listing owners - My Listings Analytics (VT), Promotion Stats (VT) and Plan Stats (VT) put the numbers on the front end for the people who own the listings.
- Dynamic tags -
@post(listing_stats.*)exposes every metric by timeframe plus per-action-type counts — usable anywhere dynamic tags work, including visibility conditions.
Booking Reminders (New)
- Automated reminders and follow-ups - Define timing slots (minutes/hours/days before a booking starts or after it ends); each becomes a native Voxel App Event with email, in-app and SMS configured in Voxel → App Events, with
@customer,@vendor,@order,@postand@bookingdynamic tags. Timeslot-aware: a "1 hour before" reminder for a 2pm slot fires at 1pm. Includes a test-send tool.
Day of Week + Month search filters (New)
- Filter by when - Two new filter types for any post type: Day of Week (VT) and Month (VT). Sourced from recurring-date fields (full recurrence and multi-day span expansion), plain date fields, or the publish date — so months come from actual dates, replacing category-per-month workarounds. Single or multi select with ANY/ALL matching, optional adaptive counts that hide empty options, and URL parameters. Reindexing happens automatically on save, including when a filter is re-pointed to a different field.
Weekday Recurrences (New)
- "Every 3rd Saturday" - Recurring-date fields gain weekday options in the Period dropdown, including Nth-weekday-of-month recurrences ("every 3rd Saturday from May to August"). Native recurrences are untouched, and months without an Nth occurrence are skipped correctly.
Post Type Buttons (New)
- Post types as buttons - The Search Form (VX) widget's post-type dropdown can render as inline buttons — always available, no setup: a "Display as buttons" toggle in the widget's Post types section, with post counts, hide-empty, wrap or scrolling layouts (arrows and drag), a dedicated style section, and live preview in the Elementor editor.
Fixes
- Settings that didn't save - Booking Reminders, Anonymous Timeline and Listing Analytics settings were silently dropped when saved from the admin screen.
- Poll translations - The vote counter ("x votes"), two tooltips and widget text defaults are now translatable; the counter uses proper plural forms and localized numbers. Translation template regenerated.
- Anonymous Timeline on Voxel 1.7.8.7+ - now uses Voxel's official timeline config filters for the read path — more robust against future Voxel updates; older Voxel versions keep the previous mechanism.
- Bundled MCP Adapter updated to 0.6.1 - requires WordPress 6.9 for the MCP function (Abilities API in core); fixes a potential fatal from the 0.6.0 package. MCP sessions are now enforced per the current protocol.
1.7.6.1
MCP Server (Updated)
- Create a post type from scratch - The assistant could edit existing post types but not add one.
create-post-typenow builds a complete Voxel post type — labels, icon, singular and plural names — and creates its card, single and archive templates in the same step, so the new type is usable immediately rather than left half-configured. Reserved WordPress keys are refused and the key length is checked before anything is written, because a post type key cannot be renamed afterwards. - Build and assign templates - Five new tools list, create, clone and assign Voxel templates, and add custom templates to a post type. Cloning copies the Elementor layout and page settings while dropping the cached CSS, so the copy renders as its own page instead of inheriting the original's styles.
- Search filters and the index - Six new tools cover the search side: list the available filter types, read, add, update and delete a post type's filters, check whether its search index needs rebuilding, and rebuild it. Because changing filters changes the shape of the index table, the index is now kept in step automatically whenever a post type is written — previously a filter change could leave search quietly returning stale results until someone rebuilt it by hand.
- Template assignments can be rolled back - Snapshots now cover Voxel's site-wide template map as well, so reassigning a template is undoable like every other configuration change.
- 38 tools in total, up from 26.
Image Optimization (Updated)
- Limit the watermark to post submission forms - The global watermark applied to every image uploaded anywhere on the site, including timeline photos, message attachments, review images and anything added through the WordPress media library. A new "Apply Watermark On" setting restricts it to Voxel create and edit post forms. The previous behaviour remains the default, so nothing changes unless you choose it.
- Choose which fields get watermarked - A checkbox per field type — avatar, logo, featured image, gallery, cover, and a fallback for anything else — so listing galleries can carry a watermark while profile photos, covers and business logos are left clean. Fields that cannot be identified follow the generic setting. Every field starts ticked, so existing sites keep watermarking exactly what they watermarked before.
- Fixed: field-specific crop ratios were not loading - The crop ratio selectors always displayed their built-in default rather than the value you had saved, which meant re-saving the settings page silently reverted every custom ratio. They now load what was saved.
Onboarding (Fixed)
- The tooltip text now uses the font you picked - Typography was applied to the tooltip container, but the step's body text sits in a child element that the underlying tour library sets a font on directly. A directly targeted rule always beats an inherited one, so the text you actually read kept the library's font no matter what was chosen. It is now styled directly.
- Styling no longer depends on which stylesheet loads first - The tour's styles and the tour library's own styles carried equal weight, so whichever loaded last won. Padding and colours were written in a way that always won, which is why those two kept working while fonts and font sizes were ignored — a split that showed up on sites running CSS optimisation or combining plugins. Every rule is now targeted specifically enough to win on its own merit. After updating, use Elementor → Tools → Regenerate Files & Data (or re-save the page) so the cached page CSS is rebuilt.
Advanced Phone Input (Fixed)
- Country dropdown appeared far from the field on narrow screens - Below roughly 500 pixels of width the phone library switches to a full-screen country picker, moving the list out to the page body and positioning it over the screen. That element shares a class name with the field wrapper, so the plugin's full-width styling overrode its positioning and dropped it into the normal page flow — landing it hundreds of pixels below the input. This affected anyone completing a form on a phone, as well as forms rendered inside a narrow preview or side panel. The styling is now scoped so it cannot touch the picker.
1.7.6
MCP Server (New)
- Connect an AI assistant to your Voxel site - New MCP Server function exposes your site over the Model Context Protocol, so an assistant can read and manage post types, fields, taxonomies, terms, listings and Voxel Toolkit's own settings. 26 tools in total, split between read and write. Off by default; enable it under Functions.
- A setup page that actually explains it - Enabling the function adds Voxel Toolkit → MCP, showing the endpoint URL, whether the requirements are met, and exactly what the tools can and cannot do. Enter your username and application password and it builds the client configuration for you — Claude Code, Claude Desktop, Cursor, VS Code / Copilot, Codex or generic — with one-click copy. What you type stays in your browser: the password is never sent to the server, never saved, and never written into the page.
- Nothing extra to install - The MCP Adapter now ships inside Voxel Toolkit. If another plugin already provides one, or you have the standalone plugin, that copy is used instead and the bundled one stands down.
- Every configuration change can be undone - Before any config write the previous state is snapshotted, and any snapshot can be restored in a single call. Restores are snapshotted too. The last 30 are listed on the MCP page with what changed and who changed it.
- Changes merge instead of replacing - Supplying three settings changes those three; anything not mentioned is left alone. Fields are edited one at a time by key, so there is no way to send a partial field list and silently delete the fields left out of it.
- Preview before committing - Every write accepts a dry run that reports precisely what would change and writes nothing. Deleting a field first tells you how many posts still hold a value for it.
- Permissions are the connected user's - Reads require Edit Posts, writes require Administrator. The MCP function cannot disable itself through MCP, so you can never lose the connection with no way back.
Post Submission Actions (New)
- Do something after a Create Post form is submitted - New function adds a "Submission Actions" section to the Create Post (VX) widget, where you can queue up actions that run once a submission is saved: redirect the visitor somewhere, send a Voxel direct message, or POST the submission to a webhook. Configured per widget, so two forms for the same post type can behave differently.
- Choose when each action runs - Every action can be limited to first-time creation, edits of an existing post, or every submission.
- Redirect anywhere, including the new listing - The redirect target accepts dynamic tags, so
@post(permalink)sends someone straight to what they just created. - Send a Voxel message - From the site admin or the submitter, to the submitter, the admin, or a specific user, with dynamic tags in the message body. Uses Voxel's own messaging pipeline, so blocks, sanitisation, inbox state and notification throttling all behave exactly as a normal message would.
- Webhooks with a verifiable signature - Sends the post, its status, permalink, author and every field value as JSON. Set a shared secret and the request carries an
X-VT-SignatureHMAC so the receiving end can prove it came from your site. - Never blocks a submission - Actions run after the post is saved and cannot fail, delay or reject it.
Recently Viewed (Updated)
- Choose exactly which post types are tracked - The widget's post type setting is now a multi-select rather than one-or-all. Leaving it empty still means all of them, and the shortcode accepts a comma-separated list.
- Hide the widget when there is nothing to show - Two new visibility rules, "Recently viewed is empty" and "is not empty", appear in Voxel's normal Visibility UI so the widget — or a heading, or the whole container around it — can be hidden for a visitor with no history yet. Each rule carries its own post type list. These are evaluated on the server, so they only see history for logged-in users.
- Empty state wording - A "No results text" field in the Style tab. Clear it to show nothing at all.
- Fixed: pages and attachments were being recorded - The tracker treated any post type Voxel knew about as trackable, which included pages, attachments and Elementor templates — so a home page recorded itself on every visit and history could never be cleared. Only real Voxel post types are tracked now, and existing history is filtered on read, so affected sites are corrected without a migration.
Special Hours (Updated)
- Date ranges - A special entry can now span a range rather than a single day, for a holiday closure over several days or a seasonal change of hours. Recurring ranges handle a span that crosses year end.
- Announce closures in advance - A new per-widget setting lists upcoming special dates above the regular hours, so a visitor planning a trip sees a closure before it arrives rather than on the day. Defaults to two weeks; set it to zero to only show a notice on the day itself.
- Duplicate an entry - Special dates often repeat with the same label and the same hours on a different day. Each entry now has a duplicate button that copies its label, status, yearly-repeat setting and every time slot, leaving only the date to fill in.
Saved Search (Updated)
- Listing preview card in the notification email - The default saved search email is now a preview card — image, title, a short blurb and a link — instead of a line of text. Because notification templates are configured per post type, each type's email can pull its own fields, including price.
- New @preview tags -
@preview(image)resolves the best available image for a listing (featured image, then logo, then the first populated image field) at an email-appropriate size rather than the full-size upload, and@preview(excerpt)gives the post text trimmed to a card-sized blurb. Both are filterable. A listing missing either one collapses that part of the card rather than emailing a broken image.
Duplicate Title Checker (Updated)
- Choose which post types are checked - The checker applied to every post type with no way to limit it, which is wrong for types where duplicate names are expected, such as profiles. There is now a post type selector in its settings. Leaving every box unticked checks all of them, so existing sites keep their current behaviour.
Security and reliability
- SVG uploads: sanitiser hardened - Event handlers were stripped using a fixed list of twenty attribute names, matched case-sensitively. Anything outside that list survived — pointer, touch, wheel, drag and clipboard handlers among them — as did any handler written in a different case, such as
onLoad. Handlers are now matched by prefix regardless of case,javascript:,vbscript:anddata:URLs are removed from links, and network access is refused while parsing. Separately,<use>elements were being stripped unconditionally, which silently broke ordinary SVG sprites; only references pointing outside the file are removed now. - Duplicate Post: ownership is checked - Duplication was permitted on the basis of the user's role alone, and the copy is authored to whoever requested it. On a site where members submit listings, anyone holding a permitted role could duplicate another member's post and own the copy. Both the front-end and admin paths now confirm the user may edit that specific post.
- Delete Post Media: shared images are kept - Media referenced by a post was permanently deleted, bypassing the trash, without checking whether another post still used it — so deleting one listing could destroy an image still live on another. Attachments still in use elsewhere are now left alone. A second issue is fixed alongside it: an AJAX action was registered pointing at a handler that was never written, so calling it produced a fatal error.
- Share Count: only real networks are recorded - The tracking endpoint accepted any network name and stored it, so it was possible to create unlimited rows of stored data against a post. Only the networks the feature reports on are accepted now.
- Visitor Location: certificates are verified - Geolocation lookups disabled TLS certificate verification, meaning a lookup could be intercepted and answered with any location. Verification is now on for both secure providers.
- Online Status: "online" means online - The heartbeat ran on a timer regardless of whether anyone was there, so a forgotten tab reported its owner as online indefinitely. It now stops while the tab is in the background or after fifteen minutes without interaction, and resumes the moment you come back. Two supporting fixes: repeat heartbeats no longer write on every beat, and looking up online status for a list of people is a single query rather than one per person.
Advanced Phone Input (Fixed)
- "Only Countries" was being ignored - Voxel uses the same reserved field key,
phone, on every post type, and the plugin stored all of their settings under that one key — so whichever post type loaded last overwrote the rest. A phone field left unconfigured on any other post type silently erased the country restriction set on the one you were looking at. Settings are now kept per post type, and sites that only configured one field start working without re-saving anything. Default Country was affected the same way. - Dropdown positioning - The country list is now explicitly anchored to the input, and the full-width styling no longer stretches the wrapper vertically inside column layouts.
1.7.5.1
AI Autofill
- Limit place lookups to your own region - AI Autofill's business lookup was returning matches from anywhere in the world, so typing a business name could surface a company on the other side of the planet. Suggestions are now restricted to the countries you've already set in Voxel → Settings → Maps → Google Maps → Autocomplete → Countries — the same list Voxel uses for its own location field. Nothing new to configure: if you've already limited Voxel's location suggestions, autofill now matches them. Sites using Mapbox for maps fall back to that country list instead, and a
vaia/places/region_codesfilter overrides both. - Note on the direct lookup - The suggestions dropdown is restricted to your countries. The secondary lookup used when a full business name is resolved directly can only be biased toward a region, because Google's Text Search endpoint accepts a single region hint rather than a country restriction.
1.7.5
Special Hours (New)
- Holiday and one-off hours, like Google Business Profile - New "Special Hours (VT)" post field lets each listing override its regular hours for specific dates — a Christmas closure, a short day, a one-off late opening. Add the field to a post type alongside Work Hours and owners get a simple dated list: pick a date, choose Closed all day / Open all day / Appointments only / enter hours, and optionally give it a label like "Christmas Day".
- Replaces that day everywhere, automatically - When a special date is today, it takes the place of that weekday in the Work Hours (VX) widget, the Open/Closed badge, and every work-hours dynamic tag —
status,status_label,todayand the individual weekday tags — with no template changes or extra widget to add. Two new tags,special_todayandspecial_label, let a template call the day out by name. - Tells visitors the hours are unusual - When a special date applies, the Work Hours (VX) widget shows a notice above the hours — "Special hours", the date's own label ("Christmas Day"), or both, with an icon. Turn it off, change the wording, or hide the label per widget, and style the background, border, radius, padding, typography and icon from the Style tab.
- Repeat yearly, or not - Each date can repeat every year for fixed holidays, or apply to that year only. A date entered for a specific year always wins over a recurring entry, so you can override a single year without touching the annual rule.
- Correct per listing, not per server - "Is today the 25th?" is answered in each listing's own timezone, so a business in Auckland switches to its holiday hours at its own midnight, not the site's.
- Note on search - Special hours change what a listing displays, not how it's indexed for search. On a holiday a listing reads "Closed" on its page and in its dynamic tags, but can still match the "Open now" search filter that day, because Voxel's work-hours search index stores a repeating weekly pattern with no date dimension.
Gallery Responsive Image Count (New)
- Set the gallery tile count per device - The Gallery (VX) widget's "Number of images to load" now has a device switcher, so you can show (say) six tiles on desktop, four on tablet and two on mobile — the same way Columns already works. Always on; existing galleries keep the count they already had as their desktop value, and the Elementor preview updates live as you switch devices.
- The "+N more" overlay follows along - Because the count decides which tile carries the overlay and what number it shows, the gallery is rendered with every tile any breakpoint could need and re-sliced for the current viewport: the badge lands on the right tile with the right count, and the grid pads correctly when a device asks for more tiles than there are images.
- Full gallery still opens in the lightbox - Tiles a breakpoint doesn't show stay in the page, so the lightbox always contains every image regardless of device. Custom Elementor breakpoints (laptop, mobile extra, and so on) are supported, not just tablet and mobile.
Message Details (New)
- A details panel beside every conversation - New "Message Details" function adds a sidebar to the Messages (VX) inbox showing who you're talking to and everything shared in that thread. Enable it per widget in Elementor — there's a switch for the panel and a separate switch for each section, so you can show only what you want.
- Profile, media, files and links - The profile block shows the other party's avatar and name with a link through to their profile. Below it, collapsible Media, Files and Links sections cover the whole conversation, not just the messages currently on screen. Photos open in the same lightbox the chat bubbles use, and each section shows a count and loads only when opened.
- Respects everything the user has already removed - Media and links disappear from the panel exactly as they do from the thread: messages the sender deleted, messages the recipient hid, and anything cleared with "Clear messages" are all excluded, per viewer.
- Adapts to narrow screens - Above a configurable width the panel sits docked beside the conversation; below it, the panel moves off-canvas and opens over the chat from a button in the conversation header, styled as a native inbox header button. Width, colors, borders, padding, typography, thumbnail radius and avatar size are all controllable from the Style tab, and the editor reminds you to widen the widget's container to make room for the panel.
- Fixes the Messages widget's editor tabs - As a side effect, the Messages (VX) widget's Elementor panel now opens on Content, Style, Advanced, Voxel in the usual order. It previously led with Style because the widget declares all of its style sections ahead of its single content section, and Elementor orders the tabs by which it encounters first.
Post Feed Numbered Pagination (New)
- Classic 1 2 3 … page links on any post feed - New always-on "Post Feed Numbered Pagination" utility adds a "Numbered (VT)" choice to the Post feed (VX) widget's Pagination dropdown, alongside Voxel's Load more / Prev-Next / None and the toolkit's Infinite Scroll. Nothing to enable on the Functions page — pick it per widget in Elementor, on either the Search Form or the Filters data source.
- Voxel's own paging, untouched - Selecting it renders the feed in Voxel's Prev/Next mode and inserts the numbers between those two buttons, so fetching, rendering, map syncing and URL updating all stay on Voxel's own code path. Page links are real URLs (
?pg=3) whenever the search form is set to keep the URL in sync, so a page can be linked to or opened directly. - Controls for shape and style - Choose how many pages show either side of the current one, whether the first and last page are always pinned with an ellipsis gap, and whether the Prev/Next buttons stay visible. A full Style section covers spacing, size, padding, radius, typography, and colors/borders across Normal, Hover, and Current states.
Owner Review Replies (New)
- Branded replies to reviews on your own listing - New "Owner Review Replies" function detects when a listing owner replies to a review on their own listing through Voxel's existing native "Post a reply" box — no separate UI, nothing to toggle. That one reply is automatically published under the listing's own name and logo (with a fallback to the post's featured image) instead of the owner's personal profile, and gets an "Owner Response" badge next to it.
- Zero setup, nothing to get wrong - There's no checkbox or "post as" switch for the owner to find or miss. The first reply an owner posts on their own listing's review is branded automatically; any reply after that (or replies from anyone else) go through completely unchanged. A small "Replying as [Listing Name]" label appears above the reply box on the owner's own listing so it's clear what will happen before they type.
- Fully compatible with Voxel's native reply UI - Editing and deleting the branded reply works exactly like any other reply, through Voxel's own controls — this only changes who the reply is published as, not how it's managed.
- Proper Voxel App Event - Fires "Voxel Toolkit: Owner replied to review", a real Voxel App Event with its own in-app + email notification (customizable from Voxel → App Events) so the original reviewer is notified. Only setting is the badge's text (default "Owner Response").
Service Area Search (New)
- Reverse proximity search for delivery/service businesses - New "Service Area Search" function adds a second matching condition to Voxel's location search: alongside the visitor's own search radius, each listing now defines its own service radius via the new "Search Radius (VT)" field — a result only shows when the visitor's searched location falls within the listing's coverage area. Listings without a radius set behave exactly as before.
- No setup that can be gotten wrong - The radius field is resolved automatically by field type, not by a configured key — add "Search Radius (VT)" to a post type under any name and it's picked up immediately. Units (km/mi) and the location filter are auto-detected from the post type's own settings.
- Coverage area on the map - The Map (VX) widget (set to "Show marker of current post") can draw the listing's service radius as a styled circle with an optional label, matched to whichever map provider the site uses (Google, Mapbox, OpenStreetMap).
Response Time (New)
- A dynamic tag for how fast a listing replies - New "Response Time" function adds a
@post(response_time)dynamic tag showing how quickly a post's owner typically replies to direct messages, tracked strictly through the post's own conversations (so a vendor with multiple listings gets a separate score per listing). Turn it on for whichever post types use messaging — no field to add anywhere, the tag just works. - Four dynamic tags -
@post(response_time)(average reply time in hours — a plain number, ready to use in Voxel Visibility Conditions with "is less than / greater than / equal to"), plus@post(response_time.formatted)(a human string like "2.5 hours" or "3 days"),@post(response_time.replies)(reply count) and@post(response_time.rate)(reply rate, 0-100%). - Sensible math under the hood - Averages the most recent replies (configurable sample size), excludes unusually slow replies from the average past a configurable cutoff so one late reply doesn't skew a listing's "typical" time (they still count toward the reply rate), and requires a minimum number of replies before showing a value at all. Recomputes automatically the moment a new message is sent or received — no cron needed.
Message Moderation (New)
- Screen direct messages before they're sent - New "Message Moderation" function checks Voxel Messages (VX) conversations in real time, before a message is created. Two independent checks can flag a message: a line-by-line keyword list (case-insensitive) and/or an AI check using a plain-language prompt describing what to flag (e.g. off-platform contact attempts, harassment, scams).
- Choose what happens when a message is flagged - Notify the admin, block the message from sending, or both. Blocking shows the sender a configurable generic message so the exact rule that matched is never revealed.
- Runs through Voxel's App Events - The admin notification is a proper Voxel App Event ("Voxel Toolkit: Message flagged by moderation") — recipient, in-app notification, and email subject/body are all customizable from Voxel → App Events, with dynamic tags for the sender, receiver, matched reason, detection source, and message content.
AI Reply Suggestions (New)
- AI-suggested replies in the inbox - New "AI Reply Suggestions" function adds a ✨ button to Voxel's Messages (VX) composer. One click reads the visible conversation and suggests ready-to-send replies as chips — click a chip to drop it into the message box, edit if needed, and send. Uses the provider configured in AI Settings.
- Configurable - Choose how many suggestions to generate (2–5), the tone (match the conversation, professional, friendly, or brief), and add your own custom instructions. Replies are suggested in the same language the conversation is written in.
Search Analytics (New)
- See what visitors search for - New "Search Analytics" function tracks keyword searches from Voxel search forms — sitewide and per post type — and adds a "Search Analytics (VT)" admin dashboard: total searches, unique terms, searches-per-day trend chart, per-post-type breakdown, and a filterable top-terms table. Filter everything by date range (7/30/90/365 days or all time) and post type.
- Popular Searches widget - New "Popular Searches (VT)" Elementor widget shows the most-searched terms as clickable chips (sitewide or per post type, ordered by popularity or recency, optional search counts, full chip styling). Chips either link to the search results page or — connected to a Search Form widget the same way Voxel's Post Feed connects — update the form live on the same page. Enabling Search Analytics activates the widget automatically.
Order Reports (New)
- A front-end sales dashboard for vendors - New "Order Reports (VT)" Elementor widget shows revenue, order count, average order value, and items sold, with a date-range filter (This week/month, Last 30/90 days, This year, All time, or a custom range) and a revenue/orders trend chart. Vendors see only their own sales; an admin-only "entire platform" scope is available too.
- Status breakdown and top products - A doughnut chart of orders by status (using Voxel's own status labels) and a ranked list of best-selling products by revenue, with quantity sold.
- Fully styleable - Typography, colors, borders, shadows, spacing, and chart colors are all controllable per element from the Style tab, and the whole widget is responsive down to mobile.
Invoice Generator (New)
- Downloadable invoices for every order - New "Invoice Generator" function adds a "Download invoice" button to the single-order screen for buyers, vendors, and admins. Invoices are print-perfect documents (the browser's print dialog doubles as Save as PDF) with secure, permission-scoped links.
- Fully configurable - Choose the seller identity (platform details, vendor details pulled from their profile via dynamic tags, or vendor with a "Sold via" platform line), logo (site logo or custom), invoice numbering (prefix + format tokens with a sequential counter — numbers are issued once per order and never change), extra invoice lines powered by dynamic tags (site, vendor, customer, and the purchased listing's fields), a footer note, and payment method/transaction ID toggles.
Pre-Approve Posts (Updated)
- Auto-approve by membership plan - Pre-Approve Posts can now approve users based on the membership plan they're on, alongside the existing manual, role and verified-profile options. A user still qualifies if any one option applies.
- Auto-approve by listing plan - Users can also be approved by a listing plan they hold. Only plans they can currently publish with count: expired, cancelled, refunded, unpaid and fully-used plans are ignored, test-mode and live orders are kept apart, and a plan only approves the post types it can actually publish to — so a plan limited to Places won't auto-approve a submission to another post type.
- The two plan types are kept separate - Membership plans and listing plans are different catalogs in Voxel that can share the same plan names (a "Premium" membership and a "Premium" listing plan are unrelated), so each has its own setting and is matched independently. The free membership plan is labelled where it's selected, because Voxel reports every user without a paid membership as being on it — selecting it approves your whole user base.
- Clearer approval reporting - The user profile screen and the "Pre-Approved?" users column now name every route that applies to a user, including which role or plan matched.
Recently Viewed (Updated)
- Card template selection - Choose which card template the Recently Viewed widget uses per post type: the default card or any of that post type's custom card templates.
- Slider layout - A new Layout option (Grid / Slider) displays recently viewed posts as a horizontal slider with navigation arrows and touch swiping.
AI Bot
- Auto language matching - AI Settings → Response Language gains an "Auto — match the user's language" option: the AI Bot detects the language each visitor writes in and responds in that same language.
AI Settings
- WordPress AI provider fixes - Resolved empty-response failures with the WordPress AI provider (affected all AI features using it, including AI Bot): the integration now uses the AI Client library directly, and models that reject the temperature parameter are handled automatically.
Bug fixes
- See More modifier stripped formatting when collapsed - The
see_moredynamic tag modifier removed all HTML while truncating, so collapsed text lost its paragraphs and line breaks and ran together as a single block, then snapped back into shape when expanded. Truncation now keeps the markup intact and balanced, so the collapsed view is simply the start of the expanded one. - See More miscounted words in accented languages - Word counting used PHP's
str_word_count, which only recognises ASCII letters, so accented characters were treated as word breaks and text in languages like Lithuanian, Polish or Vietnamese was cut at the wrong place. Words are now counted in a Unicode-aware way. Words either side of a paragraph break are also no longer run together when measuring. - Function key collision - "Message Moderation" (this release's keyword/AI message screening) was accidentally registered under the same settings key as the pre-existing "Messages Admin" dashboard, silently hiding the latter from the Functions page and sharing its enable/disable toggle. Message Moderation now has its own key; Messages Admin is unaffected and correctly labeled again.
1.7.4
Post Relation Search (Updated)
- Major upgrade to the relation search filter - Beyond the existing type-to-search, the filter now supports opt-in multi-select with removable chips, ANY/ALL matching, adaptive result counts, dropdown ordering, scope (any author or current user only), and per-widget curation (hide or restrict specific posts). Existing filters keep their exact single-select behavior until you enable the new options per filter in the post type editor.
Dialog Auto Trigger (New)
- Popup-style triggers for Voxel's Dialog widget - Open the Dialog (VX) widget automatically on page load (with delay), exit intent, scroll depth, or inactivity. Includes show frequency (every load / once per session / once every X days), audience targeting (everyone, logged-in, logged-out, plus user roles and Voxel membership plans), advanced rules matching Elementor Pro popups (page views, sessions, max shows, referrer, traffic source, device, browser, scheduling), and an option to hide the trigger button.
Conversion Tracking (New)
- Voxel purchases as real analytics conversions - Send every Voxel purchase — product orders, bookings, promotions, membership plans, listing plans, claim requests — to Google Analytics 4 and Umami as proper ecommerce events with transaction ID, order value, currency, and line items. Zero configuration: auto-detects your existing GA4/Umami snippet, fires exactly once per order, and dispatches in the customer's own browser session so attribution stays intact. Optional per-category toggles, destination toggles, zero-value skipping, and test-mode tracking.
Image Field Prefill (New)
- "Prefill value" for the Image field - The same dynamic-tag Prefill option other Voxel fields have, now on images. Prefill new-post forms with attachment IDs, URLs, or dynamic tags — e.g. `@author(avatar)` prefills each submitter's own avatar — with Voxel's "Default image" setting as the fallback. New posts only; submitters can remove or replace the image.
App Event Test Emails (New)
- Test any notification email - A "Send test email" button on every notification in Voxel's App Events screen. Renders the email exactly like a real notification — dynamic tags filled with sample data, wrapped in Voxel's email template — and sends it to any address with a [Test] subject prefix. Even tests unsaved edits.
Form Action: Voxel Message (New)
- Elementor forms send Voxel messages - A "Voxel Message (VT)" action for Elementor Pro's Form widget: on submission, send a Voxel direct message to any user ID. Recipient, sender, and message support dynamic tags and form field shortcodes, and messages flow through Voxel's real messaging pipeline. Requires Elementor Pro.
Relation Field Conditions (New)
- Conditional logic for relation fields - "Is empty / Is not empty" rules for post relation fields in the post type editor — show or hide other form fields based on whether a relation has any posts selected. Works with every relation configuration, including relations inside repeaters.
Post Feed Infinite Scroll (New)
- Infinite scroll for the Post feed widget - The Pagination setting gains an "Infinite Scroll (VT)" choice: the Load more button is hidden and the next page loads automatically as visitors scroll near the end of the feed. Always available — no setup.
Orders Screen Options (New)
- Screen Options for the Orders page - WordPress' native Screen Options panel on Voxel's Ecommerce → Orders page: orders per page and column visibility, saved per user. Always available — no setup.
Quick Search: Related Post Thumbnail (New)
- Thumbnails from related posts - The Quick Search thumbnail setting gains a "Related post (VT)" option: pull a search result's thumbnail from a related post's image field — like showing the venue's logo on event results.
Analytics & Custom Tags
- Umami Analytics support - The function (renamed from "Google Analytics & Custom Tags") can now install the Umami tracking script: enter your Website ID (Umami Cloud or self-hosted) and it's added site-wide alongside your GA4/GTM/custom tags.
Admin Improvements
- Docs links everywhere - Every function, widget, and post field card links to its documentation on this site.
- Cleaner descriptions - All function and widget descriptions rewritten in plain, simple language.
- Smarter Configure button - Only appears for functions that actually have settings.
- "Updated" badge - Functions with major upgrades are marked with an "Updated" badge.
1.7.3
AI Autofill (New)
- AI Autofill feature - Paste a website URL, Google Maps link, or business name and let AI fill a new Voxel listing draft — title, description, categories, location, hours, images, and more. Enable it under Voxel Toolkit → Functions, then drop the "AI Autofill (VT)" Elementor widget onto your submission page. All of its options (rate limits, Google Places key, image-rights consent, vision curation, and more) live right in the AI Autofill settings panel — no separate settings page.
- Uses your existing AI configuration - AI Autofill uses the same provider and API key you already set in Voxel Toolkit → AI Settings, so there's no second AI to configure.
- WordPress AI (Connectors API) - AI Settings now offers "WordPress AI (Recommended)" for sites on WordPress 7.0+. It routes through WordPress's native AI Client, so you configure AI once, in WordPress, and every plugin can use it — no API key stored in Voxel Toolkit at all. Includes a one-click "Test Connection" button. Your existing OpenAI or Anthropic key configuration is unchanged.
Fixes
- Profile Progress widget - Restored the missing "Profile Progress (VT)" Elementor widget. It had been hidden by an internal setting that was never surfaced; it now has its own toggle under Voxel Toolkit → Widgets.
- Messenger - The floating messenger bubble no longer appears unresponsive when you have no conversations yet — it now shows a "No conversations yet" message when opened.
- Image Optimization - Removed a harmless-but-noisy JavaScript error (
wp is not defined) that could appear in the browser console on the front end.
1.7.2.1
Translations
- Updated Translation Template - Regenerated
languages/voxel-toolkit.potso it includes all strings added since 1.6.1.4, covering the FluentCRM Integration, Image Crop Tool, Social Proof visibility controls, and other recent features (4,145 strings, up from 3,776).
1.7.2
FluentCRM Integration (New)
- Sync Members to FluentCRM - Automatically creates and keeps a FluentCRM contact in sync for each Voxel user — on registration, profile save, email change, and deletion — with a configurable field map and new-contact subscription status.
- Contact-Screen Tabs - Adds Voxel context to the FluentCRM contact screen: a member's Reviews, Timeline activity, Membership, Paid Listings, and per-post-type tabs.
- Auto-Tagging - Automatically applies and removes FluentCRM tags based on a member's WordPress role, active membership plan, active paid-listing plan, and state flags (has a listing, has a membership). A one-time "Sync Users" backfill also applies tags to existing members.
- Automation Triggers (FluentCRM Pro) - New Voxel triggers for the FluentCRM funnel builder: Listing Published, Membership Purchased, Membership Cancelled, Order Completed, and Review Submitted — each with the Voxel Toolkit icon in the trigger list.
- Bulk Sync Tool - Backfill your entire existing member base into FluentCRM in one pass from the settings panel.
Image Crop Tool (New)
- Crop on Upload with Aspect Ratio - Added to the Image Optimization function: an interactive crop interface that appears before upload, with a default aspect ratio and per-field-type ratios (Avatar, Logo, Featured, Cover, Generic image) — choose Disabled, Free, 1:1, 16:9, 4:3, or 3:2. The crop step is skipped for batch uploads, the gallery field, mobile/touch devices, and any field set to Disabled.
Social Proof
- Visibility Controls - New settings to hide social-proof notifications for logged-in users, and to exclude specific post types or specific pages.
Saved Search
- Widget No Longer Hangs on a Spinner - The saved-search list could get stuck on a loading spinner whenever a saved search contained a filter. The list now builds safely and always clears the loading state.
- "View Search" Opens the Right Page - The magnifying-glass button in the saved-search list could land on a blank page when the post type had no archive. Saved searches now remember the page they were created on and reopen it with the filters applied.
1.7.1.2
Recurring Events
- Cards Match the Date Filter - When a recurring-date filter (Today, This Week, This Month, etc.) was active, the results could include occurrences from outside that window and even relabel a card's date incorrectly (e.g. showing a weekday in place of the year). Cards now show only the occurrences that fall inside the selected window, with their dates rendered correctly.
Active Filters Widget
- Default Term & Location Now Show as Chips - When a search form had a pre-selected category or a default location, those defaults weren't appearing as active-filter chips. They now show up alongside the rest of your filters.
Saved Search
- Email "View" Link Works - The link in saved-search notification emails pointed at an empty address and showed a blank post type. It now links to the real listing and shows the correct type label.
- Cleaner Modal Separators - The dividers between items in the saved-search popup were drawing in the wrong places. The Popup Border Color control now styles the header, footer, and item separators as expected.
- Enable Save / Load on Every Search Form - Two new options let the Save Search and Load Search buttons appear on all search forms at once, instead of toggling each widget individually.
Messenger
- Bubble Appears by Default - A messenger that was never explicitly configured could stay hidden. It now displays by default unless you turn it off.
Location Filter
- Icons No Longer Covered After Denying Location - After declining a browser location prompt, the Suggest Edits modal's styling was bleeding onto the location filter and painting over its icons. That styling is now scoped to the modal only.
AI Bot
- Respond in Any Language - Added a "Custom" option to the response-language setting so you can have the bot reply in any language you specify, not just the ones in the preset list.
Add Category
- Placeholder Color Control - Added an Input Placeholder Color styling control so the placeholder text in the Add Category form can be set to any color (and shows at full strength across browsers).
1.7.1.1
Advanced Phone Input
- Selected Country Code Now Saves - Picking a country (e.g. Suriname +597) and saving no longer reverts to +1. The full international number is now stored on the field itself, so the country survives a save — in both single phone fields and repeater rows — and the default-country setting takes effect.
Reading Time
- Counts Repeater & Custom-Field Content - Reading time now counts text stored in custom and repeater fields, not just the main content area, so posts whose body lives in repeaters get an accurate estimate instead of always showing "1 min".
Messenger
- Chat Reliably Opens When Clicked - The floating messenger button could stop responding to clicks, and the shortcode loaded no script at all. The button now opens the chat consistently whether placed via the widget or the shortcode.
AI Bot
- Clear "No Results" Feedback - When a search matched nothing, the bot could hang on "Searching…" with no follow-up. It now always tells you when nothing was found.
- Model List Cleanup - Removed retired Claude models from the AI provider settings so only currently-supported models can be selected.
Auto-Share to Timeline
- Listing Images Now Appear in Shared Cards - When a listing's image lived in Voxel's cover field, the auto-shared timeline card came up blank — the feature was looking for a field named
cover_image, which doesn't exist. It now checks the correctcoverfield first, so those cards show their image. - No More Broken-Image Icons - When a post had no image at all, the timeline card rendered a broken-image icon (Voxel draws the preview image with no empty-source guard). The card now falls back to a default preview image, or your site logo, so it never looks broken.
- New "Default preview image" Setting - Set a placeholder image to use whenever a shared post has no featured or Voxel image. Found under Auto-Share to Timeline → Message.
- Front-End Submissions Keep Their Image - For listings submitted from the front end, the featured image often finishes uploading a moment after the post is created — so the card used to lock in with no image, permanently. The card now updates itself automatically as soon as the image lands.
- Theme Override Hook (developers) - New filters let a theme supply a custom preview image (e.g. the site's Open Graph image) without editing the plugin:
voxel_toolkit/auto_share/preview_image,voxel_toolkit/auto_share/fallback_image, andvoxel_toolkit/auto_share/image_field_keys.
1.7.1
AI Bot
- Search Actually Returns Results - The AI Bot was getting stuck after saying "Searching for…" and never showing anything. It now returns real matches instead of stopping at the announcement.
- More Reliable Responses - Tightened up how prompts are sent so the bot returns search results consistently instead of occasionally going off into chatty replies.
- Welcome Message No Longer Grows Backslashes - Every time the AI Bot settings were saved, an extra backslash crept into apostrophes (you're → you're → you\'re). Saving is fixed, and any already-corrupted messages clean up automatically on the next page load.
Active Filters Widget
- Hide on Tablet / Hide on Mobile Now Works - Elementor's responsive visibility controls had no effect on this widget. They work now.
- Pre-Applied Filters Show on Archive Load - On archives where filters are active by default (user-profile location, default radius, persisted filters from a previous visit) but the URL doesn't show them yet, the filter chips were rendering empty. They now show every filter that's actually applied.
- Smoother Mobile Swiping - Side-to-side swipes on the horizontal-scroll filter row no longer fight the page scroll or accidentally trigger pull-to-refresh.
Breadcrumbs Widget
- Child Terms No Longer Disappear - When a post was tagged with both a parent and a child term, the child term sometimes vanished from the trail (e.g. "Connecticut > [Fairfield missing] > Listing"). The full hierarchy now shows every time, regardless of how the term names sort.
Advanced Phone Input
- Mobile Phone Buttons Now Work - Phone numbers entered with a leading 0 (common in Europe) produced a broken
tel:link that mobile dialers refused to call. The leading 0 is now stripped automatically so the dialer always receives a valid international number. - One-Click Cleanup for Existing Numbers - New tool on the Advanced Phone Input settings page that fixes every previously-saved phone number on your site in one click. No need to ask users to re-save their profiles.
Image Optimization
- Social Link Previews Now Work with WebP - WhatsApp (and several smaller link scrapers) can't decode WebP, so shared links from sites using WebP optimization were showing no preview thumbnail. New Social Fallback setting keeps or generates a JPEG copy alongside each WebP and swaps it into the meta tags WhatsApp, Facebook, and Twitter look at — so previews show up everywhere.
- Backfill JPEG Copies - For sites that already converted everything to WebP, a new backfill action generates JPEG companions for existing images so the social-fallback feature works retroactively.
AI Post Summary
- Clearer Error Reporting - When a summary fails to generate (API key missing, post has no content, OpenAI/Anthropic returns an error), the reason now appears in the error log alongside the post ID. Easier to tell which posts failed and why.
RSVP Widget
- Post Authors Can Export Their Own Attendees - The Export CSV button on the attendee list was effectively admin-only. New widget setting picks who sees the button (admins, or admins plus the post author), and the export now honors the post author's edit permission so authors can actually download their event's attendee list.
Suggest Edits Widget
- Location Filter Icons Stop Disappearing - On pages with both this widget and a search form, denying the browser's location-permission prompt could make the icons in the search form's location filter vanish. Fixed.
- Faster Page Loads - The widget was pulling in WordPress's full media library JavaScript on every page where it appeared, even if the photo-upload feature was turned off. That payload now loads only when photo-upload is actually enabled.
Route Planner
- Mapbox Map No Longer Errors Out - Under certain timing conditions, the Mapbox map would fail to display with a "no access token" error. Fixed.
- Route Waypoint Popups Render on Mapbox - Popups on Mapbox setups were failing silently. Now works across Google, Mapbox, and Leaflet.
Add Category
- Form Button Border Radius - Added an Elementor style control for the Submit and Cancel button corners on the add-category form.
Saved Search Modal
- More Style Controls - Added Elementor controls for button corner radius, input focus border color, input focus glow, notification toggle text color, and checkbox color.
1.7.0
New: Multi-Locations
- Integrated Multi-Locations function - Map a Voxel post type to a repeater field that holds additional locations; indexed locations show as extra map markers on archive maps and post cards match location-based searches when any of their multi-locations falls within the search area. Per-post-type mappings with badge color controls, spatial index table, and a chunked re-index tool inside the Voxel Toolkit settings panel
New: Auto-Share to Timeline
- Integrated Auto-Share to Timeline function - When a user publishes a new listing, automatically creates a sitewide user_timeline entry with a link-preview card pointing to the post. Per-post-type source selection, per-role / per-plan access control, rate limits per request and per author/hour, customizable message template with placeholders and one-click copy, and support for HTML entity emoji codes
New: Recently Viewed (VX) Widget
- Integrated Recently Viewed widget - Track each user's recently viewed Voxel posts (user meta for logged-in users, localStorage for guests) and display them via an Elementor widget or
[voxel_recently_viewed]shortcode. Cards render from the Voxel post type's card template, not a custom layout, so they match the rest of the site
Active Filters Widget
- Mobile Horizontal Scroll - New control that makes the filter row horizontally scroll on screens under 768px instead of wrapping. Scrollbar is hidden and a soft right-edge mask hints at more content off-screen; Clear All stays pinned
- Location Abbreviation - New control that strips coordinate tails (
;lat,lng,radius) and parens (Nearby(lat,lng)) from location filter values, and shortens full addresses to "City, State ZIP". Prevents the long13079 N Torrey Pines Rd, San Diego, CA 92121, USA;32.9348, 117.26, 50chip from dominating mobile screens
Bulk Resize (Image Optimization)
- Update Content References on Conversion - New opt-in setting (default on). When Bulk Resize converts an image to WebP, the old URL no longer breaks images embedded in posts. Targets
wp_posts.post_content/post_excerptvia SQL REPLACE and walkswp_postmetawith a serialization-safe pass so length-prefixed PHP strings stay valid. Catches absolute, CDN, protocol-relative, and root-relative URL variants by rewriting the relative path within/uploads - UTF-8-safe attachment metadata -
pathinfo()was mangling multibyte filenames into?placeholders on servers running in the C/POSIX locale, which poisoned attachment titles in the media library; now uses UTF-8 aware regex extraction and validates the result before writing to the database
Onboarding Widget
- Fix for Archive Templates - The March fix only checked templates on single pages. Archive templates (and taxonomy archives) now also go through the template scan, so the intro.js tour runs correctly on archive-rendered pages
Schedule Posts
- Fix for Single-Page Create Forms - The scheduler never appeared on non-stepped Create Post forms because the submit-button detection rejected all anchor tags to avoid matching the confirmation page "View" link. Single-page forms render the publish element as
<a class="ts-save-changes">, so the gate now keys on that class instead of tag name
Saved Search Modal
- New modal style controls - Added Elementor controls on the Voxel search form widget for the Save Search modal: button border radius, input focus border + glow, "Enable notifications" text color, and "Enable notifications" checkbox color
- Softer default focus ring - Removed the strong purple focus glow from the input; default is a subtle gray border with no ring (still customizable via the new focus controls)
Add Category
- Fix fatal on Voxel Events admin page - The term dynamic tags (
@term(name),@term(taxonomy), etc.) were exposed as aTag::Objectdata type, which Voxel'sExporter::add_group()rejects with a fatal type error that took out every event's admin row. Now exposed via a properBase_Data_Groupsubclass with the same tag keys, so existing email templates keep working
1.6.1.9
Temporary Login Links
- Fix for WordPress 6.8 Compatibility - Temporary login links stopped working after a WordPress update; resolved the compatibility issue so temp login URLs function correctly again
AI Chatbot
- Fix Temperature Error with Reasoning Models - OpenAI reasoning models (o1, o3, o4 series) reject custom temperature values, causing an API error when using the AI Chatbot; now omits the temperature parameter for reasoning models, letting the API use its default
1.6.1.8
Onboarding Widget
- Fix for Single Listing Templates - Onboarding widget scripts (intro.js) were not loading on single listing pages because the asset check only looked at the listing post's Elementor data, not the Voxel template's; now checks all post type templates so the tour triggers correctly on any Voxel-rendered page
Suggest Edits
- Fix Multi-Select/Taxonomy Override - Accepting a suggested edit for multi-select or taxonomy fields no longer replaces all existing values; suggested values are now merged with existing ones (e.g., suggesting "Free WiFi" on a listing with "Toilets, Vegan Options" will add it rather than replacing them)
Breadcrumbs Widget
- Prefix & Suffix Text Style Controls - Added Elementor style controls (color, typography, spacing) for the Prefix Text and Suffix Text options; sections appear conditionally when text is set
Add Category
- Fix UI Leaking into Header/Menu Popups - The "Add new term" form was appearing in header user menu and create listing popups after selecting a taxonomy in the listing creation form; now expires the stale form group reference and skips injection into header/navigation contexts
- Fix Multi-Field Term Selection - When multiple taxonomy fields had add-term enabled, creating a term in the second field would autofill into the first field; now captures the correct form group reference at injection time and filters Vue component resolution by field key
External Link Warning
- Fix OAuth/Social Login Interference - The external link warning modal was intercepting Google login and other OAuth redirects, blocking social login flows; now automatically bypasses known OAuth providers (Google, Facebook, Apple, Microsoft, GitHub, Twitter/X, Discord, LinkedIn) and any URL with a
redirect_uripointing back to the current site
RSVP Widget
- Fix Disappearing Admin Buttons - Approve, Reject, and Delete buttons on the attendee list were disappearing on page load because the cache-proof refresh rebuilt the list without admin action buttons; now passes admin state via data attributes so buttons persist after refresh
Admin Taxonomy Search
- Searchable Parent Category Dropdown - New option to convert the native Parent Category
<select>on taxonomy term add/edit pages into a searchable Select2 dropdown; useful when taxonomies have many terms to scroll through; toggle in Admin Taxonomy Search settings
Saved Search Widget
- Dialog Style Controls - Added Elementor style controls for Save/Load Search modals: input field (background, border, focus border, focus shadow), notification toggle (label color, checkbox accent), button border radius, and divider colors (header, footer, item separator)
- Load Search Border Fix - Fixed stray top border appearing on the first search result after the "Clear Filters" row in the Load Search modal
Duplicate Title Checker
- Fix Self-Match on Edit - Editing a listing 2+ times would trigger a false "duplicate title" warning because the checker failed to detect the current post ID from Voxel's frontend URL (
?post_id=); now correctly excludes the post being edited
Address Modifier
- Geocode Failure Caching - Failed geocoding results are now cached for 1 hour to avoid repeatedly hitting the API for the same bad address; successful results remain cached for 24 hours
- Nominatim Rate Limiting - Added 1 request/second rate limiter for Nominatim (OpenStreetMap) geocoding to comply with their usage policy; also added explicit 10s timeout and SSL verification
Profile Completion
- Support for first_name, last_name, and taxonomy fields -
profile_completionmodifier now correctly detectsfirst_nameandlast_name(fetched fromwp_usermetainstead of post meta) and taxonomy fields (checked viaget_the_terms()instead of post meta); also acceptsvoxel:-prefixed keys (e.g.,voxel:first_name)
Image Optimization
- Server-Side WebP Conversion for Media Uploads - Added
wp_handle_uploadfilter that converts JPEG/PNG to WebP server-side when client-side plupload conversion fails (e.g., Media > Add Media File); respectsoptimization_modesetting, appliesmax_width/max_heightresize andoutput_quality; skips files already arriving as WebP,originals_onlymode, and servers without WebP support; returns original file unchanged on any failure
Route Planner
- Fix Two-Finger Gesture on Mobile -
initCooperativeGestures()referencedthis.map.sourcewhich is undefined; changed tothis.map.getSourceObject()so cooperative gestures (Google Maps, Mapbox, Leaflet) now actually initialize on touch devices
Checklist
- Safari Compatibility Fix - Replaced RegExp lookbehind assertion in progress text update that caused the entire JS file to fail in Safari < 16.4 (and iOS Safari), breaking all checklist interactivity; uses a single capture-group regex instead
- HTML Support in Descriptions - Checklist item descriptions now support HTML tags (links, bold, italic, lists, etc.); sanitized with
wp_kses_post()on save and output so users can add clickable links and basic formatting
1.6.1.7
Route Planner
- Two-Finger Gesture on Mobile - Map now requires two-finger gestures to pan on touch devices, so single-finger swipe scrolls the page normally instead of trapping the user; shows a brief "Use two fingers to move the map" overlay on single touch; uses native cooperative gestures for Google Maps, cooperativeGestures API (with fallback) for Mapbox, and a manual handler for Leaflet/OSM; toggleable in Elementor, enabled by default
Image Optimization
- Fix Ghost Upload Slot in Media Library - Rewrote plupload integration to swap file content in-place on the existing plupload File object instead of removing/adding queue entries; the old approach broke WordPress's internal file-to-attachment mapping, causing a second upload slot that stalled at ~20% and required re-selecting the image
Listing Plan Notifications
- New Function - Send email notifications to users when their individual listings are approaching expiration (based on
voxel:listing_planuser meta withfixed_daysexpiration mode); supports per-listing dedup, 7 dynamic tags ({listing_title},{expiration_date},{remaining_days},{plan_name},{post_type},{amount},{currency}), test emails, and manual trigger with stats
1.6.1.6
Saved Search Widget
- Notification Button Active State - Notification toggle button now reflects Elementor Active tab styles (background, icon color, border) when notifications are ON, not just on click
- Filter Tags Text Color Fix - Text Color control under Filter Tags now correctly applies to criterion values (was blocked by base CSS specificity)
International Phone Input
- Deferred XHR/Fetch Hooking - XHR and fetch monkey-patches are now only installed when a phone input actually exists on the page, eliminating unnecessary string checks on every AJAX request site-wide (calendar, notifications, Cloudflare beacons, etc.)
- Conditional Visibility Fix - Fixed
@post(phone) Is not emptyalways evaluating false when Advanced Phone Input is enabled; added render fallback to the dynamic data tag so bare@post(phone)returns the raw phone value
Weather Widget
- Localized Forecast Dates - Forecast day names now respect the widget's language setting using IntlDateFormatter (e.g., "pon., 16 lut" in Polish); falls back to English if the intl extension is unavailable
- Forecast Humidity & Wind - Forecast cards now show humidity and wind speed when those toggles are enabled (previously only shown on Current Weather view)
- Translated Detail Labels - "Humidity" and "Wind" labels are now translated across all 40 supported languages in both Current Weather and Forecast views
1.6.1.4
Enhanced TinyMCE Editor
- Upload Capability for All Users - Dynamically grants
upload_filescapability to all logged-in users when Enhanced Editor is active; fixes media uploads silently failing for roles like Voxel's "visitor" (mapped to subscriber) that lack this capability by default
Saved Search Widget
- Share Search Button - Added a Share button to each saved search card that copies the search URL to the clipboard; includes Elementor toggle, custom label, success message, and icon controls
- Action Button Hover & Active States - Added Normal/Hover/Active tab controls for action button background, icon color, and border color styling
AI Settings
- Updated AI Model Lists - Replaced outdated OpenAI models with GPT-5 Mini, GPT-5.2, GPT-5 Nano, and o4-mini; replaced outdated Anthropic models with Claude Haiku 4.5, Sonnet 4.5, Sonnet 4, Opus 4, Opus 4.5, and Opus 4.6
- OpenAI GPT-5 Compatibility Fix - Fixed all OpenAI models (GPT-5 series and o4-mini) failing with "Unsupported parameter: max_tokens" by switching to the required
max_completion_tokensparameter
Saved Search Notifications
- Double Email Fix - Fixed users receiving two emails (one from Voxel async, one from batch processor) when email batching is enabled; Voxel's async email is now properly suppressed even after admin config merge
- Batch Email Reliability - Batch emails now process immediately after queuing instead of relying solely on WP-Cron, ensuring timely delivery
- Voxel Email Template - Batch emails now use Voxel's styled email template (logo, accent colors, footer) instead of a basic HTML wrapper
- Admin Template Support - Batch emails now respect admin-customized email subject/message from Voxel's app events settings
- Dynamic Tag Fix - Fixed
@recipient(display_name)and other recipient/site tags not rendering in batch emails
Weather Widget
- Kelvin Units Fix - Fixed "Error loading weather data" when Kelvin units selected by mapping to the correct OpenWeatherMap API parameter
Image Optimization
- WebP Upload Inflation Fix - Fixed client-side optimization inflating WebP files by re-encoding through canvas; same-format files that don't need resize or watermark now skip the canvas pipeline entirely, preserving original file size
- Size Comparison Fallback - Added safety net that keeps the original file when canvas re-encoding produces a larger result (e.g., resize/watermark applied but output is still bigger)
- Keep Original Name Fix - Fixed "Keep original name" filename format still appending counter and session suffix (e.g.,
-01-djsv); now preserves the original filename with only the extension changed when format conversion occurs - Watermark Media Uploader - Replaced the plain URL text input for watermark images with a proper WP media uploader (preview, upload/remove buttons); watermark PNG uploads now bypass image optimization to prevent WebP conversion; existing URL-only settings are auto-migrated to attachment IDs
1.6.1.3
Table of Contents Widget
- Repeater Field Completion - Fixed repeater fields not showing green completion indicator when items are added
- Conditional Field Visibility - Fixed conditional fields still appearing in TOC when their conditions aren't met; TOC now syncs with form visibility
AI Post Summary
- Increased Max Token Limit - Raised the maximum token limit from 1,000 to 5,000 for longer AI-generated summaries
Show Field Description
- Repeater Child Description Fix - Fixed child field descriptions (e.g., image field) incorrectly appearing on parent repeater fields that have no description
Dynamic Tags
- Address Part City Fix - Fixed
address_part(city)returning state/county instead of city for Polish and other addresses by adding fallbacks forsublocality,sublocality_level_1, andadministrative_area_level_3(municipality/gmina) before falling back toadministrative_area_level_2(county)
1.6.1.2
Pending Suggestions Widget
- Removed Built-in Visibility Conditions - Removed logged-in, admin, and post author checks; use Voxel's Elementor conditions instead for flexible visibility control
- Added Accepted Status Filter - Status dropdown now includes All, Pending, Queued, and Accepted options
- Show Accepted in All View - Accepted suggestions now display when "All" filter is selected
- Accepted Status Badge - Added green status badge for accepted suggestions
Translations
- Complete POT File Generation - New
generate-pot.phpscript scans all PHP files and extracts 3,775+ translatable strings (previously only ~60 strings were in the POT file)
Dynamic Tags
- Address Part Localization - The
address_partmethod now returns address components (city, country, etc.) in the site's current language by re-geocoding with Google/Mapbox API; supports WPML, Polylang, TranslatePress, and WordPress locale with 24-hour caching
External Link Warning
- Modal Border Radius Setting - New setting to customize modal border radius (was hardcoded to 12px)
- Overlay Background Setting - New setting to customize the overlay/backdrop color
- CSS Variables for All Styling - All modal styling now uses CSS variables; no more hardcoded values
AI Bot
- Localized UI Messages - "No results", "error", "rate limit", and "login required" messages now respect the AI Response Language setting (supports 15 languages including Russian, Ukrainian, Polish, Arabic, Japanese, Chinese, etc.)
- Improved Taxonomy Search - Schema now includes
taxonomy_namefor taxonomy/term fields so AI knows the correct WordPress taxonomy to use with_taxonomy:filter - Better Taxonomy Hints - Field hints now explicitly tell the AI to use
_taxonomy:taxonomy_nameformat with term slugs
Schedule Posts
- Native Date Input - Replaced Pikaday calendar popup with native HTML date input; eliminates z-index/positioning issues with footers and other elements
- Pending Status Support - Posts with "pending" status can now be scheduled (previously only worked with "publish" status)
- Translated Sites Fix - Fixed scheduling field incorrectly appearing on confirmation page for translated sites
Load Search
- Hide When Empty - Load Search button now automatically hides when user is logged out or has no saved searches
Phone Field
- New Caledonia Missing - Added New Caledonia to backend country selection list (was only available on frontend)
- Liechtenstein Missing - Added Liechtenstein to backend country selection list (was only available on frontend)
Admin Notifications
- Individual Users Fix - Fixed individual users not receiving email notifications due to type mismatch
Online Status
- Display Location Settings Fix - Fixed "Display Locations" checkboxes not saving when unchecked; messenger/inbox/dashboard toggles now work correctly
- Notification Avatar Fix - Fixed avatars becoming square in notification popup when Online Status is enabled
App Events
- Admin Page Crash Fix - Fixed PHP Fatal error on Voxel App Events admin page caused by
dynamic_tags()methods returning arrays instead of proper data group instances
Active Filters Widget
- AJAX Label Fix - Fixed filter labels showing field key (e.g., "terms") instead of field label (e.g., "Category") during AJAX search; labels now read from Voxel's Vue search form at runtime
Saved Search
- Improved Notification Reliability - Fixed timing issue where notifications could fail when admins publish posts from wp-admin; now uses deferred processing at request shutdown to ensure all post data is saved before matching
- Debug Logging - Added comprehensive debug logging (enable with
define('VT_SAVED_SEARCH_DEBUG', true)in wp-config.php) to trace notification failures
1.6.1.1
Suggest Edits Improvements
- Hierarchical Taxonomy Display - Taxonomy fields in the suggest edit modal now display with proper parent/child hierarchy using indentation
- Checkbox List UI for Multi-select - Replaced native
<select multiple>with a scrollable checkbox list featuring circle/checkmark indicators for clearer selection state - Pre-fill with Current Values Toggle - New Elementor control to pre-populate multi-select fields with current values, allowing users to add or remove items without re-selecting everything
- Admin Display Fix - Taxonomy and select field suggestions now show labels instead of IDs in the admin suggestions table
- Template Editor Fix - Fixed "Fields to Show" dropdown showing empty when editing Elementor templates
Schedule Posts Fixes
- Pikaday Calendar Fix - Fixed calendar not displaying by loading Pikaday directly from Voxel theme
- CSS Loading Fix - Fixed stylesheet not loading due to hook timing issue
- Inline Layout - Date and time inputs now display side-by-side as intended
- Consistent Styling - Time input now matches date selector height (44px)
Image Optimization
- Watermark Opacity Control - New setting to adjust watermark transparency (0-100%) for both text and image watermarks
- Translation Support - Toast notifications and messages are now translatable via Loco Translate and similar plugins
- Elementor Media Library Support - Image optimization now works with Elementor image widgets, Gutenberg blocks, and WordPress Media Library uploads
Social Proof
- Translation Support - Time ago strings (minutes, hours, days, ago) are now translatable for boost events
Saved Search
- Alert Width Fix - Fixed alert popup text overlapping when using translated languages (e.g., Polish)
Admin Columns
- Verification Status Column - New column type showing post verification status with configurable labels, custom icon support, and show/hide toggles for icon and text
Add Category
- Elementor Styling Fix - Fixed form input styling controls not applying in Elementor editor
- Translation Support - Added all frontend strings to POT file for translation (Add new, Term name, etc.)
Messenger Widget
- Input Text Color Default - Set default input text color to black for better visibility
Promotion Create Form
- Package Icons Fix - Custom SVG icons from promotion package settings now display correctly in the create form
- Duration Color Control - New Elementor color control for styling the duration text independently from other card elements
Bulk Resize
- WebP Format Conversion - Bulk resize now converts images to WebP based on the optimization mode setting, even for images that don't need resizing
- Warning for Larger Files - Shows warning icon with tooltip for images that increased in size after conversion
- Backup Original Files - New option to keep original images in a backup folder (wp-content/uploads/vt-originals/) instead of deleting them during WebP conversion
- Delete Originals Button - Backup Management card shows file count and size with a delete button requiring "confirm" input for safety
Translation
- Complete POT File - Regenerated translation template with 3,749 translatable strings for full Loco Translate support

