Super Speedy AJAX Prices changelog

Fully cache your shop - correct prices, stock and dynamic pricing for every visitor

Latest version1.15.1
Released18 September 2026
Last 90 days16 releases
Last 90 days32 changes
Tested up toWordPress 7.1

1.15.118 September 2026

  • Preserved visitor-country prices on GTranslate pages when Cloudflare supplied the translation proxy's country, and added support for the legacy X-GT-ClientIP header

1.1515 September 2026

  • Preserved WooCommerce customer-country pricing on GTranslate proxy requests by restoring the original viewer IP before geolocation, with optional privacy-safe diagnostics

1.149 September 2026

  • Preserved WooCommerce's variation price wrapper when refreshing embedded child prices, so themes retain their normal selected-price styling
  • Reused WooCommerce's private selected-variation response for over-threshold products, removing the redundant AJAX Prices request and second spinner
  • Refreshed every variation WooCommerce embeds in the first visitor request, including its numeric display prices, so AJAX Prices follows the store's effective variation threshold
  • Tested up to WordPress 7.1
  • Fixed selected variation prices remaining empty on products above WooCommerce's 30-variation threshold when every variation has the same price
  • Preloaded per-visitor prices and stock for products with up to 20 variations, so selecting an embedded variation needs no second AJAX Prices request

1.1331 August 2026

  • Fixed variable-product prices loading late or remaining empty after selecting a variation, including switching from an out-of-stock variation back to an in-stock one
  • Fixed BeRocket AJAX Filters replacements waiting for the cached-price fallback; AJAX Prices now refreshes new products on the next animation frame, and console debug records both AJAX-painted and CSS-fallback-visible prices
  • Added the SSAP_SHOW_CONSOLE_DEBUG wp-config constant, which records AJAX timing, relevant integration events and product-loop mutations in the browser console and window.SSAP_DEBUG_TRACE

1.13.2522 August 2026

  • Updated super-speedy-settings to the latest version

1.13.2421 August 2026

  • Hardened the shared settings module and removed its Jetpack Autoloader dependency

1.13.2218 August 2026

  • Updated super-speedy-settings to 1.8.0, restoring the official WordPress MCP Adapter

1.13.2018 August 2026

  • Fixed on a block theme, a single-product Add to Cart region swapped in after a stock change is now the front end's own render of that state, matching classic themes
  • Fixed stock quantity text after a restock on a cached page now shows the live figure rather than the cached one, e.g. "42 in stock" instead of "0 in stock"

1.13.1614 August 2026

  • Replaced the bundled MCP Adapter and AI Engine integration with one shared Abilities bridge, a dedicated least-privilege agent user and separate execute and plugin-install permissions
  • Added a generic theme purchase-region adapter so custom product templates can refresh complete Add to Cart, waitlist and back-in-stock regions when cached stock changes

1.13.1513 August 2026

  • Updated super-speedy-settings to the latest version

1.13.1412 August 2026

  • The plugin now runs with or without the shared Super Speedy settings component, so one codebase builds both the paid zip and a wordpress.org one. Nothing changes for existing installs
  • Every admin settings string is now escaped on output
  • Fixed the MCP/AI ability descriptions used the wrong text domain, so they were never translatable
  • Removed a dead translation loader that asked for a text domain no string in this plugin uses
  • Product search in the benchmark tool, the uninstall cleanup and the mu-plugin installer all now use the WordPress-approved forms of the same calls

1.13.1311 August 2026

  • Updated super-speedy-settings to the latest version

1.13.010 August 2026

  • New one TEST / LIVE switch replaces "Enable Ajax Prices" and "Live test mode". TEST is the default: visitors see the store unchanged and your secret link previews everything. The switch sits above the settings tabs
  • Fixed single-product stock refresh now works on the Astra theme - availability markup is tagged after the theme rebuilds it, and the add-to-cart region brackets Astra's own hooks
  • Licence declarations corrected to GPLv3

1.12.16 August 2026

  • Fixed the products answered for a shop or category URL now respect catalog visibility, the way the real page does. Hidden products no longer appear in preview and benchmark rows, and no longer push visible products out of them

1.12.05 August 2026

  • Tested up to WooCommerce 11.0

1.11.25 August 2026

  • Changed "Ajax prices with a cart" and "Ajax prices for logged-in users" now store what they say. Ticking a box stores yes, and yes means on
  • Your existing settings are carried over exactly as they were, so nothing changes on your shop. If you set these with WP-CLI or a script, the option names are now ssap_ajax_with_cart and ssap_ajax_for_logged_in, and they are no longer back to front

1.11.03 August 2026

  • The ajax cart now fills in on pages with no products on them - blog posts, docs, static pages - where a header cart badge previously stayed empty because no price request ever fired
  • An empty cart and an unchanged cart are answered from the browser with no extra request, so the cart-only fill costs nothing on most page views
  • The cart count now also sets a data-ssap-cart-count attribute on badge elements, so a theme can hide its badge at zero with plain CSS
  • Ultra Ajax responses now include the cart like the other transports - on ultra stores, cart placeholders previously never filled in
  • Fixed saving the settings no longer throws you back to the first tab. If you were editing Country Prices, that is where you come back to
  • Changed when the benchmark finds Fast or Ultra Ajax returning different prices from a full page load, it no longer tells you to use Normal Ajax. That difference means a price-affecting plugin is missing from the Fast Ajax list, so it now says so, and tells you what fixing it is worth in milliseconds - on one real store that was 300ms against 750ms, lost to two unticked boxes
  • New Live test mode. Try all of this on your real shop before anyone else sees it - with it on, ajax prices, the ajax cart and Country Based Prices do nothing for your visitors, and only a browser opening your secret link gets the new behaviour. The link keeps working as you click around, and a warning sits in your admin the whole time so you cannot forget it is on
  • Fixed a logged-in customer who added something to their basket on another device saw an empty basket on a cached page. Their basket is stored against their account rather than in a cookie, and the cart display was reading the cookie alone

1.10.13 August 2026

  • Updated the shared Super Speedy settings module: AI agents can check your licence and install other Super Speedy plugins over MCP, now also exposed on AI Engine's MCP endpoint when AI Engine is active
  • New Check frequency setting - cap licence, update and changelog checks to once a day or once a week, and see when the licence was last checked
  • Licence and changelog checks fail fast when superspeedyplugins.com cannot be reached, instead of hanging the settings page
  • The newest installed copy of the shared Super Speedy settings code now runs site-wide, whichever plugin loads first - previously the alphabetically-first plugin's often-older copy won
  • AI agents can read and change every Ajax Prices setting over MCP and check the Fast Ajax mu-plugin status - transport and plugin-list changes need explicit confirmation because wrong values mean wrong prices - also exposed on AI Engine's MCP endpoint

1.9.330 July 2026

  • New Ajax cart display. Your cart count and total are taken out of the cached page and filled in for each visitor.
  • New an Add-ons panel, so an installed add-on can be switched off without uninstalling it. Its settings are kept.
  • New an option to delete this plugin's settings when you delete the plugin. Off by default, with a matching option for each add-on you have installed.

1.9.230 July 2026

  • Add-ons can now add their own tab to the settings screen, saved by the same Save button as everything else. An add-on keeps its settings separate from the plugin's own, so deactivating an add-on never loses them.
  • The See what each customer sees comparison now accepts a shop URL, so you can preview any category, search or filtered page instead of only picking products by hand.

1.9.129 July 2026

  • Removed the hidden Fix prices for VAT-exempt locations option. If prices look wrong for a country with no VAT, add a wildcard 0.0000 row to WooCommerce > Settings > Tax > Standard rates, and check the product's Tax class is Standard rather than Zero rate.

1.9.028 July 2026

  • Fixed WordPress notices from your other plugins now appear above the Super Speedy AJAX Prices header rather than between the tabs and the settings.
  • Fixed an archive now makes one batched prices request however many times your theme or a lazy-loader re-triggers it, where a slow server could previously produce one request per product.
  • Fixed products Available on backorder refresh correctly, including when a product moves between in stock and on backorder.
  • Fixed an Add to Cart area rendered by another plugin, such as a downloads, quote-request or subscription plugin, now survives a stock refresh.
  • Changed product pages render both stock states up front and the browser switches between them, so a stock change needs no markup from the server.
  • Fixed theme quantity buttons such as Enfold's - and + are reapplied after a stock change; add your own theme's event to the list with the ssap_reinit_events filter.
  • New While stock loads dims, spins or shows loading text over the stock and Add to Cart area, which stays unclickable until the live state arrives, and defaults to the same style as prices.
  • New Do not wait above N in stock (default 10) shows the Add to Cart button immediately for anything stocked above that figure.
  • New Out of stock for longer than N days (default 0, meaning always check) shows a long-dead product as sold out immediately.
  • New Refresh stock for picks which product types get their stock and buttons refreshed, with virtual and downloadable products off by default.
  • New two-state Add to Cart buttons on shop and category pages, marked BETA and off by default.
  • Improved the prices response carries no Add to Cart markup when a product's stock state has not changed, which is most page loads.
  • New, for developers the ssap_skip_stock_refresh, ssap_stock_pending_policy and ssap_reinit_events filters, a data-ssap-stock attribute recording the state each element was rendered in, and a page_states parameter on all three transports.

1.8.027 July 2026

  • Fixed on a product page cached while an item was in stock, the quantity box and Add to Cart button stayed on screen after it sold out, and any back-in-stock ("email me when available") form never appeared. That form is built by PHP as the page renders, and the page rendered while the item was still in stock, so it was never in the cached HTML at all. The whole Add to Cart area is now refreshed from the live server alongside the price and stock text: a sold-out product loses its Add to Cart and shows your notifier's form, a restocked product gets its quantity box and button back. It works in both directions and needs no knowledge of which notifier plugin you use, because it renders whatever your site would render right now. Requires Ajax stock too to be on.
  • Fixed block themes. WooCommerce renders Add to Cart from the woocommerce/add-to-cart-form block there rather than the classic hook, so both are now refreshed.
  • New Preload the other stock state's scripts, on by default. Most back-in-stock plugins load their CSS and JavaScript only when they actually show their form, so a form swapped onto a cached page could arrive unstyled and dead. The plugin now renders the opposite stock state once behind the scenes, throws that HTML away and keeps only the scripts and styles it asked for. Turn it off if it upsets a plugin on your store, and list that plugin's handles with the ssap_prime_stock_asset_handles filter instead.
  • IMPORTANT, breaking every setting this plugin stores is renamed from wc_ajax_pricing_* to ssap_*, and the script and style files from wc-ajax-pricing.js / .css to ssap-pricing.js / .css. The wc_ prefix belongs to WooCommerce and blocks a WordPress.org listing. There is NO automatic migration: after updating, go to Super Speedy > AJAX Prices and set your options again. If you excluded wc-ajax-pricing.js from a JavaScript optimiser (WP Rocket, Perfmatters, or similar), change that exclusion to ssap-pricing.js.
  • Changed, for developers the AJAX action is now ssap_get_prices (was get_wc_prices), and the JavaScript events are ssap_prices_updated and ssap_stock_updated (were wc_ajax_pricing_updated and wc_ajax_inventory_updated).
  • New, for developers the ssap_single_add_to_cart_replaced JavaScript event, the ssap_before_render_single_region and ssap_after_render_single_region actions for replaying whatever your plugin does at page-render time, and the ssap_single_region_start, ssap_single_region_end and ssap_prime_stock_asset_handles filters.
  • Added a developer test harness (SSAP_Test_Helper, admin bar), which switches itself on only for a local or development site and is not part of a public build. It freezes pages in a cache that never purges, then skews stock or price behind them in one click, so the stale-page behaviour above can be seen by eye rather than only by test.
  • Note on compatibility Advanced Dynamic Pricing plus a persistent object cache (Redis, Memcached) keeps serving the old price for up to ten minutes after you change a price in wp-admin. ADP caches its calculated per-customer price in the adp_processed_products_to_display object cache group, keys it without the price, and does not drop that group when a product is saved, so any customer matched by a pricing rule keeps the old price until the ten minute TTL runs out. This is not the page cache and not this plugin: it reproduces with this plugin deactivated and no page cache at all. Flush the object cache after changing a price, or wait it out. Reported to AlgolPlus.
  • Added a Docker playground under .tests/playground (WordPress, WooCommerce, Redis, WP Super Cache, ADP) and an ADP fixture giving every logged-in role 10% off, so guest-versus-member pricing behind a real full page cache and a real object cache can be reproduced from scratch in one command.

1.7.124 July 2026

  • Updated super-speedy-settings (shared across all Super Speedy plugins): added a settings-version report to the licence-check and download requests for better licence and update-download debugging

1.7.024 July 2026

  • Changed the Transport and Enable Fast Ajax options are now a single "Ajax Type" choice with five options - Normal Ajax, Normal REST, Fast Ajax, Fast REST and Ultra Ajax - so you pick how prices are fetched in one place. Existing settings are migrated automatically. (What the earlier 1.6.0 preview called Ultra Ajax - trimming the plugin list - is now "Fast Ajax".)
  • New Ultra Ajax, a genuine bypass. It intercepts the prices request before WordPress loads the other plugins, the theme, the main query or the routing layer, hand-boots only WooCommerce, this plugin and your ticked price-affecting plugins, returns the JSON and exits. It is the fastest option - verify your prices match with the benchmark before switching, as it skips the most.
  • Improved the benchmark now times all five Ajax Types in the order shown, one after another, using server-side timing (PHP request-start to response-ready, fastest of several samples) so connection and loopback noise no longer skews the result. A subject selector runs the whole benchmark as a guest, a country, or a specific logged-in customer - important because member-only pricing only shows up when you benchmark as a member. It only ever recommends a type that returns the same prices as a full page load; any type that returns different prices is flagged and never recommended.
  • Improved the "See what each customer sees" test gained an Ajax Type selector, so you can confirm each type returns the right per-visitor prices before choosing it. It now fetches each visitor as a real request (a login cookie for customers, a location override for countries) rather than switching user mid-request - which fixes dynamic-pricing and membership plugins that build their customer context up front and would otherwise show every customer the same price.
  • Fixed Ultra Ajax now loads the same ticked price-affecting plugins as Fast Ajax, so dynamic and membership prices match a full load.
  • Fixed admin notices printed by other plugins no longer appear inside the settings top bar (added the standard wp-header-end marker).
  • Note on compatibility the admin-ajax types (Normal Ajax, Fast Ajax) are the most compatible with dynamic-pricing and membership plugins. The REST-based types can miss plugin-driven prices on some stacks, because WooCommerce does not treat a REST request as a frontend request and so skips the customer/session those plugins rely on. The benchmark's price-match check tells you which types are safe on your store; when in doubt use Normal Ajax or Fast Ajax.

1.6.024 July 2026

  • New "While prices load" options control what a visitor sees while their correct price is being fetched, so the stale price baked into a cached page is never read as the real one. Choose "Dimmed" (default and recommended - the cached price is softly dimmed then fades to the real price when it arrives, with a slider for the reveal speed from a gentle fade up to instant), "Spinner" (a pure-CSS loading spinner over the price, with a choice of spinner styles and colour, no images), or "Loading text" (a short message until the price arrives). A live preview shows the exact sequence as you choose. The effect is applied by CSS in the first painted frame with no JavaScript needed, uses opacity (never display:none or visibility:hidden) and always ends fully visible - so the price is never hidden from search engines - and applies to all visitors, not just logged-in ones. A visitor with JavaScript disabled still sees the price revealed automatically.
  • New choose the prices Transport - admin-ajax.php (default and recommended) or the WordPress REST API (/wp-json/ssap/v1/prices). admin-ajax.php is excluded from caching by default by every caching plugin and CDN, so there is nothing to configure, and it authenticates a logged-in customer from their cookie natively. The REST route is there if you prefer it (both are equally fast); if you use it, exclude /wp-json/ssap/ from your page cache and CDN. Either way the request carries NO nonce - a nonce cannot live in cached HTML without going stale and silently failing - and the endpoint returns only published-product price and stock data, resolving the customer from their login cookie so members still get their own prices. Per-visitor responses are sent no-store with Vary: Cookie.
  • New Ultra Ajax mode (off by default). On the prices request it loads only WooCommerce, this plugin and the price-affecting plugins you tick - skipping every other active plugin - which on a store with many plugins is a large speed and server-cost saving because a price lookup does not need most of them. An optional setting also skips loading the theme. The required helper (a must-use plugin) is installed automatically.
  • New redesigned settings screen with a Main tab (enable, load behaviour and the customer test) and a Settings tab (Transport, Ultra Ajax and the benchmark), matching the rest of the Super Speedy range.
  • New "See what each customer sees" test on the Main tab. Pick By country or By customer, choose the two to compare, and it shows the shop prices each one gets side by side - so you can confirm at a glance that your prices really do vary and that the cache is not collapsing them into one. It reads live prices in-process, so no save is needed.
  • New built-in benchmark. It times the prices request four ways - Normal and Ultra Ajax, each over admin-ajax.php and REST - using your shop's own products, fills the bars in live as each result lands, highlights the winner and tells you exactly which settings to pick. It also verifies every method returns the same prices as a full page load, and gives you a shareable branded image you can download or copy. The benchmark uses whatever is currently on the settings page, so you do not have to save first.
  • Tests added display-mode, transport and Ultra Ajax coverage; the end-to-end suite runs against whichever transport is active.

1.5.022 July 2026

  • Fixed dynamic pricing plugins (e.g. Advanced Dynamic Pricing for WooCommerce) no longer destroy the AJAX price placeholder. Our price filter now runs last, so when a pricing rule matches a logged-in user their discounted price is wrapped and refreshed instead of the plugin silently doing nothing.
  • Fixed prices and stock now refresh on cached pages served to logged-in users (WP Rocket guest cache for all users) and on pages cached for more than 24 hours (permacaching). The AJAX endpoint no longer requires a nonce - nonces are bound to the user who warmed the cache and expire after 24 hours, so cached pages were getting silent 403 rejections and rolling back to the stale cached price. The endpoint is read-only and returns only published-product price and stock data, with a per-request product cap.
  • New logged-in visitors on cached pages no longer see a flash of the guest price. Their price boxes keep their size but stay hidden until the real price arrives, then fill in one frame. Guests still see cached prices instantly. If the price request fails or takes over 3 seconds, the cached price is revealed so nothing is ever left blank. Detection uses a small ssap_li cookie set at login.
  • Changed tier-aware variation pricing is now always on and the settings toggle is gone. The variation price cache key includes the logged-in user's role set, so membership or wholesale tier prices are never served from another user's cache. Guests share one cache entry as before. Keying by role set (not user ID) means at most a handful of extra cache entries per product, which is why no setting is needed. Plugins that price per individual user can extend the key via the ssap_user_context_for_request filter.
  • Tests new proof suite covering price-beats-cache, stock-beats-cache, Advanced Dynamic Pricing compatibility (membership tier percentage discount), guest-cache nonce scenarios and the member hide-then-fill behaviour, plus an unpaginated fixture archive page.

1.4.420 July 2026

  • Updated super-speedy-settings to the latest version

1.4.318 July 2026

  • Updated super-speedy-settings to the latest version

1.4.210 July 2026

  • Updated super-speedy-settings refreshed the Super Speedy settings page with new plugin and service-panel icons (shared across all Super Speedy plugins).

1.4.110 July 2026

  • Updated super-speedy-settings (shared across all Super Speedy plugins): re-enabled TLS certificate verification on the licence/update check, escaped all dynamic output in the admin licence table, and added a capability check to the licence recheck handler.

1.4

  • Added tier-aware pricing for stores running WooCommerce Memberships, B2B King, WC Wholesale Prices or any plugin that shows different prices to different logged-in users. WooCommerce caches variable-product prices, and without folding the user's identity into that cache key one user's prices could be served from cache to another; the new "Tier-aware pricing (Memberships / B2B)" setting keys the variation-price cache on the logged-in user's role/tier so prices never bleed between users. Guests are unaffected and keep sharing one cache entry, so page caching for logged-out visitors is preserved. Simple-product prices and stock were already per-user-correct (they run WooCommerce's full pipeline inside the authenticated request); this closes the variation-cache gap. Integrations can extend the per-user cache key with the new ssap_user_context_for_request filter. Off by default; verified by new end-to-end tests.
  • Privacy: the optional verbose tax debug log no longer writes customer address fields (postcode, city, full billing/shipping) to the log - it records only coarse country/state and derived yes/no flags. Also removed a dead logging branch and a leftover diagnostic string. Logging remains off by default (SSAP_VERBOSE_LOGGING).

1.33 June 2026

  • Added WooCommerce Product Bundles and Composite Products support. When either of those plugins is active, the AJAX stock-refresh response now carries per-child / per-component availability for those product types — bundles include a bundled_items map (per child: in-stock, purchasable, optional, max stock) plus the bundle's overall stock roll-up, and composites include a components map (per component: title, optional flag, default option, and per-option in-stock/purchasable state). This lets fully-cached archive and product pages show accurate per-part availability. Each adapter self-registers only when its parent plugin is present (and is a harmless no-op otherwise), and the data is included only when the "Refresh stock via AJAX" option is enabled. Verified by new end-to-end tests for both product types.
  • Security hardening the AJAX price/stock endpoint now only ever returns data for Published products. Draft, pending, private, and scheduled products are no longer turned into AJAX placeholders and are skipped by the handler, so unpublished prices and stock levels can no longer be enumerated by unauthenticated visitors. Admins previewing an unpublished product still see the correct price — it simply isn't refreshed via AJAX until the product is published.
  • Capped the number of products processed per AJAX request (default 200) to prevent a single request from forcing thousands of product loads. The cap is adjustable via the new ssap_max_products_per_request filter — see the Developer Reference KB article.
  • Hardened request handling so a malformed (non-array) product list can no longer trigger a PHP error; incoming IDs are now de-duplicated and zero-filtered before processing.
  • Added .kb troubleshooting and developer-reference guides.

1.227 May 2026

  • Updated the Super Speedy Settings page: added a "Recheck Licenses" button above the licence table so customers have a clear way to refresh licence status after a renewal or upgrade without scrolling down to the licence-key field. The button is disabled until a licence key is entered/saved and re-enables as you type.
  • The Recheck flow now also force-bypasses the auth-server's own 1-hour licence cache (via a force=1 flag on the wpiapi/check_product_key call), so renewals/upgrades that completed less than an hour before a recheck no longer show as expired/exceeded. Normal admin page loads continue to use both caches as before — only an explicit Recheck click bypasses them. (Lives in the super-speedy-settings submodule, so the change propagates to every Super Speedy plugin.)
  • Added a bunch of playright tests to check for regressions in future deployments

1.1.020 May 2026

  • Added optional AJAX stock refresh — refreshes WooCommerce stock availability text and loop Add to Cart buttons via the same batched request as prices, so product/archive pages can stay fully cached while showing live stock state per visitor. Off by default.
  • Fixed compatibility with Auto Infinite Scroll — newly-appended product cards now have their prices (and stock, when enabled) refreshed via a new listener on the auto-infinite-scroll-complete event. Re-init only fetches newly-appended products, not the whole page.

1.0.84 March 2026

  • Skip VAT-exempt price filter for variable products with a single visible variation — WooCommerce 10.4+ handles the tax adjustment natively, and running the filter as well stripped the base tax twice

1.0.726 February 2026

  • Added settings option to enable VAT-exempt price fix (disabled by default)
  • VAT-exempt variation price logic now only runs when explicitly enabled in settings

1.0.626 February 2026

  • Added super-speedy-settings integration for licence management and auto-updates
  • Moved settings page under Super Speedy top-level menu

1.0.526 February 2026

  • Added admin settings page
  • Added auto-update support

1.0.426 February 2026

  • Added VAT exempt logic for price determination to improve pricing for large EU stores who sell outside EU
  • Fixed detection of when a user is truly tax exempt

Showing the 40 most recent of 44 releases. View the full history

▲
▼
1/1