{"id":295158,"date":"2026-05-19T10:51:21","date_gmt":"2026-05-19T10:51:21","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/simple-podcast-chapters\/"},"modified":"2026-05-22T14:08:40","modified_gmt":"2026-05-22T14:08:40","slug":"chapcast-podcast-chapters","status":"publish","type":"plugin","link":"https:\/\/ca.wordpress.org\/plugins\/chapcast-podcast-chapters\/","author":23279987,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.7","stable_tag":"1.1.7","tested":"7.0","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Chapcast \u2013 Podcast Chapters","header_author":"Nordic Hosting","header_description":"HTML5 audio player with a clickable chapter list. Chapters are entered in the editor; audio can come from uploads, the Audio block, or optionally Seriously Simple Podcasting \u2014 SSP is not required.","assets_banners_color":"","last_updated":"2026-05-22 14:08:40","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/nordic.hosting","rating":0,"author_block_rating":0,"active_installs":0,"downloads":132,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.4":{"tag":"1.1.4","author":"nordichosting","date":"2026-05-19 10:50:46"},"1.1.5":{"tag":"1.1.5","author":"nordichosting","date":"2026-05-21 14:33:32"},"1.1.6":{"tag":"1.1.6","author":"nordichosting","date":"2026-05-22 06:41:08"},"1.1.7":{"tag":"1.1.7","author":"nordichosting","date":"2026-05-22 14:08:40"}},"upgrade_notice":{"1.1.7":"<p>Fixes stale chapters leaking onto cloned episodes that share an audio file, and stops Yoast Duplicate Post from copying chapter rows on clone. Each episode is now strictly per-post for chapters.<\/p>","1.1.6":"<p>Chapcast override URL now auto-mirrors to SSP audio_file\/enclosure on save \u2014 cloned episodes get the Castos player immediately without a manual SSP edit.<\/p>","1.1.5":"<p>Important bug fix: chapters are now stored per episode. Cloning a post no longer overwrites the original&#039;s chapters. No data migration needed \u2014 existing chapters migrate automatically on next save.<\/p>","1.1.4":"<p>Text domain and folder slug now match the assigned WordPress.org slug (chapcast-podcast-chapters).<\/p>","1.1.3":"<p>Chapter list now matches the player width at every resolution.<\/p>","1.1.2":"<p>Fix for automated scan: i18n domain must be a literal string, not a constant.<\/p>","1.1.1":"<p>Text domain and settings page slug aligned with the <code>simple-podcast-chapters<\/code> plugin folder for directory compliance.<\/p>","1.1.0":"<p>Renamed to Chapcast; data migrates automatically. Prefer shortcode <code>[chapcast_player]<\/code> and filters <code>chapcast_*<\/code> in custom code.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1.4","1.1.5","1.1.6","1.1.7"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[452,17041,444,238,15212],"plugin_category":[50,56],"plugin_contributors":[241980],"plugin_business_model":[],"class_list":["post-295158","plugin","type-plugin","status-publish","hentry","plugin_tags-audio","plugin_tags-chapters","plugin_tags-player","plugin_tags-podcast","plugin_tags-seriously-simple-podcasting","plugin_category-media","plugin_category-social-and-sharing","plugin_contributors-nordichosting","plugin_committers-nordichosting"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/chapcast-podcast-chapters.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Chapcast adds a <strong>Podcast chapters<\/strong> meta box in the editor where you can enter start times and titles. On the front end, visitors see the standard HTML5 audio player plus a list of chapters; clicking a chapter jumps to that position in the audio.<\/p>\n\n<ul>\n<li><strong>Audio URL<\/strong> is resolved automatically: Seriously Simple Podcasting episode file, first <strong>audio file attached to the post<\/strong> (upload in editor), <strong>Audio<\/strong> block \/ <code>[audio]<\/code> shortcode in content, or a manual override \/ media library picker in the meta box.<\/li>\n<li>Shortcode <code>[chapcast_player]<\/code> for manual placement (otherwise the player is appended after the post content when chapters exist). The legacy tag <code>[spc_player]<\/code> is still registered for backward compatibility.<\/li>\n<li><strong>Settings<\/strong> screen under <strong>Settings \u2192 Podcast Chapters<\/strong> (help text + toggle automatic player placement).<\/li>\n<li><strong>Media Library<\/strong> (list view): <strong>Chapters<\/strong> column on audio files shows whether chapter rows are saved on the attachment.<\/li>\n<li>Filters for developers: <code>chapcast_post_types<\/code>, <code>chapcast_audio_url<\/code>, <code>chapcast_append_player_to_content<\/code>.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to <code>\/wp-content\/plugins\/chapcast-podcast-chapters\/<\/code> (the folder name must match the WordPress.org slug so the bundled text domain loads), or install through the WordPress plugins screen.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen in WordPress.<\/li>\n<li>Edit a podcast episode (or post, if the <code>podcast<\/code> post type is not present), add chapters under <strong>Podcast chapters<\/strong>, and publish.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"something%20appears%20between%20my%20audio%20and%20the%20chapter%20list\"><h3>Something appears between my audio and the chapter list<\/h3><\/dt>\n<dd><p>With automatic placement, the chapter list is output <strong>after<\/strong> all content in the editor. Reorder blocks so the episode Audio block is <strong>below<\/strong> intro\/promo content, or turn off automatic placement and use <code>[chapcast_player]<\/code> right after the Audio block. See <strong>Settings \u2192 Podcast Chapters \u2192 Content order<\/strong>.<\/p><\/dd>\n<dt id=\"i%20turned%20off%20automatic%20placement%20and%20chapters%20disappeared\"><h3>I turned off automatic placement and chapters disappeared<\/h3><\/dt>\n<dd><p>You must add <code>[chapcast_player]<\/code> to the post (Shortcode block) where you want the player and chapters. The meta box shows a reminder if the shortcode is missing.<\/p><\/dd>\n<dt id=\"do%20i%20need%20the%20audio%20block%20at%20the%20bottom%20of%20the%20post%3F\"><h3>Do I need the audio block at the bottom of the post?<\/h3><\/dt>\n<dd><p>Only if you use <strong>automatic<\/strong> placement and want chapters directly under that player \u2014 then put other blocks <strong>above<\/strong> the Audio block. If you use <strong>manual<\/strong> placement (<code>[chapcast_player]<\/code>), put the shortcode wherever you like (e.g. right after the Audio block in the middle of the page).<\/p><\/dd>\n<dt id=\"can%20chapters%20follow%20the%20media%20file%20instead%20of%20each%20post%3F\"><h3>Can chapters follow the media file instead of each post?<\/h3><\/dt>\n<dd><p>Each episode stores its own chapter list. You can edit chapters directly on a <strong>media file<\/strong> (Media Library \u2192 audio file \u2192 Podcast chapters), but those chapters only show when the media file is viewed on its own attachment page \u2014 they no longer leak onto episodes that share the same audio file. Since 1.1.7 chapters are read strictly from the post; this prevents stale chapters from old episodes appearing on newly cloned posts.<\/p><\/dd>\n<dt id=\"does%20this%20read%20chapters%20from%20m4a%20files%20automatically%3F\"><h3>Does this read chapters from M4A files automatically?<\/h3><\/dt>\n<dd><p>No. Chapters are entered in the WordPress editor. This keeps the plugin simple and works with any audio format supported by the browser.<\/p><\/dd>\n<dt id=\"which%20post%20types%20are%20supported%3F\"><h3>Which post types are supported?<\/h3><\/dt>\n<dd><p>By default, the meta box and front-end player apply to <strong>Posts<\/strong>, <strong>Pages<\/strong>, and the <code>podcast<\/code> post type when Seriously Simple Podcasting (or another plugin) registers it. If your episodes use a different post type slug, add it with the <code>chapcast_post_types<\/code> filter.<\/p><\/dd>\n<dt id=\"i%20use%20chapters%20on%20the%20media%20file%20but%20the%20episode%20shows%20no%20chapters\"><h3>I use chapters on the media file but the episode shows no chapters<\/h3><\/dt>\n<dd><p>Since 1.1.7 chapters are read strictly from the post, not from the audio attachment. Enter chapters on the episode itself in the <strong>Podcast chapters<\/strong> meta box. The attachment-level chapter list still exists for editing media files directly, but it is no longer used as a fallback on posts \u2014 this prevents stale rows from old episodes appearing on newly cloned posts that share an audio file.<\/p><\/dd>\n<dt id=\"i%20don%E2%80%99t%20see%20the%20podcast%20chapters%20box%20in%20the%20block%20editor\"><h3>I don\u2019t see the Podcast chapters box in the block editor<\/h3><\/dt>\n<dd><p>Open the <strong>Options<\/strong> (\u22ee) menu or the <strong>Plugins<\/strong> \/ sidebar panels \u2014 meta boxes may appear below the editor or in a collapsible panel depending on your WordPress version and theme.<\/p><\/dd>\n<dt id=\"i%20upgraded%20from%20%E2%80%9Csimple%20podcast%20chapters%E2%80%9D%20%E2%80%94%20will%20my%20data%20migrate%3F\"><h3>I upgraded from \u201cSimple Podcast Chapters\u201d \u2014 will my data migrate?<\/h3><\/dt>\n<dd><p>Yes. On first load after upgrade, post meta <code>_spc_chapters<\/code> \/ <code>_spc_audio_url_override<\/code> and option <code>spc_auto_append<\/code> are migrated to the new <code>chapcast_*<\/code> keys automatically.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.7<\/h4>\n\n<ul>\n<li><strong>Bug fix:<\/strong> Removed the attachment-level chapter fallback that caused stale chapters from older episodes to appear on newly cloned posts whenever the clone reused the same audio file. Chapters are now read strictly from the post \u2014 an episode with no chapter rows simply renders no chapter list, regardless of what the underlying audio attachment has saved.<\/li>\n<li><strong>Bug fix:<\/strong> Yoast <strong>Duplicate Post<\/strong> no longer copies <code>_chapcast_chapters<\/code> when an episode is cloned. The plugin now hooks <code>duplicate_post_excludelist_filter<\/code> (and the legacy <code>duplicate_post_blacklist_filter<\/code>) so each cloned episode starts with an empty chapter list. The audio override URL is still inherited as before.<\/li>\n<li>The admin meta box now reflects this directly: opening a cloned episode never shows \"legacy\" chapters carried over from the source file.<\/li>\n<\/ul>\n\n<h4>1.1.6<\/h4>\n\n<ul>\n<li>Fix: Chapcast audio override URL now automatically mirrors to SSP's <code>audio_file<\/code> and <code>enclosure<\/code> meta on save. This keeps the Castos dark-mode player rendering after clone + save, removing the manual SSP-edit step previously required.<\/li>\n<li>No breaking changes. Episodes without an override URL are unaffected. <code>episode_type<\/code> is only set if currently empty.<\/li>\n<\/ul>\n\n<h4>1.1.5<\/h4>\n\n<ul>\n<li><strong>Bug fix:<\/strong> Chapters are now saved on each post individually instead of on the shared audio file. Previously, cloning an episode and editing its chapters would overwrite the original's chapters because both posts pointed to the same media file. Each episode now has its own independent chapter list.<\/li>\n<li>Legacy episodes (chapters stored on the attachment) continue to display correctly via fallback. They migrate automatically to per-post storage on next save \u2014 no bulk migration needed.<\/li>\n<li>Meta box notice updated: shows a positive confirmation when chapters are saved per-post, and a migration hint when legacy attachment chapters are still in use.<\/li>\n<\/ul>\n\n<h4>1.1.4<\/h4>\n\n<ul>\n<li>Aligned the plugin <strong>text domain<\/strong> and bundled <strong>language files<\/strong> with the assigned WordPress.org slug <code>chapcast-podcast-chapters<\/code> (was <code>simple-podcast-chapters<\/code>). The plugin folder in the release zip is now <code>chapcast-podcast-chapters\/<\/code>. Required for the automated Plugin Check (<code>WordPress.WP.I18n.TextDomainMismatch<\/code>).<\/li>\n<\/ul>\n\n<h4>1.1.3<\/h4>\n\n<ul>\n<li>Fix: chapter list now matches the width of the audio player \/ SSP player at every viewport size. Chapters-only blocks no longer get capped at 40rem when the player column is wider, and a <code>ResizeObserver<\/code> keeps the two in sync on responsive layout changes.<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Internationalization: text domain parameter is always the string literal <code>'simple-podcast-chapters'<\/code> (required by automated Plugin Check \/ <code>NonSingularStringLiteralDomain<\/code>). Settings page slug remains <code>CHAPCAST_SETTINGS_PAGE<\/code> constant where not used as i18n domain.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Internationalization: <code>__()<\/code> \/ <code>_e()<\/code> strings use text domain <code>simple-podcast-chapters<\/code> (matches the plugin directory slug and Plugin Check). <code>CHAPCAST_SETTINGS_PAGE<\/code> in the main file for the settings screen slug.<\/li>\n<li>Bundled Norwegian Bokm\u00e5l files renamed to <code>simple-podcast-chapters-nb_NO.po<\/code> \/ <code>.mo<\/code>.<\/li>\n<li>Settings screen URL restored to <code>options-general.php?page=simple-podcast-chapters<\/code> (same as 1.0.x).<\/li>\n<li>Uninstall: prefixed loop variables for PHPCS.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Renamed plugin to <strong>Chapcast \u2013 Podcast Chapters<\/strong> (WordPress.org naming guidelines).<\/li>\n<li>New text domain <code>chapcast<\/code>, slug <code>chapcast<\/code>, PHP prefix <code>chapcast_<\/code> \/ <code>CHAPCAST_<\/code>, CSS\/JS classes <code>chapcast-*<\/code>.<\/li>\n<li>Developer filters renamed from <code>spc_*<\/code> to <code>chapcast_*<\/code> (see code or this readme).<\/li>\n<li>Shortcode <code>[chapcast_player]<\/code>; <code>[spc_player]<\/code> kept as deprecated alias.<\/li>\n<li>Automatic migration from legacy <code>_spc_*<\/code> meta and <code>spc_auto_append<\/code> option.<\/li>\n<li>Settings: <code>register_setting<\/code> uses <code>wp_validate_boolean<\/code> for the checkbox option.<\/li>\n<li>Removed <code>load_plugin_textdomain()<\/code> (WordPress.org loads translations since WP 4.6).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release (as Simple Podcast Chapters).<\/li>\n<\/ul>","raw_excerpt":"HTML5 podcast player with clickable chapters. SSP optional; works with uploads, the Audio block, or any resolved audio URL.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/295158","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=295158"}],"author":[{"embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/nordichosting"}],"wp:attachment":[{"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=295158"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=295158"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=295158"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=295158"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=295158"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=295158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}