=== AiO Podcast Studio: All-in-One Podcast Manager, Player & Publisher ===
Plugin URI: https://aiopodcasting.com
Contributors: aiopodcasting, freemius
Donate link: https://aiopodcasting.com
Tags: podcast, podcast player, podcast manager, rss feed, audio player
Requires at least: 6.3
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.0.4
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Create, manage, and publish podcasts in WordPress. Import via RSS, organize episodes, and distribute to Apple Podcasts, Spotify, and more.

== Description ==

>[View Demo](https://demo.aiopodcasting.com) | [Getting Started](https://aiopodcasting.com/docs/) | [Contact & Support](https://aiopodcasting.com/support/) | [Home Page](https://aiopodcasting.com)

**AiO Podcast Studio** is a complete WordPress podcasting plugin built for creators at every stage — whether you are showcasing an existing show, self-hosting your own podcast, or migrating from a third-party platform.

Whether you already have a podcast and want to display it beautifully on your WordPress site, prefer to host everything on your own server for full control, or are ready to move away from an external host entirely — AiO Podcast Studio handles every part of the workflow: importing your feed, organizing episodes and participants, generating a standards-compliant RSS feed, displaying your content with beautiful layouts, and tracking listener statistics — all inside the WordPress admin you already know.

https://www.youtube.com/watch?v=GsDv9gA-Ipg&rel=0

=== Why AiO Podcast Studio? ===

AiO Podcast Studio fits wherever you are in your podcasting journey — display an existing show on your site, self-host everything on your own server, or migrate away from an external platform at your own pace.

* **Showcase any podcast** — embed and display your existing podcast on your WordPress site with beautiful layouts and a built-in player.
* **Self-hosted option** — store audio files in your own media library and keep full ownership of your content and audience data.
* **Standards-compliant RSS** — compatible with Apple Podcasts, Spotify, Amazon Music, Google Podcasts, and every directory that follows the iTunes namespace spec.
* **No per-episode or storage limits** — unlimited podcasts, unlimited episodes, unlimited categories.
* **Developer-friendly** — clean GPL code, filter/action hooks throughout, and full WordPress Coding Standards compliance.

=== Key Features ===

**Import & Migration**

1. **RSS Feed Import** — Paste your existing podcast RSS URL and import your entire back catalog in batches. Metadata, artwork, and episode files are all pulled in automatically.

**Content Management**

2. **Unlimited Podcasts & Episodes** — Create and manage as many podcasts and episodes as you want — no paywalls, no artificial limits.
3. **Audio & Video Support** — Publish both audio and video podcast episodes from one unified interface. Video podcast support requires the Premium upgrade.
4. **Episode Chapters** — Add chapter markers so listeners can jump to specific segments inside an episode.
5. **Episode Transcripts** — Attach transcripts to episodes for improved accessibility and SEO indexing.
6. **Participant Management** — Add hosts, guests, and contributors as reusable participant profiles that can be linked to multiple shows and episodes.
7. **Unlimited Categories & Tags** — Organize your podcast library with hierarchical categories and flat tags. Front-end filters use them for smart discovery. The standard WordPress categories and tags can optionally be switched on as well, so your podcasts and episodes join your site's own category and tag archives alongside your posts.
8. **Comments & Discussions** — Enable listener comments on individual episodes to build community.

**Distribution & RSS Feed**

9. **Standards-Compliant RSS Feed** — Generates a fully compliant podcast RSS feed with iTunes, content, and media namespace support — accepted by Apple Podcasts, Spotify, Amazon Music, and more.
10. **Follow & Subscribe Buttons** — Add platform-branded follow buttons (Apple Podcasts, Spotify, Amazon Music, and others) to your podcast and episode pages.
11. **Social Sharing** — Built-in share buttons let listeners share individual episodes across social platforms.
12. **Episode Downloads** — Allow listeners to download episodes for offline listening with a single click.

**Display & Layouts**

13. **Multiple Layout Options** — Display episodes in grid, list, compact, or slider layouts. Display podcasts in a grid. Display categories as grids, lists, or dropdowns.
14. **Customizable Podcast Player** — A fully featured embedded media player with playback speed control, volume, and playlist support. Styled to match your site.
15. **Smart Search & Filters** — Front-end filter forms let listeners search, filter by tag, and sort episodes by date, title, or duration.
16. **Related Episodes** — Automatically suggest relevant episodes at the end of each episode page to keep listeners engaged.
17. **Pagination & Load More** — Browse large episode archives with standard numbered pagination or a smooth "Load More" button.
18. **Flexible Embedding** — Place podcasts, episodes, categories, tags, and participant lists anywhere using Gutenberg blocks, shortcodes, or classic widgets.
19. **Page Builder Friendly** — Works with Elementor, Divi, Beaver Builder, and other popular page builders via shortcodes.

**Analytics & Statistics**

20. **Advanced Statistics** *(Premium)* — Track plays, downloads, and listener trends with built-in statistics. View breakdowns by podcast, by episode, and over custom date ranges. No third-party analytics service required.

**Settings & Customization**

21. **100+ Settings for Full Control** — Fine-tune every aspect of the player, feed, display layouts, image sizes, SEO output, privacy behavior, and more through a structured settings panel.
22. **Shortcode Builder, Blocks & Widgets** — A visual shortcode builder lets you configure and preview shortcodes without writing any code. Gutenberg blocks and classic widgets are also included for flexible content placement anywhere on your site.

**Accessibility, SEO & Standards**

23. **SEO Optimized** — Integrates with Yoast SEO and Rank Math to output schema markup for podcasts and episodes. Transcripts and structured metadata improve search engine visibility.
24. **GDPR Compliant** — Fine-grained privacy controls. Statistics tracking respects user consent signals.
25. **Multilingual Support** — Full WPML and Polylang compatibility for multilingual podcast sites.

**Developer & Platform**

26. **User Role Restrictions** — Granular capability controls let you define who can create, edit, publish, and manage podcast content.
27. **Built on WordPress Standards** — Clean, well-documented GPL code. Custom post types, taxonomies, the Settings API, and the REST API — no proprietary lock-in.

== Installation ==

= Automatic Installation =

1. Log in to your WordPress admin panel.
2. Go to **Plugins → Add Plugin**.
3. Search for **AiO Podcast Studio**.
4. Click **Install Now**, then **Activate**.

= Manual Installation =

1. Download the plugin ZIP file.
2. Upload the `aio-podcast-studio` folder to `/wp-content/plugins/` via FTP, or use **Plugins → Add Plugin → Upload Plugin**.
3. Activate the plugin through the **Plugins** screen.

= Getting Started =

1. After activation, a **Podcasts** menu item appears in the WordPress admin sidebar.
2. Go to **Podcasts → Add New Podcast** to create your first podcast manually, or paste an RSS feed URL to import an existing show.
3. Add episodes under **Episodes → Add New Episode**, or let the importer populate them from your feed.
4. Configure the player, feed, and display options under **Podcasts → Settings**.
5. Embed your content anywhere using the provided Gutenberg blocks, shortcodes, or widgets.

== Frequently Asked Questions ==

= Does AiO Podcast Studio support video podcasts? =

Yes, with the Premium upgrade. The core plugin supports audio podcast episodes. Video podcast publishing and video playback in the built-in player require the Premium upgrade. The RSS feed correctly identifies the media type for each episode regardless of tier.

= Can I import my existing podcast from Apple Podcasts, Spotify, or another host? =

Yes. Paste your public RSS feed URL into the importer (**Podcasts → Add New Podcast → Import Podcast from RSS Feed**). The plugin fetches the feed, creates the podcast and episode records, and pulls in metadata and artwork. Your original audio files are not re-uploaded — episode enclosure URLs continue to point to your existing host unless you re-upload them.

= Is there a limit on the number of podcasts or episodes? =

No. You can create an unlimited number of podcasts, episodes, categories, tags, and participant profiles.

= Does the RSS feed work with Apple Podcasts and Spotify? =

Yes. The generated feed follows the RSS 2.0 specification extended with the iTunes podcast namespace — the same format required by Apple Podcasts, Spotify, Amazon Music, and most other directories.

= Why are older episodes missing from my RSS feed? =

Feeds include the most recent 300 episodes. Apps and directories only ever see what the feed contains, so once a podcast grows past 300 episodes the oldest ones stop appearing in Apple Podcasts, Spotify, and your listeners' apps. Episodes a listener has already downloaded are not affected, and nothing is deleted — the episodes remain on your site and keep their pages.

The limit keeps feeds quick to fetch and parse. It applies to member feeds in the same way. To change it, add this to your theme's `functions.php` file or a custom plugin:

`add_filter( 'aiopod_feed_episodes_limit', function() { return 500; } );`

= I changed something but my RSS feed has not updated =

Feeds are cached, so that podcast apps checking for new episodes do not rebuild the whole feed every time. To refresh a feed straight away, open the podcast and click **Update**. That clears both the public feed and your members' feeds for that podcast.

Developers who would rather not cache feeds at all can add this to their theme's `functions.php` file or a custom plugin:

`add_filter( 'aiopod_feed_cache_enabled', '__return_false' );`

= Does the plugin support multiple podcasts on one site? =

Yes. Each podcast is an independent post with its own RSS feed URL, settings, episodes, and participants.

= Where are statistics stored? =

All statistics data is stored in your own WordPress database. No data is sent to external services.

= Is the plugin translation-ready? =

Yes. All user-facing strings use the `aio-podcast-studio` text domain. The plugin ships with a `.pot` template file in the `languages/` directory.

= Does the plugin work with caching plugins? =

Yes. Standard page caching is compatible. The RSS feed is generated server-side on each request; if you use a full-page caching plugin, exclude your podcast feed URLs from the cache or use the feed caching recommended in the plugin settings.

= Is the plugin compatible with multisite? =

Yes. The plugin can be installed on a WordPress Multisite network, but it must be activated individually on each site. Network-wide activation is not supported.

= Can I use the standard WordPress categories and tags? =

Yes, although the plugin's own Podcast Categories and Episode Tags are the better fit for most sites: they are what your RSS feed publishes to Apple Podcasts and Spotify, and their pages are rendered by the plugin with your artwork and player. The standard WordPress categories and tags are worth adding when your podcast sits alongside a blog and you want one structure across everything you publish, or when you already use other plugins that work with them. They come with a few limits, described below.

To switch them on, go to Settings → General → WordPress Categories & Tags and tick one or both. The setting is off by default, and your own Podcast Categories and Episode Tags carry on working exactly as before — this adds a second set of boxes, it does not replace the first.

Once it is on, your podcasts and episodes are listed in your site's own `/category/…/` and `/tag/…/` archives beside your blog posts, so someone browsing that subject finds your audio as well as your writing. Those archives are drawn by **your theme**, not by this plugin, so a podcast appears there looking like an ordinary blog post — no player, no episode count. The terms are not shown on the plugin's own output either: single podcast and episode pages, episode lists and the player continue to show your Podcast Categories and Episode Tags only. If you want the boxes purely for organising your own content, untick "Include in WordPress Archives" in the same settings section.

Your RSS feed is not affected either way. Turning the setting back off removes your podcasts and episodes from those archives but keeps everything you filed, so switching it on again restores your work exactly as it was.

= Can I control who is allowed to listen to my podcasts and episodes? =

Yes, with the Premium upgrade. Restrict an entire podcast or an individual episode to specific WordPress user roles, straight from the podcast or episode editor. No other plugin is needed.

Visitors without access see your restricted message in place of the episode, and the player is not loaded for them. In episode lists the episode is still shown with its artwork and title, marked with a padlock, so visitors can see what they are missing. Restricted episodes are left out of the RSS feed, and their download links return a "403 Forbidden" response to anyone without access — see "What exactly does restricting an episode protect?" below for what that does and does not cover.

Restricting a podcast also restricts every episode belonging to it, including episodes added later by an RSS import or a scheduled sync, so you do not have to edit each one. If you would rather control access per episode, leave the podcast unrestricted and restrict individual episodes instead. To turn the inheritance off altogether, add this to your theme's `functions.php` file or a custom plugin:

`add_filter( 'aiopod_inherit_podcast_access', '__return_false' );`

= Is the plugin compatible with Paid Memberships Pro? =

Yes. To restrict podcasts and episodes by membership level, you will also need the [Custom Post Type Membership Access](https://www.paidmembershipspro.com/add-ons/custom-post-type-membership-access/) add-on, which is not part of the free Paid Memberships Pro plugin — see their website for what your plan includes. Select Podcasts and/or Episodes on the add-on's settings page, then use the "Require Membership" box on any podcast or episode to choose which levels may view it.

The restriction is applied everywhere the content appears: single pages, shortcodes, blocks, widgets, the player, and the RSS feed. Visitors without the required level see the restriction message from Paid Memberships Pro itself, so your membership levels, custom messages, and translations are used exactly as you set them up.

The public feed shows the same episodes to everyone and leaves restricted ones out. Members can also have a feed of their own — see the next question.

= Can members subscribe to a private podcast feed in their podcast app? =

Yes. This needs the [Member RSS](https://www.paidmembershipspro.com/add-ons/pmpro-member-rss/) add-on for Paid Memberships Pro, which is not part of the free Paid Memberships Pro plugin — see their website for what your plan includes.

Each member gets a feed address of their own. Opened in a podcast app, it delivers the episodes their membership entitles them to alongside every unrestricted episode. Everyone else carries on receiving the public feed, with restricted episodes left out of it.

Members find their addresses on the page holding the `[pmpro_member_rss]` shortcode, or on their membership account page. Only the podcasts their own membership gives them access to are listed, so every address they are shown is one that works for them. Two ways of signing in are supported, both of them the add-on's own:

* **Member key in the address** — the simpler option, and the one every podcast app can handle. The key is part of the address, so the address itself has to be treated as private.
* **Basic authentication** — the member supplies their WordPress username and an application password. Stronger, because nothing secret sits in the address, but only some podcast apps support it. Turn it on under Memberships → Settings → Advanced.

Regenerating a member's key takes effect at once: the old address stops working, and that member has to update the subscription in their app.

= What exactly does restricting an episode protect? =

Restricting an episode keeps it out of the public feed, replaces the player with your restricted message on the site, and makes the episode's download link answer "403 Forbidden" to anyone without access.

It does not encrypt the media file or move it out of reach. The file stays where you uploaded it, and anyone who already has its direct address — from a link someone shared, or from a browser's network tools — can still open it. If you have also turned off download tracking with the `aiopod_rss_tracking_enabled` filter, to route downloads through an analytics service for example, feeds carry those direct addresses and the 403 check does not come into play at all.

Where that matters, host the media on a service that issues signed addresses that expire. We are also working on built-in support for third-party storage services such as Amazon S3, which will make this easier to set up.

= Where can I report a bug or request a feature? =

Please open a support thread on the WordPress.org plugin support forum.

== External Services ==

This plugin connects to the following external services. All share-button connections are user-initiated — no data is transmitted to any third-party server at page load. Data is only sent when a visitor actively clicks a share button, at which point their browser navigates to the service URL.

= Facebook =
This plugin generates share links that allow visitors to share podcast episodes on Facebook via the Facebook Share dialog.

Data sent: The episode page URL is passed as a query parameter in the share link.
When: Only when a visitor clicks the Facebook share button.

[Terms of Service](https://www.facebook.com/legal/terms) | [Privacy Policy](https://www.facebook.com/privacy/policy/)

= Twitter / X =
This plugin generates share links that allow visitors to share podcast episodes on Twitter / X via the Tweet Intent dialog.

Data sent: The episode title and page URL are passed as query parameters in the share link.
When: Only when a visitor clicks the Twitter / X share button.

[Terms of Service](https://twitter.com/en/tos) | [Privacy Policy](https://twitter.com/en/privacy)

= LinkedIn =
This plugin generates share links that allow visitors to share podcast episodes on LinkedIn via the LinkedIn Share Article dialog.

Data sent: The episode title and page URL are passed as query parameters in the share link.
When: Only when a visitor clicks the LinkedIn share button.

[Terms of Service](https://www.linkedin.com/legal/user-agreement) | [Privacy Policy](https://www.linkedin.com/legal/privacy-policy)

= Pinterest =
This plugin generates share links that allow visitors to pin podcast episodes on Pinterest via the Pinterest Pin It dialog.

Data sent: The episode title, page URL, and optionally the episode image URL are passed as query parameters in the share link.
When: Only when a visitor clicks the Pinterest share button.

[Terms of Service](https://policy.pinterest.com/en/terms-of-service) | [Privacy Policy](https://policy.pinterest.com/en/privacy-policy)

= Tumblr =
This plugin generates share links that allow visitors to share podcast episodes on Tumblr via the Tumblr Share dialog.

Data sent: The episode title, page URL, and optionally the episode description are passed as query parameters in the share link.
When: Only when a visitor clicks the Tumblr share button.

[Terms of Service](https://www.tumblr.com/policy/en/terms-of-service) | [Privacy Policy](https://www.tumblr.com/policy/en/privacy)

= WhatsApp =
This plugin generates share links that allow visitors to share podcast episodes via WhatsApp. On mobile devices the native WhatsApp app is opened; on desktop the WhatsApp web interface is used.

Data sent: The episode title and page URL are included in the share link URL.
When: Only when a visitor clicks the WhatsApp share button.

[Terms of Service](https://www.whatsapp.com/legal/terms-of-service) | [Privacy Policy](https://www.whatsapp.com/legal/privacy-policy)

= Remote RSS Feeds =
When importing or refreshing podcasts, this plugin fetches the remote RSS feed URL provided by the site administrator. This sends an HTTP GET request directly to the RSS feed's host server.

Data sent: No personal visitor data is included in the request. The request is a standard HTTP GET to retrieve the RSS feed document.
When: When a site administrator triggers an import or sync from the plugin's import screen.

== Screenshots ==

1. **Dashboard** — The welcome screen showing the plugin logo and branding, a quick-start importer for standard podcast categories, and options to import an existing podcast from an RSS feed or create a new self-hosted podcast.
2. **Podcast editor** — The podcast edit screen organized into Podcast Details, Distribution, and Import Options tabs, with accordion sections for podcast details, participants, subscribe buttons, and follow buttons.
3. **Episode editor** — The episode edit screen with metaboxes for episode file, chapters, transcription, participants, and distribution.
4. **Episodes grid layout** — Front-end grid display of episodes with cover art, title, and duration.
5. **Episodes list layout** — Compact front-end list layout with cover art, title, and duration.
6. **Episodes compact layout** — Space-saving layout with a featured episode and an inline mini-player above a compact episode list.
7. **Episode slider layout** — Swiper-powered episode slider for embedding on landing pages.
8. **Single episode player** — The embedded episode player with playback speed, volume, download, and sharing controls.
9. **Video episode player** *(Premium)* — The embedded player rendering a video episode, with configurable width and aspect ratio alongside the standard playback, volume, download, and sharing controls.
10. **Settings panel** — The tabbed settings panel showing the 100+ configuration options organized by category.
11. **Statistics — global view** *(Premium)* — The global statistics screen showing plays and downloads over a date range with a Chart.js line graph.
12. **Statistics — episode view** *(Premium)* — Per-episode statistics breakdown.
13. **Shortcode builder** — The visual shortcode builder with grouped attribute controls that generate a ready-to-paste shortcode.
14. **Categories page** — Front-end categories grid with cover images.
15. **Participants page** — Front-end participant profile page with bio, social links, and linked episodes.

== Premium Features ==

AiO Podcast Studio includes premium features for creators and teams who need more advanced control.

= Video Podcasting =

Publish video podcast episodes alongside your audio shows. Upload or link video files directly from the episode editor, and let the built-in player handle the rest.

= Podcasts & Episodes Access Restrictions =

Control who can listen to your content. Restrict entire podcasts or individual episodes to specific WordPress user roles — perfect for membership sites, private shows, and course-based content.

= Advanced Statistics =

Get a deeper view of your audience. Track plays and downloads per podcast and per episode, and explore trends over any custom date range.

== Coming Soon ==

We are actively working on the next generation of AiO Podcast Studio. Here is what is planned for the upcoming release:

= Podcasting 2.0 Support =

The [Podcasting 2.0](https://podcasting2.org/) initiative (`podcast:` namespace) extends the standard RSS format with richer metadata. The next release will import and integrate these elements automatically when you sync your podcast feed:

* **Transcripts** — Import per-episode transcript URLs and types from `<podcast:transcript>` tags.
* **Chapters** — Import chapter file URLs from `<podcast:chapters>` tags.
* **Hosts & Guests** — Import hosts and guests with roles and images from `<podcast:person>` tags.
* **Feed Lock** — Respect the `<podcast:locked>` flag during feed migration.
* **Stable Feed GUID** — Store the permanent feed identifier from `<podcast:guid>`.

If you import a podcast today and your feed already uses these tags, simply re-sync your podcast after upgrading to pull in the new fields — no manual data entry required.

== Feedback & Feature Requests ==

Missing something? [Contact us](https://aiopodcasting.com/support/) and we will be happy to review your suggestion and include it in a future release if it is a good fit.

== Changelog ==

= 1.0.4 =

* New: Podcasts and episodes can now use the standard WordPress categories and tags, alongside the plugin's own Podcast Categories and Episode Tags. Switch it on under Settings → General → WordPress Categories & Tags; it is off by default, and it does not change your RSS feed. Once on, your podcasts and episodes are listed in your site's own category and tag archives alongside your posts, and other plugins that work with the standard taxonomies reach your podcast content with no further setup.
* New: Added an "Episode File URL Format" setting under Settings → General → Performance & Compatibility. Some servers answer any address ending in a media file extension themselves, rather than passing the request on to WordPress. Where that happens, listeners are sent to your home page and podcast apps report the episode as an invalid or unplayable file. Two alternative address formats are now available for those servers.
* New: The player can now show the episode description below the episode details, so listeners can see what an episode is about without leaving the page. Switch it on under Settings → Display → Player by ticking "Episode Description (Excerpt)", and set its own "Excerpt Length" there — the player is usually best kept shorter than a list. Where a player sits above an episode list, the description changes with the episode you select. The option can also be set per shortcode, block, and widget.
* Tweak: The "Categories" column and filter on the Podcasts screen are now labelled "Podcast Categories", and the "Tags" column and filter on the Episodes screen are now labelled "Episode Tags" — the names the plugin already uses for them elsewhere. This keeps them distinct from the standard WordPress Categories and Tags columns, which appear alongside them when the new setting above is switched on.
* Tweak: Renamed the "Performance" settings section to "Performance & Compatibility". Alongside the speed-related options it also holds settings for working around server and theme behaviour, and the name now says so.
* Tweak: For sites using Yoast SEO or Rank Math, the breadcrumb trail on a single episode now names the show the episode belongs to, reading "Home > Podcasts > Your Show > Episode Title" instead of "Home > Episodes > Episode Title". The show is the page a listener would actually have come through, and naming it means the trail Google prints beneath your search result says which podcast an episode is from. The episodes archive no longer appears in an episode's trail. Both SEO plugins now read the same way, whether or not you use custom archive pages and wherever those pages sit in your page structure. An episode belonging to a podcast you have not published — one still in draft, or set to private — keeps the previous trail, and the unpublished podcast is never named or linked.
* Fix (Premium): Restricted podcasts and episodes could show their full description in listings the plugin does not render itself — your theme's category, tag and search pages, and the feeds for them — even though the same description is withheld on the episode's own page. Restricted content is now protected wherever it is listed. The title, image and any excerpt you have written yourself are still shown, so the episode stays discoverable and can still be found by search engines, but the description itself is not. The message explaining that content is restricted continues to appear only on the podcast or episode page, never inside a listing.
* Fix: Imported podcasts and episodes took their excerpt from the iTunes summary, which carries a full-length description rather than a short one. Excerpts therefore arrived at full length, and the excerpt length setting appeared to do nothing. Imports no longer set an excerpt at all: every description the feed offers is read into the content, and the excerpt is generated from it, so the excerpt length setting is always applied. The excerpt field is left free for wording you write yourself, and anything you put there is shown in full. Re-importing with "Update existing content" enabled refreshes the description and clears the excerpt — this is what repairs podcasts and episodes imported before this version, but it also removes an excerpt you have written by hand, so re-import deliberately. Nothing changes on existing content until you import again. Developers who know their feed puts a genuinely short line in a particular element can map it onto the excerpt with the new `aiopod_import_parsed_podcast` and `aiopod_import_parsed_episode` filters.
* Fix: Pages sitting underneath a custom archive page returned "404 Not Found". A category, tag, or participant page placed under the podcast archive page — or an episode archive page placed under the podcast one — was looked up as a podcast, was not found, and produced the error. Individual category and participant pages were unaffected, which made this look like a problem with the overview pages alone. These pages now display correctly wherever they sit in the page hierarchy.
* Fix: For sites using Yoast SEO or Rank Math, the breadcrumb trail was missing the pages above your podcast content. On a single podcast the archive page was absent altogether: assigning a custom archive page removes the default podcast archive, and both SEO plugins build their archive breadcrumb from that default, so the trail jumped straight from your home page to the podcast. On the category, tag, participant, and archive pages, whichever page they are nested inside could be missing as well. Every one of these pages now carries its full path — and nothing is added twice where your SEO plugin already had it right. Sites with no custom archive page assigned keep the archive breadcrumb they already had.
* Fix: For sites using Yoast SEO or Rank Math, the category, tag, and participant pages sent incomplete breadcrumb information to search engines. The step naming the category, tag, or participant being viewed was missing its address, which Yoast SEO treats as reason to discard the entire trail and Rank Math treats as reason to leave that step out — so Yoast sent nothing at all, and Rank Math sent a trail that stopped one step short. Both now send the whole trail. This is separate from the plugin's own "Show Breadcrumbs" option for these pages, which was never affected: what visitors saw on the page was correct throughout, and it was only the copy read by search engines that was wrong.

= 1.0.3 =

* New: Added support for Paid Memberships Pro and its "Custom Post Type Membership Access" add-on. Select Podcasts and/or Episodes on the add-on's settings page and your membership restrictions are then enforced everywhere they appear — single pages, shortcodes, blocks, widgets, and the player.
* New: Restricted podcasts and episodes now display the restriction message from Paid Memberships Pro instead of a generic one, so your membership levels, custom non-member text, sign-up links, and translations are all used exactly as you configured them.
* New: Restricting a podcast now restricts every episode belonging to it, so a show can be closed off without editing each episode, and episodes added later by an RSS import or a scheduled sync are covered automatically. This applies to Paid Memberships Pro and to role-based restrictions in Premium alike. Developers can turn it off with the `aiopod_inherit_podcast_access` filter to restrict episodes individually instead.
* New: Added support for the "Member RSS" add-on for Paid Memberships Pro. Members can subscribe to a podcast in their own podcast app using a feed address of their own, and receive the episodes their membership entitles them to. Everyone else continues to receive the public feed. Both of the add-on's sign-in methods work — a member key in the address, and basic authentication with a WordPress application password.
* New: A member's sign-in details are carried through to the episode media links inside their feed, so podcast apps can download the audio without being turned away.
* New: A member's own podcast feeds are now listed on their RSS feeds page and their membership account page, so they can find and copy their feed addresses rather than being sent one by hand. Only the podcasts their membership gives them something extra in are listed — whether the whole show is for members, or it is a public show with members-only episodes in it.
* New: Podcast feeds now answer a repeat request with "304 Not Modified" when nothing has changed, so podcast apps that check frequently no longer download the whole feed every time.
* Fix: A restricted podcast or episode still displayed its full content, including a working player, when the restriction came from a membership plugin. This happened because our content was generated after the membership plugin had already replaced it.
* Fix: Restricted episodes were listed in the public RSS feed, exposing their title, description, and artwork, and appearing in podcast apps as episodes that cannot be played. Restricted episodes are now left out of the feed. This applies to role-based restrictions in Premium as well.
* Fix: Episode media files could be downloaded by anyone with the download URL, even when the episode was restricted. Downloads now return a "403 Forbidden" response for visitors without access. This applies to role-based restrictions in Premium as well, so files for restricted episodes are no longer reachable.
* Fix: Feed caching never took effect. The cached copy was stored in a format the database rejected, and the failure was hidden, so every request rebuilt the entire feed from scratch. Feeds are now cached as intended and are served roughly twice as fast.
* Fix (Premium): Role-based restrictions could grant back access that another access-control plugin had already denied, when restrictions were switched off globally or the episode was not individually marked as restricted.

= 1.0.2 =

* New: Added a "Try a sample feed" link below the RSS Feed URL field on the Add New Podcast screen. Clicking it fills in a sample podcast feed URL so you can test the import with a single click.
* Tweak: The player's download button is now hidden for streaming and embedded sources (HLS, DASH — plus YouTube and Vimeo in Premium), since these are not downloadable files.
* Tweak: Added a light background color to artwork images on the front end, providing a subtle loading state and a consistent surface for placeholder and transparent images.
* Tweak: The default tags layout is now Tag Cloud instead of List. Existing sites keep their saved layout setting.
* Tweak: Updated Freemius SDK to version 2.13.4.
* Fix (Premium): YouTube and Vimeo episodes did not start playing when selected from the episodes list while the player's autoplay setting was disabled.
* Fix: Switching between episodes with different source types (MP3, HLS, DASH — plus YouTube, Vimeo, and video files in Premium) could intermittently fail to load the newly selected episode.

= 1.0.1 =

* Tweak: Lowered the per-image download timeout and reduced the import batch size while featured-image downloading is enabled, keeping each request well within typical shared-hosting limits.
* Fix: RSS imports could fail with a "The connection to the server was lost" error on shared hosting when downloading featured images for large feeds. Episodes are now imported in time-bounded, automatically resumable batches so imports complete reliably regardless of the host's request execution limit.

= 1.0.0 =

* Initial release.

== Upgrade Notice ==

= 1.0.4 =

Introduces several new features, bug fixes & enhancements. [See changelog](https://wordpress.org/plugins/aio-podcast-studio/#developers)