{"id":348366,"date":"2026-09-10T00:49:48","date_gmt":"2026-09-10T00:49:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/sunday\/"},"modified":"2026-09-10T19:24:33","modified_gmt":"2026-09-10T19:24:33","slug":"seedcast-bulletin-library","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/seedcast-bulletin-library\/","author":23534094,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"3.8.0","stable_tag":"3.8.0","tested":"7.1","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Seedcast Bulletin Library","header_author":"Seedcast","header_description":"A searchable archive of every week's service bulletin. Bulletin Library assembles programs, announcements, and handouts into a single dated page and preserves the story of each Sunday over time.","assets_banners_color":"0e1418","last_updated":"2026-09-10 19:24:33","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/seedcast.ai\/bulletin-library\/","header_author_uri":"https:\/\/seedcast.ai","rating":0,"author_block_rating":0,"active_installs":0,"downloads":57,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"3.7.0":{"tag":"3.7.0","author":"seedcast","date":"2026-09-10 00:49:31","revision":3689156},"3.8.0":{"tag":"3.8.0","author":"seedcast","date":"2026-09-10 19:24:33","revision":3690389}},"upgrade_notice":{"3.8.0":"<p>Announcements get a Scheduling box with frequencies such as One Time, Multiday and Recurring. Existing announcements carry over as &quot;No set schedule&quot; with their dates and time, so nothing changes until you edit them.<\/p>","3.7.0":"<p>Settings stored by the shared Seedcast library move to a new, longer prefix. They are carried across for you on the first page load after upgrading, so nothing needs re-entering. Includes output escaping and input handling improvements.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3689156,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3689156,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3689156,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3689156,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["3.7.0","3.8.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3689156,"resolution":"1","location":"assets","locale":"","width":1950,"height":5359},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3690389,"resolution":"10","location":"assets","locale":"","width":1775,"height":3783},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3689156,"resolution":"2","location":"assets","locale":"","width":1928,"height":1419},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3689156,"resolution":"3","location":"assets","locale":"","width":1587,"height":3927},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3689156,"resolution":"4","location":"assets","locale":"","width":2003,"height":1122},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3689156,"resolution":"5","location":"assets","locale":"","width":2013,"height":3409},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3689156,"resolution":"6","location":"assets","locale":"","width":1653,"height":1046},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3689156,"resolution":"7","location":"assets","locale":"","width":1636,"height":1489},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3690379,"resolution":"8","location":"assets","locale":"","width":2176,"height":1552},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3690379,"resolution":"9","location":"assets","locale":"","width":2169,"height":2276}},"screenshots":{"1":"A published service page: dated heading, featured image or video, the service overview, the sermon, today's programs with handouts, this week's announcements, and the visitor card in the sidebar.","2":"The Sunday Services archive, with your own heading and intro text above a grid of every service you have published.","3":"Bulletin Library settings: archive display, editor choice, custom labels, URL slug, fallback image, front-end CSS and the shortcode reference.","4":"The Services list, with a \"Still missing\" column that tells you which Sundays are complete before a visitor finds out for you.","5":"Editing a service: service date, overview, featured image position, service video, and one-click suggestions for the programs, announcements and handouts that belong to that week.","6":"Programs are written once and reused: Main Service, Kids Church, Kids Huddle, Abidey Babies.","7":"Editing a program: description, time, optional link to the ministry page, and its own image.","8":"The Announcements list, showing each announcement's schedule and whether it is active or still upcoming.","9":"Editing an announcement: its frequency and schedule, location, contact details that autocomplete from your contacts list, and an event link.","10":"An announcements page made with <code>[scbl_announcements grouped=\"true\"]<\/code>: dated events under Upcoming, soonest first, with each date and time on its own line, and regular gatherings under Ongoing."}},"plugin_section":[],"plugin_tags":[7557,14460,6970,17518,6969],"plugin_category":[39],"plugin_contributors":[273646],"plugin_business_model":[],"class_list":["post-348366","plugin","type-plugin","status-publish","hentry","plugin_tags-announcements","plugin_tags-bulletin","plugin_tags-church","plugin_tags-ministry","plugin_tags-sermons","plugin_category-business","plugin_contributors-seedcast","plugin_committers-seedcast"],"banners":{"banner":"https:\/\/ps.w.org\/seedcast-bulletin-library\/assets\/banner-772x250.png?rev=3689156","banner_2x":"https:\/\/ps.w.org\/seedcast-bulletin-library\/assets\/banner-1544x500.png?rev=3689156","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/seedcast-bulletin-library\/assets\/icon-128x128.png?rev=3689156","icon_2x":"https:\/\/ps.w.org\/seedcast-bulletin-library\/assets\/icon-256x256.png?rev=3689156","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/seedcast-bulletin-library\/assets\/screenshot-1.png?rev=3689156","caption":"A published service page: dated heading, featured image or video, the service overview, the sermon, today's programs with handouts, this week's announcements, and the visitor card in the sidebar."},{"src":"https:\/\/ps.w.org\/seedcast-bulletin-library\/assets\/screenshot-2.png?rev=3689156","caption":"The Sunday Services archive, with your own heading and intro text above a grid of every service you have published."},{"src":"https:\/\/ps.w.org\/seedcast-bulletin-library\/assets\/screenshot-3.png?rev=3689156","caption":"Bulletin Library settings: archive display, editor choice, custom labels, URL slug, fallback image, front-end CSS and the shortcode reference."},{"src":"https:\/\/ps.w.org\/seedcast-bulletin-library\/assets\/screenshot-4.png?rev=3689156","caption":"The Services list, with a \"Still missing\" column that tells you which Sundays are complete before a visitor finds out for you."},{"src":"https:\/\/ps.w.org\/seedcast-bulletin-library\/assets\/screenshot-5.png?rev=3689156","caption":"Editing a service: service date, overview, featured image position, service video, and one-click suggestions for the programs, announcements and handouts that belong to that week."},{"src":"https:\/\/ps.w.org\/seedcast-bulletin-library\/assets\/screenshot-6.png?rev=3689156","caption":"Programs are written once and reused: Main Service, Kids Church, Kids Huddle, Abidey Babies."},{"src":"https:\/\/ps.w.org\/seedcast-bulletin-library\/assets\/screenshot-7.png?rev=3689156","caption":"Editing a program: description, time, optional link to the ministry page, and its own image."},{"src":"https:\/\/ps.w.org\/seedcast-bulletin-library\/assets\/screenshot-8.png?rev=3690379","caption":"The Announcements list, showing each announcement's schedule and whether it is active or still upcoming."},{"src":"https:\/\/ps.w.org\/seedcast-bulletin-library\/assets\/screenshot-9.png?rev=3690379","caption":"Editing an announcement: its frequency and schedule, location, contact details that autocomplete from your contacts list, and an event link."},{"src":"https:\/\/ps.w.org\/seedcast-bulletin-library\/assets\/screenshot-10.png?rev=3690389","caption":"An announcements page made with <code>[scbl_announcements grouped=\"true\"]<\/code>: dated events under Upcoming, soonest first, with each date and time on its own line, and regular gatherings under Ongoing."}],"raw_content":"<!--section=description-->\n<p><strong>Seedcast explains Sunday.<\/strong><\/p>\n\n<p>Every week your church gathers and something happens that is worth keeping. Seedcast Bulletin Library turns that gathering into a page: the date, the message, the programs that met, the announcements that mattered that week, and the handouts people took home. Publish it once and it stays put. The week you are living now quietly becomes the archive a visitor reads next year.<\/p>\n\n<p>It answers the question every visitor is already asking before they ever walk through your doors: what is it actually like to be part of this church?<\/p>\n\n<h4>Built for whoever runs the bulletin<\/h4>\n\n<p>Everything happens in the WordPress admin, in plain language. Create a service, choose the date, and the plugin offers you the programs and announcements that belong to that week. Click Add and they attach. There is no page builder to learn, no template to edit and no code to write, and the Services list tells you at a glance which Sundays are still missing something.<\/p>\n\n<h4>What lives on a service page<\/h4>\n\n<ul>\n<li><strong>A dated heading<\/strong>, so every Sunday has its own permanent URL and its own place in the archive.<\/li>\n<li><strong>A featured image or video.<\/strong> Drop in a YouTube, Vimeo or direct MP4 URL and the video plays in place of the image. You choose whether the image sits above the overview, below it, or stays hidden.<\/li>\n<li><strong>A service overview<\/strong> written in the normal WordPress editor. Prefer blocks? Turn the block editor on for services with one checkbox.<\/li>\n<li><strong>Today's Programs<\/strong>, each with its time, description, image and optional link.<\/li>\n<li><strong>This Week's Announcements<\/strong>, laid out as cards saying when each one happens, where, who to contact, and an event link.<\/li>\n<li><strong>Today's Handouts<\/strong>, printable materials that render as download buttons beside the program they belong to.<\/li>\n<li><strong>A sermon<\/strong>, when Sermon Library is installed, and any other section a companion Seedcast plugin contributes.<\/li>\n<li><strong>Share buttons<\/strong> for Facebook, X, LinkedIn, email and copy link.<\/li>\n<\/ul>\n\n<h4>Programs<\/h4>\n\n<p>Programs are the parallel experiences happening at your gathering: Sunday School, Youth Program, Main Service, Kids Church. Write each one once, with a title, time, description, image and an optional link to the ministry page on your site. From then on it is offered to you every week, ready to attach with a single click.<\/p>\n\n<h4>Announcements scheduled the way your church talks<\/h4>\n\n<p>Every announcement starts with a frequency, and the editor asks only for what that frequency needs:<\/p>\n\n<ul>\n<li><strong>No set schedule<\/strong> for notices that are not events: a sign-up, a call for volunteers.<\/li>\n<li><strong>One Time<\/strong> for a single date.<\/li>\n<li><strong>Consecutive<\/strong> for a run of days, like ten days of prayer.<\/li>\n<li><strong>Multiday<\/strong> for one ministry that meets on several days, each with its own time. The men's group that meets on Wednesday at noon and again on Monday afternoon is one announcement, not two.<\/li>\n<li><strong>Staggered<\/strong> for a handful of specific dates, like a quarterly worship night.<\/li>\n<li><strong>Recurring<\/strong> for a regular rhythm: weekly on a chosen day, monthly, every other month, or the first, second, third or last weekday of the month.<\/li>\n<\/ul>\n\n<p>The card says it in plain words, \"Every Thursday \u00b7 7pm\" or \"Third Saturday of the month \u00b7 8am\", and a Staggered announcement quietly drops the dates that have already passed.<\/p>\n\n<p>An announcement is offered to every Sunday service from the week it is published through the week of its last date. A notice that runs for six weeks is waiting on six service pages without anyone remembering to add it, and you still decide, one click at a time, which Sundays it actually appears on. Each announcement can also carry a location, contact name, email and phone, an event link and its own image, and empty fields simply disappear from the card.<\/p>\n\n<p>Contact names autocomplete from a shared contacts list, so the same ministry leader is spelled and reached the same way everywhere.<\/p>\n\n<h4>History that stays true<\/h4>\n\n<p>When you save a service, its announcements, programs and handouts are copied and frozen into that page. Change a program's description next spring and last autumn's services keep the wording that was actually true that day. When a source has moved on from a saved copy, the editor shows an \"Update\" prompt on the affected item so you can pull the current fields in deliberately, with one click, on the services where it matters.<\/p>\n\n<h4>Structured data for search engines and AI assistants<\/h4>\n\n<p>Every service page emits full JSON-LD: an Event with startDate, datePublished, dateModified, location and organizer, a nested VideoObject when a service video is set, a subEvent list built from that day's Programs, and BreadcrumbList markup. Search engines can index each Sunday as a distinct event, and AI assistants can answer \"what is happening at this church on Sunday?\" from structured, first-party data on your own domain instead of guessing from a PDF.<\/p>\n\n<h4>Settings that keep it yours<\/h4>\n\n<ul>\n<li>Rename \"Service\" to Gathering, Meeting or whatever your church actually calls it, singular and plural.<\/li>\n<li>Set the archive heading, the intro paragraph and how many services show before paginating.<\/li>\n<li>Choose the URL slug before you publish.<\/li>\n<li>Set a fallback image for services without one of their own.<\/li>\n<li>Switch off the plugin's front-end CSS entirely if you would rather style everything in your theme. The markup and class names stay exactly the same.<\/li>\n<li>Show or hide the Visitor Card sidebar on service pages.<\/li>\n<\/ul>\n\n<h4>Shortcodes<\/h4>\n\n<p>Every one of these can be built in <strong>Bulletin Library &gt; Shortcodes<\/strong> by picking options, with a button to copy the result.<\/p>\n\n<ul>\n<li><code>[scbl_services limit=\"6\" columns=\"3\" start_date=\"2026-01-01\"]<\/code> a grid of service cards. Attributes: limit (default 10), columns (1 to 4, default 3), start_date (YYYY-MM-DD, hides services before that date).<\/li>\n<li><code>[scbl_next_service]<\/code> a featured card for the next upcoming service.<\/li>\n<li><code>[scbl_announcements]<\/code> current and upcoming announcements as a grid.<\/li>\n<li><code>[scbl_announcements grouped=\"true\"]<\/code> the same cards under Upcoming and Ongoing headings, for a page that can replace an events calendar. Upcoming lists dated events soonest first and drops each one the day after it ends. Use <code>first=\"upcoming\"<\/code> (the default) or <code>first=\"ongoing\"<\/code> to choose which comes first. Both forms accept columns (1 to 4, default 3).<\/li>\n<li><code>[seedcast_church_details]<\/code> your church name, address, service times, phone, email and a directions link, all read from one place so a move or a time change is a single edit.<\/li>\n<\/ul>\n\n<h4>Part of the Seedcast suite<\/h4>\n\n<p>Bulletin Library carries the shared foundation the rest of the Seedcast plugins build on: one set of church details, one theme token system so everything matches, a submission engine with spam protection, and a sections filter that lets any Seedcast plugin add its own content to a service page.<\/p>\n\n<p>Sermon Library adds sermons that appear on the matching service automatically. Praise Report, Sing, Help, Hospitality and Visitor Card each contribute their own section. Install one or install them all: Bulletin Library works on its own, and the service page grows as you add companions.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>The plugin sends nothing to any external service. Your services, programs, announcements, handouts and contacts stay in your own WordPress database.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to <code>\/wp-content\/plugins\/seedcast-bulletin-library\/<\/code>, or install through the WordPress plugin screen directly.<\/li>\n<li>Activate the plugin through the \"Plugins\" screen in WordPress.<\/li>\n<li>Visit <strong>Bulletin Library<\/strong> in the admin sidebar to add your first service.<\/li>\n<li>Add your church details under <strong>Seedcast &gt; Church<\/strong> so the shortcode and the search engine markup have something to work with.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20to%20add%20code%20to%20make%20this%20work%3F\"><h3>Do I need to add code to make this work?<\/h3><\/dt>\n<dd><p>No. Everything is manageable from the WordPress admin. Four shortcodes are available if you want to embed content on other pages, and the Shortcode Generator builds them for you, but nothing requires them.<\/p><\/dd>\n<dt id=\"does%20this%20replace%20my%20existing%20content%3F\"><h3>Does this replace my existing content?<\/h3><\/dt>\n<dd><p>No. Bulletin Library adds new post types (Services, Programs, Announcements) alongside your existing content. Your pages and posts are untouched.<\/p><\/dd>\n<dt id=\"do%20i%20have%20to%20re-enter%20announcements%20every%20week%3F\"><h3>Do I have to re-enter announcements every week?<\/h3><\/dt>\n<dd><p>No. Every announcement is offered to each Sunday service from the week it is published through the week of its last date. Attach it with one click, or leave it off a week where it does not apply. One with no end date keeps being offered until you unpublish it.<\/p><\/dd>\n<dt id=\"can%20one%20announcement%20cover%20a%20group%20that%20meets%20on%20different%20days%3F\"><h3>Can one announcement cover a group that meets on different days?<\/h3><\/dt>\n<dd><p>Yes. Choose Multiday and add a row for each day, each with its own time. For specific dates rather than weekdays, such as a quarterly gathering, choose Staggered.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20old%20services%20when%20i%20edit%20a%20program%20or%20announcement%3F\"><h3>What happens to old services when I edit a program or announcement?<\/h3><\/dt>\n<dd><p>Nothing, until you say so. Saved services hold a frozen copy, so history stays accurate. Where a source has changed, the editor shows an \"Update\" prompt on that item and you decide whether to pull the new wording in.<\/p><\/dd>\n<dt id=\"can%20i%20use%20the%20block%20editor%20for%20services%3F\"><h3>Can I use the block editor for services?<\/h3><\/dt>\n<dd><p>Yes. Services use the classic editor by default so the service editor stays visually consistent, and a single checkbox in the settings switches them to the block editor when you want embeds, columns or richer content in the overview.<\/p><\/dd>\n<dt id=\"can%20i%20call%20it%20something%20other%20than%20%22service%22%3F\"><h3>Can I call it something other than \"Service\"?<\/h3><\/dt>\n<dd><p>Yes. Set your own singular and plural labels in the settings, and the admin menus, list tables and archive follow along.<\/p><\/dd>\n<dt id=\"will%20it%20match%20my%20theme%3F\"><h3>Will it match my theme?<\/h3><\/dt>\n<dd><p>The plugin ships with light, token-based styling that sits comfortably in most themes, and every colour is driven by a shared token you can override. If you would rather write the styles yourself, switch the front-end CSS off in the settings and keep the markup exactly as it is.<\/p><\/dd>\n<dt id=\"what%20if%20i%20only%20want%20the%20shared%20infrastructure%20and%20not%20the%20service%20pages%3F\"><h3>What if I only want the shared infrastructure and not the service pages?<\/h3><\/dt>\n<dd><p>The service pages feature can be turned off from the Bulletin Library dashboard. The shared infrastructure stays available to the other Seedcast plugins.<\/p><\/dd>\n<dt id=\"do%20i%20need%20the%20other%20seedcast%20plugins%3F\"><h3>Do I need the other Seedcast plugins?<\/h3><\/dt>\n<dd><p>No. Bulletin Library is complete on its own. Companion plugins add their own sections to the service page when you install them.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20send%20data%20to%20any%20external%20service%3F\"><h3>Does the plugin send data to any external service?<\/h3><\/dt>\n<dd><p>No.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>3.8.0<\/h4>\n\n<ul>\n<li>Announcements get a Scheduling box in place of Display period. Choose a frequency (No set schedule, One Time, Consecutive, Multiday, Staggered, or Recurring: weekly, monthly, every other month, or the first, second, third or last weekday of the month) and fill in only the dates and times it needs. Time now lives in Scheduling.<\/li>\n<li>Multiday covers one ministry that meets on several days of the week, each with its own time. Staggered covers a set of specific dates, each with its own time.<\/li>\n<li>Announcement cards describe the schedule in plain words, such as \"Every Thursday \u00b7 7pm\" or \"Third Saturday of the month \u00b7 8am\". Staggered dates that have already passed for that service's week are left off.<\/li>\n<li>An announcement is now offered to services from the week it is published through the week of its last date, or until it is unpublished when it has none. The <code>[scbl_announcements]<\/code> shortcode follows the same rule, so upcoming announcements now appear there too.<\/li>\n<li>Existing announcements become \"No set schedule\" with their dates and time unchanged, so their cards look the same. Nothing needs migrating, and existing service copies are not flagged as changed.<\/li>\n<li>The Announcements list shows a Schedule column in place of Start and End.<\/li>\n<li>New: <code>[scbl_announcements grouped=\"true\"]<\/code> lists announcements under Upcoming and Ongoing, so one page of it can replace an events calendar. One Time, Consecutive and Staggered announcements are Upcoming, soonest first; everything else is Ongoing. <code>first=\"upcoming\"<\/code> (the default) or <code>first=\"ongoing\"<\/code> sets which comes first, and the first heading adds no space above itself, so the page editor controls it.<\/li>\n<li>New: a Shortcode Generator under Bulletin Library &gt; Shortcodes builds any of the plugin's shortcodes from a few choices, in the same shape as the Sermon Library and Visitor Card generators.<\/li>\n<li>Fixed: in a row of announcement cards, a card shorter than its neighbour stretched its image area, leaving a tinted gap between the image and the text. On Elementor pages, an image wider than 16:9 no longer falls short of its frame.<\/li>\n<li>Announcement card images use the large size and keep their srcset, which escaping used to strip, so they stay sharp on high-resolution screens instead of being stretched from the 300px medium size.<\/li>\n<li>Fixed: the Expired filter on the Announcements list also listed ongoing announcements.<\/li>\n<li>Fixed: announcement and program descriptions in the service editor showed raw HTML tags. They now read as plain text there, and the service page keeps its formatting.<\/li>\n<li>Programs on the service page have a little more room between them, and the archive intro paragraph uses the full content width.<\/li>\n<li>Fixed: <code>[scbl_next_service]<\/code> works out which service is next in the site's timezone, so this Sunday's service no longer gives way to next week's in the afternoon.<\/li>\n<\/ul>\n\n<h4>3.7.0<\/h4>\n\n<ul>\n<li>Every setting the shared Seedcast library stores was renamed to a longer, more distinctive prefix, so it cannot collide with another plugin that happened to pick the same short one. Your church details, service times, theme and spam settings are carried across automatically the first time the plugin loads; nothing needs re-entering.<\/li>\n<li>Service page sections and the sidebar are now escaped against an allow list on the way out, instead of being printed as-is. Visitor Card forms and share icons are unaffected: the list admits the form fields and icons the suite actually uses, and removes scripts and event handlers.<\/li>\n<li>Submitted form values are cleaned once, in a single place, before any plugin sees them. A value containing a backslash is no longer damaged on its way into the database.<\/li>\n<li>The church details published for search engines can no longer be broken by a stray tag in a setting.<\/li>\n<\/ul>\n\n<h4>3.6.4<\/h4>\n\n<ul>\n<li>Program handouts strip no longer stretches with empty tan space. Reworked so the <code>.scbl-program__inner<\/code> area grows (<code>flex: 1<\/code>), pushing the handouts strip down to the bottom of the card as a compact block that hugs its content.<\/li>\n<\/ul>\n\n<h4>3.6.3<\/h4>\n\n<ul>\n<li>Program handouts strip now anchors to the bottom of taller cards in a row (<code>flex: auto<\/code> on <code>.scbl-program__handouts<\/code>).<\/li>\n<\/ul>\n\n<h4>3.6.2<\/h4>\n\n<ul>\n<li>Program body preserves HTML. Save switched from <code>sanitize_textarea_field<\/code> (which stripped tags) to <code>wp_kses_post<\/code>.<\/li>\n<li>Persistent \"The program has changed\" notice fixed. <code>source_has_changed<\/code> now normalises both sides through <code>wp_kses_post<\/code> so legacy stripped copies re-sync on the first Update click.<\/li>\n<li>Program body renders in a <code>&lt;div&gt;<\/code> wrapper with <code>wpautop<\/code> and <code>do_shortcode<\/code>, so paragraphs and shortcodes both work.<\/li>\n<\/ul>\n\n<h4>3.6.1<\/h4>\n\n<ul>\n<li>Handouts styling: bold \"Handouts:\" label on its own line, pill-shaped download buttons with accent hover, light-background footer (<code>--sc-color-bg-subtle<\/code>) with a top border, wrap for multiple handouts.<\/li>\n<\/ul>\n\n<h4>3.6.0<\/h4>\n\n<ul>\n<li>Switched service description back to the standard WordPress <code>post_content<\/code> field with its normal editor. Restored <code>'editor'<\/code> support on the Service CPT and removed the custom Service Update metabox.<\/li>\n<li>Description renders below the featured image\/video via <code>the_content()<\/code>. Legacy services stored to <code>_scbl_service_description<\/code> meta fall back automatically.<\/li>\n<li>Orphan handouts (no linked Program on this service) now render in a standalone \"Handouts\" section under Today's Programs.<\/li>\n<\/ul>\n\n<h4>3.5.9<\/h4>\n\n<ul>\n<li>Fixed persistent \"The announcement has changed\" notice. Save was storing the submitted (duplicate) image ID as <code>image_source_id<\/code>; now stores the correctly computed value so <code>source_has_changed<\/code> reports true only when the source has actually diverged.<\/li>\n<li>Restored metabox handle-actions (Move up \/ Move down \/ Show or hide panel) on Bulletin Library CPT screens.<\/li>\n<\/ul>\n\n<h4>3.5.8<\/h4>\n\n<ul>\n<li>Added <code>scbl_service_description<\/code> to the default metabox order so Today's Handouts renders in its intended position.<\/li>\n<li>Stronger defensive CSS for wp_editor when sites strip parts of wp-admin.css.<\/li>\n<\/ul>\n\n<h4>3.5.7<\/h4>\n\n<ul>\n<li>Reverted Handouts save handler to the pre-3.5.4 behaviour that was known to work in the field.<\/li>\n<\/ul>\n\n<h4>3.5.4 - 3.5.6<\/h4>\n\n<ul>\n<li>JS enqueue improvements (media-editor dependency, robust row builder), plain-textarea test for description rendering, various visual and copy fixes.<\/li>\n<\/ul>\n\n<h4>3.5.3<\/h4>\n\n<ul>\n<li>Fixed dead \"Choose image\" button on Bulletin Settings (settings-page JS enqueue guard was too tight).<\/li>\n<li>\"Browse Services\" restyled as a pill button matching Copy Link; renamed to \"Browse Weekly Services\" in 3.5.6.<\/li>\n<li>Defensive admin CSS scoped to Bulletin Library post types.<\/li>\n<\/ul>\n\n<h4>3.5.0 - 3.5.2<\/h4>\n\n<ul>\n<li>Plugin Check pass: prefixed all template globals with <code>scbl_<\/code>. Rebrand to Seedcast Bulletin Library.<\/li>\n<li>SEO\/AEO schema enrichment: <code>datePublished<\/code>, <code>dateModified<\/code>, nested <code>VideoObject<\/code>, <code>subEvent<\/code> list built from Programs.<\/li>\n<li>Accessibility pass: removed redundant <code>role=\"main\"<\/code>, full ARIA combobox for contact autocomplete.<\/li>\n<li>Migrated 93 inline <code>style=<\/code> attributes to <code>assets\/css\/scbl-admin.css<\/code>. Removed duplicate\/unused CSS rules.<\/li>\n<li>Query efficiency: cache priming (<code>update_meta_cache<\/code>, <code>_prime_post_caches<\/code>) on program and announcement suggestion queries.<\/li>\n<li>Security scan clean: all save handlers verified (nonce + capability + per-field sanitisation).<\/li>\n<li>Assorted bug fixes: announcement featured image save, image change detection on copies, JS notice selector after inline-style migration.<\/li>\n<\/ul>\n\n<h4>3.4.0 - 3.4.3<\/h4>\n\n<ul>\n<li>Description meta field separated from <code>post_content<\/code> (later reverted in 3.6.0 - see above).<\/li>\n<li>Visitor Card sidebar integration via the <code>scbl_service_sidebar_end<\/code> action.<\/li>\n<li>Sidebar column width tuning.<\/li>\n<\/ul>\n\n<h4>3.3.x<\/h4>\n\n<ul>\n<li>Announcement, Program, and Handout copy system introduced. Copies freeze when a service is saved; source-diverged copies show an Update prompt.<\/li>\n<\/ul>\n\n<h4>3.0.0<\/h4>\n\n<ul>\n<li>Initial rebrand from Living Bulletin to Seedcast Bulletin Library. Namespace, constants, post types, meta keys, options, admin menu, filters, CSS classes, JS filenames, template folder, and text domain all renamed.<\/li>\n<\/ul>","raw_excerpt":"A dated bulletin page for every Sunday: programs, announcements, handouts and sermons, gathered in one place and kept forever.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/348366","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=348366"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/seedcast"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=348366"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=348366"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=348366"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=348366"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=348366"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=348366"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}