=== AjaxPress - SPA & Ajax Navigation with Persistent Audio Player for Radio ===
Contributors: arraystory
Tags: ajax, spa, persistent player, radio, podcast
Requires at least: 5.3
Tested up to: 7.0
Stable tag: 2.4.2
Requires PHP: 7.1
License: GPLv3
License URI: https://www.gnu.org/licenses/gpl-3.0.html
Keep radio, podcasts and audio playing while visitors browse. Ajax navigation turns your site into a fast single page application.
== Description ==
**Your radio stream, podcast or music keeps playing while visitors browse your whole site.**
On a normal WordPress site, every click reloads the page - and the audio stops. Listeners have to press play again, and most of them don't. AjaxPress replaces full page reloads with instant ajax navigation, so the player never cuts out.
**[Unlock Pro Features](https://arraystory.com/ajaxpress/?utm_source=wporg&utm_medium=readme&utm_campaign=top)** - Advanced features and priority support
**Audio and video never stop.** Live radio streams, podcast episodes and music keep playing seamlessly across every page. Built for radio stations, podcast networks and music platforms - the one thing a normal WordPress site cannot do.
**Instant page loads.** Visitors get smooth page transitions with no white screens and no waiting. Lower bounce rates, longer sessions.
[youtube https://www.youtube.com/watch?v=Sq0b3PVJJfs]
= How It Works =
AjaxPress intercepts internal link clicks and loads the next page over ajax instead of a full browser reload. Real URLs are preserved via the History API, the page title and head metadata (canonical, OpenGraph, JSON-LD) are synced on every navigation, and back/forward buttons work exactly as expected. Search engines crawl your site normally - nothing changes for SEO.
= Compatible With Your Theme, Page Builder, and Plugins =
AjaxPress is built for maximum compatibility and tested against the most popular themes, page builders, and plugins. Just activate - no configuration needed.
**Themes:** Astra, GeneratePress, Kadence, OceanWP, Hello Elementor, Blocksy, Neve, Divi, Avada, Flatsome, Storefront, and more.
**Page builders:** Elementor, Bricks, Beaver Builder, Divi Builder, WPBakery, Oxygen, Breakdance, Zion Builder, Spectra, Gutenberg, and more.
Page builders are supported on the frontend - the pages they build navigate like any other. Editing is left alone: when you open a page in Divi, Bricks, Beaver Builder, Oxygen, Breakdance or the Customizer, AjaxPress recognises the builder and steps aside completely, so the builder loads exactly as it would without the plugin. Nothing to configure. If you have turned on "SPA for Admin Dashboard", we still suggest leaving it off while you build.
**Forms:** Contact Form 7, WPForms, Gravity Forms, Formidable Forms, Ninja Forms, Fluent Forms, Elementor Forms, and more.
**Caching:** WP Rocket, LiteSpeed Cache, W3 Total Cache, WP Super Cache, SG Optimizer, Cloudflare, Bunny CDN, and more.
**SEO:** Yoast SEO, Rank Math, All in One SEO, SEOPress, and more.
**eCommerce:** Full WooCommerce compatibility including products, cart, checkout, and extensions. Also works with Easy Digital Downloads.
**Modern JS frameworks:** React, Vue, Solid and Alpine.js pages work without style breaking or script conflicts.
**Browsers and devices:** Chrome, Firefox, Safari, Edge and Opera, on desktop, tablet and mobile.
= Single Page Application Features =
* **Ajax navigation** - app-like page changes with no full reload
* **Persistent audio and video player** - media keeps playing across your whole site. Free for any player you can mark up (see the FAQ); the Pro settings screen lets you point at a player with any CSS selector instead
* **Instant page loading** - no refresh, no white screen between pages
* **Smart prefetch** (Pro) - pages preload on hover, before the click
* **Page transitions** - fade, slide and custom animations
* **Progress bar** - a loading indicator so visitors know something is happening
* **SEO friendly** - real URLs via the History API, per-page meta tags, canonical and JSON-LD synced on every navigation, and normal crawling. Works with Yoast, Rank Math and AIOSEO, and reports correctly to Google Analytics
* **Mobile optimised** - works the same on desktop, tablet and mobile
**Want more?** [Go Pro](https://arraystory.com/ajaxpress/?utm_source=wporg&utm_medium=readme&utm_campaign=features) - Advanced features and priority support
= Built for Radio, Podcast, Music, and Content Sites =
Radio stations and live streams keep their listeners through every click. Podcast networks let an episode run while visitors browse the archive. Music sites and artist portfolios play without a pause. The same ajax navigation makes product browsing, article reading and portfolio and video catalogues feel instant on any other kind of site.
= AjaxPress Pro =
**Take your site to the next level.** The free version is powerful - AjaxPress Pro unlocks advanced features and priority support for sites that need more.
**[See AjaxPress Pro Plans and Pricing](https://arraystory.com/ajaxpress/?utm_source=wporg&utm_medium=readme&utm_campaign=pro-section)**
= Source Code =
The JavaScript that runs on your site is minified for size. The unminified source it is built from ships inside the plugin, under `src/`, along with the Vite configs and `package.json` needed to rebuild it. `src/frontend/` builds `public/js/ajaxpress.min.js` and `src/admin/` builds `public/js/admin.min.js`, both with [Vite](https://vitejs.dev/).
From the plugin folder:
`npm install`
`npx vite build --config ./src/frontend/vite.config.js`
`npx vite build --config ./src/admin/vite.config.js`
= Privacy & External Services =
AjaxPress does not send anything anywhere on its own. Nothing below runs unless you turn it on or connect it, and none of it touches your visitors: no data from your site's frontend is ever collected.
**PackEdge** (optional diagnostics)
Optionally, and **only with your explicit consent**, AjaxPress can share non-confidential diagnostic data (such as PHP and WordPress version and plugin settings) with `api.packedge.dev` so we can reproduce and fix issues faster. You can review exactly what is shared and opt out at any time. See the [PackEdge site](https://packedge.dev) and [privacy policy](https://packedge.dev/privacy/).
**Cloudflare** (edge caching, optional)
If you connect a Cloudflare account on the Cache screen, AjaxPress talks to the Cloudflare API at `api.cloudflare.com` on your behalf to read zones and manage caching rules for your site. Nothing is sent to Cloudflare until you connect. See the [Cloudflare privacy policy](https://www.cloudflare.com/privacypolicy/) and [terms](https://www.cloudflare.com/terms/).
If you use the one-click "Connect with Cloudflare" option, the authorization step passes through an OAuth relay we operate at `ajaxpress-oauth.astory.workers.dev`. The relay exists so the OAuth client secret never has to ship inside the plugin. It exchanges the authorization code for a token and hands it back to your site; the token is stored encrypted in your database. You can skip the relay entirely by pasting your own Cloudflare API token instead, which never leaves your server except to Cloudflare.
== Installation ==
**Get started in 3 steps:**
1. Go to **Plugins > Add New**
2. Search for **AjaxPress**
3. Click **Install Now**, then **Activate**
**That's it.** Your site is now a single page application, with no configuration needed.
Optional: Visit **Settings > AjaxPress** for customization options, or upgrade to [Pro for advanced features](https://arraystory.com/ajaxpress/?utm_source=wporg&utm_medium=readme&utm_campaign=installation).
== Frequently Asked Questions ==
= What is a single page application (SPA) in WordPress? =
A single page application loads the site shell once and then swaps only the content when you move between pages, instead of reloading the whole browser page every time. AjaxPress turns an ordinary WordPress site into one without you rebuilding anything: it intercepts internal links, fetches the next page over ajax and replaces the content in place. URLs, the back button and search engine crawling all keep working as before.
= How do I keep my radio player playing between pages? =
Mark up the element that wraps your player so AjaxPress knows to carry it across navigation. Add `data-ajaxpress-persist` to it, or the class `ajaxpress-persist`, or give it an id starting with `persistent-`. The player element itself is then moved to the next page as the live element, so the stream never restarts. All of this works in the free version. If a theme or another plugin renders the player and you cannot edit its markup, the Media Players field in Pro lets you target it with a CSS selector.
= Does ajax navigation work with WooCommerce? =
Yes. Product pages, category browsing, the mini cart, ajax add-to-cart, the cart, checkout and My Account login and registration all work over ajax. Dynamic pages are excluded from edge caching automatically, so nobody is served another shopper's cart.
= Will it work with my theme? =
Yes. AjaxPress is tested with Astra, GeneratePress, Kadence, Divi, Avada, OceanWP, Blocksy, Neve, Flatsome, Storefront, and many more. No configuration needed.
= Will it work with my page builder? =
Yes. Elementor, Bricks, Beaver Builder, Divi Builder, WPBakery, Oxygen, Breakdance, and Gutenberg are all tested and supported.
= Will my forms work? =
Yes. Contact Form 7, WPForms, Gravity Forms, Formidable Forms, Ninja Forms, Fluent Forms, and Elementor Forms all work out of the box.
= Will my audio/video keep playing during navigation? =
Yes - that's AjaxPress's signature feature. Your media player continues uninterrupted while visitors browse your entire site.
AjaxPress recognises a player it should keep alive in any of these ways, all of which work in the free version. Add whichever is easiest to the element wrapping your player:
* `data-ajaxpress-persist` on the element, for example `
`
* the class `ajaxpress-persist`
* an id starting with `persistent-`, for example `