== AjaxPress Changelog ==
Full version history for AjaxPress - Single Page Application for WP.
== Changelog ==
= 2.4.1 =
* Fix: Media players kept on screen across navigation stopped responding - Play, Stop and open/close buttons did nothing, with no error and no sound. The player is now carried over as the live element instead of being rebuilt from its markup, so whatever script powers it keeps working
* Fix: A persistent player could be dropped mid-navigation on slower pages - the audio simply stopped. Pages that are still loading when navigation completes are no longer mistaken for pages that have no player
* Fix: Links that act as buttons now keep working - a WooCommerce or theme mini cart, offcanvas panels, mega menu and search toggles, quick view. Tapping one opened its panel and then navigated to the link's page anyway, which on mobile dropped shoppers on the cart page. WooCommerce's ajax "Add to cart" was affected the same way and added the product by reloading the page instead
* Changed: The plugin now ships its unminified JavaScript sources, so the code behind the minified bundles can be read and rebuilt from the download itself
* Changed: The readme now documents every external service AjaxPress can talk to, what triggers each one and what is sent: PackEdge, Cloudflare, our Cloudflare OAuth relay, and the optional deactivation feedback form
* Changed: The optional deactivation feedback form no longer sends your WordPress username. Only the reason, your comment and the site URL are sent, and only if you submit the form
= 2.4.0 =
* New: Connect to Cloudflare in one click with OAuth - no API token to create or paste (where available for your account; pasting a token still works everywhere)
* New: "Don't cache this page" toggle in the editor (classic and block editors), for pages that should always be served fresh
* New: Dynamic pages are excluded from edge caching automatically - WooCommerce cart, checkout and account, add-to-cart links, and any page that sets cookies or uses nonces
* New: Cache health readout showing how many sampled pages are served from the edge, plus a Pause switch to stop edge caching instantly without disconnecting
* New: Edits appear without anyone waiting. When you update a page, the next visitor is served the copy that already exists - instantly, without hitting your server - while Cloudflare fetches the new version in the background. From then on everyone sees the update. You publish, it appears; nobody sees a slow page and nobody has to purge anything
* New: "Scan my pages" finds pages that should not be cached - anything setting a cookie, carrying a security token, or containing a form - and excludes them in one click. Recommended right after connecting. Note that forms added by JavaScript after the page loads cannot be detected this way
* Improved: The Cache screen is reorganised around the questions you actually have. Everything about which pages to keep out of the cache is in one place, and the rarely-touched settings are behind "Show advanced settings"
* New: Optional second cache layer. Cloudflare's edge cache is per-location, so a visitor in a region that has not loaded a page yet still waits for your server. The second layer keeps a globally shared copy, so those visitors are served from Cloudflare too. Off by default; pages are refreshed when you publish, and a purged page can take up to a minute to clear worldwide
* New: Exclude individual posts and pages from caching by searching for them, instead of typing URLs by hand
* New: Exclude whole categories, tags or other taxonomy terms. Excluding a term also excludes every post filed under it
* New: Configurable edge cache lifetime and exclude-URL list in the Cache settings
* Improved: Edge page caching now reliably caches HTML and applies setting changes at the edge without redeploying the Cloudflare worker
* Improved: The Cache screen now shows whether your Cloudflare account is connected and how, keeps showing it after a reload, and offers a Disconnect option. Returning from the Cloudflare authorization screen lands you back on the Cache settings with a clear success or error message instead of the general WordPress settings page
* New: Logging in and registering now work over ajax with no page refresh, the same as the rest of your site. This includes the WooCommerce My Account login and registration forms, and a failed login shows its error in place
* New: The WordPress login screen (wp-login.php) is now part of the SPA. Signing in, registering, and resetting a password no longer reload the page, and a failed attempt shows its error in place. Previously this was the one screen AjaxPress never ran on. If a login sends you somewhere outside the SPA, such as the dashboard, AjaxPress hands over to a normal page load so you always land correctly. Turn on the full page reload setting for auth forms, or use the `ajaxpress_ajax_login` filter, to opt out
* New: Full Page Reload on Login & Registration setting, off by default. Turn it on only if your sign-in flow needs a real page load, for example a security or membership plugin that redirects or challenges on login
* Fixed: Logging in or registering through WooCommerce My Account did nothing when AjaxPress was active. The value of the button you clicked was being dropped from intercepted form submissions, and WooCommerce relies on it to know the form was submitted. This also affected contact forms, search filters, and WordPress admin save buttons that behave differently depending on which button was pressed
* Fixed: Forms containing a field named "action", "method", "submit", or "target" broke AjaxPress form handling entirely. This is a very common pattern: nearly every WordPress admin form uses it, as does any plugin form posting to admin-ajax.php or admin-post.php
* Fixed: Forms whose own JavaScript submits them, such as the classic WooCommerce checkout and most contact form plugins, could be submitted twice. AjaxPress now steps aside when another script takes over a submission
* Fixed: On a freshly loaded or reloaded page, submitting a form could reload the whole page instead of submitting over ajax, while the same form worked correctly after navigating to the page from elsewhere. On a fresh load the page shell holds its own copy of every form, and that copy was left active behind the scenes; it is now disabled, and anything that still reaches it is routed through ajax instead of reloading
* Fixed: WooCommerce notices were missing after a form submission, so failed logins showed no error and saving account details showed no confirmation
* Fixed: A persistent player kept playing on pages that do not include one. Player continuity now follows the page: it is added when a page has one and the shell does not, kept playing when the next page has the same one, and removed when the next page has none. Switching to a different player no longer leaves both running
* Fixed: A persistent audio or video player could carry over from the frontend into the WordPress dashboard and keep playing there. The frontend and the dashboard are separate areas and never share a player: moving between them is always a normal page load
* Fixed: Several admin dashboard screens did not save correctly with SPA for Admin Dashboard enabled, caused by the form handling issues above
* Changed: If you are on WordPress 7.0 or newer, the settings screen now points out that WordPress navigates the dashboard itself and recommends leaving SPA for Admin Dashboard off, since running two navigators at once can conflict. On older versions it stays highlighted as the only way to get instant admin page loads
= 2.3.4 =
* Fixed: On block themes such as Twenty Twenty-Five, the browser back button could trigger a full page reload that reset persistent players. AjaxPress now switches off WordPress's built-in block navigation scripts that competed with its own SPA navigation
= 2.3.3 =
* New: Cloudflare cache integration - purge and manage Cloudflare edge cache directly from the AjaxPress settings panel
* Fixed: Duplicate browser-history entries. Each navigation now adds exactly one entry, hovering links no longer pollutes history, and the back button no longer traps visitors in a loop
* Fixed: Back/forward navigation that hits a server redirect no longer creates unwanted forward entries
* Fixed: The ajaxpress:ready event now fires after the URL and title are updated, so analytics listeners read the correct page
* New: ajaxpress_page_view dataLayer event for Google Analytics 4 / Tag Manager. Fires once per navigation with page_location, page_title, and a measured engagement_time_msec, restoring GA4's "Average engagement time" metric that otherwise reads zero on SPA sites
* New: ajaxpress-loading and ajaxpress-complete events are now emitted as documented in the Help tab
* Fixed: Ctrl/Cmd+click and Shift+click on links now open a new tab or window instead of navigating in place
* Fixed: target="_blank" is now matched case-insensitively, and a site-wide