{"id":308513,"date":"2026-05-11T15:33:09","date_gmt":"2026-05-11T15:33:09","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/sermon-importer-archive-youtube-church-sermons-live-stream-detection\/"},"modified":"2026-05-13T20:18:29","modified_gmt":"2026-05-13T20:18:29","slug":"servantly-sermon-importer","status":"publish","type":"plugin","link":"https:\/\/sk.wordpress.org\/plugins\/servantly-sermon-importer\/","author":23406156,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"2.0.3","stable_tag":"2.0.3","tested":"6.9.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Servantly Sermon Archive with YouTube Import and Live Detection","header_author":"WhoKnew.io","header_description":"Pulls videos from the YouTube channel you connect (any church or ministry) and imports them as standard WordPress posts in the Sermons category, with custom taxonomies compatible with Search & Filter.","assets_banners_color":"999999","last_updated":"2026-05-13 20:18:29","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/servantly.org","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":103,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.0.0":{"tag":"2.0.0","author":"whoknewio","date":"2026-05-12 01:17:45"},"2.0.1":{"tag":"2.0.1","author":"whoknewio","date":"2026-05-12 02:19:42"},"2.0.2":{"tag":"2.0.2","author":"whoknewio","date":"2026-05-13 00:57:15"},"2.0.3":{"tag":"2.0.3","author":"whoknewio","date":"2026-05-13 20:18:29"}},"upgrade_notice":{"2.0.3":"<p>All archive page labels are now fully customizable in Settings. Recommended for anyone using the plugin for non-sermon content.<\/p>","2.0.2":"<p>Fixes the Resources button display and toggle on the Manage Sermons screen.<\/p>","2.0.1":"<p>Fixes duplicate taxonomy terms (e.g. same speaker appearing twice in filters). Upgrade recommended.<\/p>","2.0.0":"<p>Initial public release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3528884,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3528884,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3528884,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3528958,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3528954,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.0.0","2.0.1","2.0.2","2.0.3"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Sermon archive with filterable library by speaker, book, and series","2":"Watch Online page with live stream detection active","3":"Admin sermon management with inline editing","4":"Service times configuration","5":"Auto-import settings with scheduling controls","6":"Homepage sermon hero shortcode output"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[6970,260370,17517,55657,1610],"plugin_category":[39,56],"plugin_contributors":[255706],"plugin_business_model":[],"class_list":["post-308513","plugin","type-plugin","status-publish","hentry","plugin_tags-church","plugin_tags-church-website","plugin_tags-sermon","plugin_tags-sermon-manager","plugin_tags-youtube","plugin_category-business","plugin_category-social-and-sharing","plugin_contributors-whoknewio","plugin_committers-whoknewio"],"banners":{"banner":"https:\/\/ps.w.org\/servantly-sermon-importer\/assets\/banner-772x250.png?rev=3528954","banner_2x":"https:\/\/ps.w.org\/servantly-sermon-importer\/assets\/banner-1544x500.png?rev=3528958","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/servantly-sermon-importer\/assets\/icon.svg?rev=3528884","icon":"https:\/\/ps.w.org\/servantly-sermon-importer\/assets\/icon.svg?rev=3528884","icon_2x":false,"generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Stop paying $40\u2013120\/month for sermon management platforms. Sermon Importer &amp; Archive does it all \u2014 free, self-hosted, inside WordPress.<\/strong><\/p>\n\n<p>Most church websites struggle with sermon archives. Either they pay for expensive third-party platforms, embed YouTube playlists that look unprofessional, or ask a volunteer to manually copy sermon details into WordPress every week. None of it works well. All of it takes time nobody has.<\/p>\n\n<p>Sermon Importer &amp; Archive connects your WordPress site directly to your church's YouTube channel and handles everything automatically \u2014 importing sermons as <strong>published posts<\/strong> in the <strong>Sermons<\/strong> category (<code>sermons<\/code> slug; the category is created if missing), organizing them by speaker, scripture, and series, and detecting when you go live so your website can show the stream in real time.<\/p>\n\n<h4>What It Does<\/h4>\n\n<p><strong>Automatic Sermon Import<\/strong>\nConnect your YouTube channel once. The plugin pulls videos from your channel\u2019s <strong>uploads playlist<\/strong> using <code>playlistItems.list<\/code> (not <code>search.list<\/code>), then creates WordPress posts with title, description, thumbnail, and publish date from YouTube. New sermons can appear on your site automatically \u2014 no manual entry, no copy-paste, no volunteer hours wasted.<\/p>\n\n<p><strong>Smart Title Parsing<\/strong>\nDesigned for real church naming conventions. The parser extracts sermon title, speaker name, scripture reference, Bible book, and series name from your video titles automatically. Other churches may need naming consistency or parser tuning over time.<\/p>\n\n<p><strong>Live Stream Detection<\/strong>\nWhen your service starts, your website can know. The live detector uses a <strong>two-request<\/strong> pattern (<code>playlistItems.list<\/code> + <code>videos.list<\/code>, <strong>up to 2 API quota units<\/strong> when the server actually refreshes live status from YouTube), only <strong>inside<\/strong> configurable windows around your <strong>Service Times<\/strong>. Outside those windows, <strong>no<\/strong> YouTube calls are made for live status (and cached answers may use <strong>0<\/strong> units). Results are cached in a transient (shorter TTL while live). The stream UI can switch when service ends \u2014 no volunteer flipping a switch.<\/p>\n\n<p><strong>Quota-Conscious YouTube API Design<\/strong>\nYour API quota is treated as a resource to steward. Imports use the uploads playlist pattern above; live checks avoid hammering the API and include guards such as <code>actualEndTime<\/code> so finished broadcasts are not mistaken for live. The REST <strong>live-status<\/strong> endpoint supports a rate-limited refresh and sends <code>Cache-Control: no-store<\/code> so CDNs and browsers do not cache stale \u201clive\u201d states.<\/p>\n\n<p><strong>Filterable Sermon Archive<\/strong>\nVisitors can filter your sermon library by speaker, Bible book, series, and year. The archive works with popular WordPress themes and search plugins out of the box.<\/p>\n\n<p><strong>Speaker, Book &amp; Series Taxonomies<\/strong>\nSermons are organized into custom taxonomies on the <strong>post<\/strong> type (<code>servantly_si_sermon_speaker<\/code>, <code>servantly_si_sermon_book<\/code>, <code>servantly_si_sermon_series<\/code>), REST-visible, with rewrite slugs <code>sermon-speaker<\/code>, <code>sermon-book<\/code>, <code>sermon-series<\/code>. <strong>Bulk &amp; titles<\/strong> merges duplicate terms and can optionally map YouTube titles split by a delimiter to sermon fields on import.<\/p>\n\n<p><strong>Curated Content Protection<\/strong>\nLock individual sermon posts to prevent auto-import from overwriting your manual edits. The importer skips creating duplicates when <code>sermon_video_id<\/code> already exists. Unlocked posts can be refreshed on re-import; <strong>locked<\/strong> posts (<code>_sermon_locked<\/code>) are not overwritten.<\/p>\n\n<p><strong>Service Times Configuration<\/strong>\nConfigure your recurring service times once. The plugin uses them to gate live detection, power the homepage countdown to next service, and give visitors accurate schedule context.<\/p>\n\n<p><strong>Homepage Sermon Hero<\/strong>\nThe <code>[servantly_latest_sermon]<\/code> shortcode outputs a sermon hero \u2014 latest sermon embed, countdown to next service, live detection, and a grid of recent messages. Optional shortcode attributes: <code>label<\/code> (eyebrow text), <code>sermons_url<\/code> (defaults to <code>home_url( '\/sermons\/' )<\/code> \u2014 your site\u2019s front URL plus the <code>\/sermons\/<\/code> path; override if your archive lives elsewhere).<\/p>\n\n<p><strong>Watch Online Page<\/strong>\nThe <code>[servantly_watch]<\/code> shortcode creates a Watch Online experience: live embed when streaming (with a LIVE treatment), otherwise latest sermon, plus a recent grid. Hero \u201cPlay Now\u201d and live links resolve to <strong>Settings \u2192 Watch online page URL<\/strong> when set, otherwise the most recently updated published page\/post that contains <code>[servantly_watch]<\/code>, otherwise <code>home_url( '\/watch\/' )<\/code>. Optional shortcode attribute <strong><code>watch_url<\/code><\/strong> on <code>[servantly_latest_sermon]<\/code> overrides per hero. Front-end JavaScript can swap the player without a full page reload when status changes.<\/p>\n\n<h4>Admin Screen (Sermon Importer)<\/h4>\n\n<p>The plugin adds a single admin menu, <strong>Sermon Importer<\/strong>, with tabs (not separate submenus):<\/p>\n\n<ul>\n<li><strong>Manage Sermons<\/strong> \u2014 Paginated list, inline editing, media-library thumbnails, lock\/unlock, AJAX save.<\/li>\n<li><strong>Import<\/strong> \u2014 Manual <strong>Import latest<\/strong> vs <strong>Import full channel<\/strong>; on-screen quota notes; warns with a link to <strong>Settings<\/strong> if the key or channel ID is missing.<\/li>\n<li><strong>Auto-Import<\/strong> \u2014 WP-Cron runs <strong>hourly<\/strong>. When the current <strong>weekday and hour<\/strong> match slots you configure (up to <strong>two distinct hours per day<\/strong>), a <strong>recent-only<\/strong> import runs and a summary is stored for the tab.<\/li>\n<li><strong>Service Times<\/strong> \u2014 Recurring times for live-detection windows and countdown context.<\/li>\n<li><strong>Settings<\/strong> \u2014 YouTube API key, channel ID, <strong>comments policy<\/strong> (default: leave WordPress unchanged; optional sermon-only or sitewide), sermon page styling, scripture links to Bible.com, hero label, optional <strong>Watch online page URL<\/strong> (hero \/ live links), speaker options.<\/li>\n<li><strong>Bulk &amp; titles<\/strong> \u2014 Merge duplicate taxonomy terms; optional delimiter-based <strong>YouTube title \u2192 fields<\/strong> mapping for imports (with live preview).<\/li>\n<li><strong>API log<\/strong> \u2014 Recent failures with HTTP codes, messages, and pretty-printed JSON bodies (API keys redacted in storage).<\/li>\n<li><strong>Protect Your Church<\/strong> tab \u2014 omitted when <strong>WhoKnew Shield Pro<\/strong> is active with a valid or grace-period license (no upsell noise for existing customers).<\/li>\n<\/ul>\n\n<h4>Front End: Template &amp; Shortcodes<\/h4>\n\n<ul>\n<li><strong>Page template:<\/strong> In the block or classic editor, choose the <strong>Sermon Archive<\/strong> template (<code>page-sermons.php<\/code> supplied by the plugin) for the page that should render the full archive experience.<\/li>\n<li><strong>Shortcodes:<\/strong> <code>[servantly_latest_sermon]<\/code> and <code>[servantly_watch]<\/code> as described above. Styles and scripts live under the plugin\u2019s <code>assets\/<\/code> directory.<\/li>\n<\/ul>\n\n<h4>REST API<\/h4>\n\n<p>Read-only routes under the namespace <code>servantly-si\/v1<\/code> (public by design for the archive and watch UI):<\/p>\n\n<ul>\n<li><code>GET \/wp-json\/servantly-si\/v1\/sermons<\/code> \u2014 Paginated sermons with query args such as <code>speaker<\/code>, <code>book<\/code>, <code>series<\/code>, <code>year<\/code>, <code>sort<\/code>, <code>page<\/code>.<\/li>\n<li><code>GET \/wp-json\/servantly-si\/v1\/filters<\/code> \u2014 Filter option payloads for the UI.<\/li>\n<li><code>GET \/wp-json\/servantly-si\/v1\/live-status<\/code> \u2014 Live\/offline payload; optional <code>refresh<\/code> respects a short server-side cooldown.<\/li>\n<\/ul>\n\n<p>Live-status responses use <code>Cache-Control: no-store<\/code> so caching layers do not serve stale live states.<\/p>\n\n<h4>Caching Plugin Compatibility<\/h4>\n\n<p>When auto-import runs via WP-Cron and creates new sermon posts, the plugin automatically purges the page cache across all major caching plugins and hosting environments \u2014 but only when new posts are actually created (imports that find nothing new never touch the cache).<\/p>\n\n<p><strong>Supported out of the box (no configuration needed):<\/strong><\/p>\n\n<ul>\n<li>SiteGround Speed Optimizer<\/li>\n<li>WP Rocket<\/li>\n<li>LiteSpeed Cache<\/li>\n<li>W3 Total Cache<\/li>\n<li>WP Super Cache<\/li>\n<li>WP Fastest Cache<\/li>\n<li>Autoptimize<\/li>\n<li>Breeze (Cloudways)<\/li>\n<li>Hummingbird (WPMU Dev)<\/li>\n<li>Cachify<\/li>\n<li>Comet Cache \/ ZenCache<\/li>\n<li>Swift Performance Lite &amp; Pro<\/li>\n<li>Kinsta MU Cache<\/li>\n<li>Nginx Helper<\/li>\n<\/ul>\n\n<p>If you use a caching plugin not listed here, hook into the <code>servantly_si_after_cache_purge<\/code> action to add your own purge call:<\/p>\n\n<pre><code>add_action( 'servantly_si_after_cache_purge', 'my_custom_cache_purge' );\n<\/code><\/pre>\n\n<h4>Comments &amp; Pings<\/h4>\n\n<p><strong>Configurable.<\/strong> Under <strong>Sermon Importer \u2192 Settings \u2192 Comments &amp; discussions<\/strong>, choose whether WordPress should leave comments alone (<strong>default<\/strong>), disable them <strong>only on sermon posts<\/strong> (posts in the <strong>Sermons<\/strong> category or with a stored YouTube <code>sermon_video_id<\/code>), or disable them <strong>sitewide<\/strong> (and hide the Comments admin menu \/ admin bar node \u2014 the original single-purpose church behavior). No option deletes existing comment rows; sitewide or sermon-only modes simply prevent new comments\/pings where applied.<\/p>\n\n<h4>Customizing for Another Church<\/h4>\n\n<p>Functionally you need your own <strong>YouTube channel ID<\/strong>, <strong>API key<\/strong>, and <strong>service times<\/strong>. Shortcode names use the original plugin slug for backward compatibility; title parsing is tuned for common church patterns \u2014 adjust YouTube titles or extend parsing if your naming differs.<\/p>\n\n<h4>Who This Is For<\/h4>\n\n<p>Any church or ministry that:\n* Publishes sermons to YouTube\n* Wants a professional sermon archive on their WordPress site\n* Streams live services on YouTube\n* Is tired of paying monthly fees for sermon management platforms\n* Has a volunteer managing the website who needs something that runs itself<\/p>\n\n<h4>See It Live<\/h4>\n\n<p>Built for and running at <a href=\"https:\/\/calvarycla.org\/\">Calvary Chapel Lake Arrowhead<\/a>:<\/p>\n\n<ul>\n<li><a href=\"https:\/\/calvarycla.org\/sermons\/\">Sermon archive<\/a> \u2014 filterable teaching library by speaker, book, series, and year<\/li>\n<li><a href=\"https:\/\/calvarycla.org\/watch\/\">Watch Online page<\/a> \u2014 live stream detection with recent sermon grid<\/li>\n<li>Homepage sermon hero \u2014 powered by the <code>[servantly_latest_sermon]<\/code> shortcode<\/li>\n<\/ul>\n\n<h4>Free. Forever.<\/h4>\n\n<p>This plugin was built for our own church and given to the broader church and ministry community at no cost. <strong>There is no paid Pro version of Sermon Importer<\/strong>, no feature locks, and no upgrade wall for sermon or archive features. The admin may include an optional <strong>Protect Your Church<\/strong> tab pointing to WhoKnew Shield (that tab <strong>hides automatically<\/strong> when <strong>WhoKnew Shield Pro<\/strong> is active with a valid or grace-period license). If it helps your church, that is enough.<\/p>\n\n<h4>Development<\/h4>\n\n<p>Coding standard configuration: <code>phpcs.xml.dist<\/code> in the plugin root (next to <code>servantly-sermon-importer.php<\/code>) in <strong>source control<\/strong> \u2014 it is omitted from distribution ZIPs built for upload. With <a href=\"https:\/\/github.com\/PHPCSStandards\/PHP_CodeSniffer\">PHP_CodeSniffer<\/a> available in your environment, from a checkout of that directory run <code>phpcs<\/code> (or <code>phpcs --standard=phpcs.xml.dist<\/code>).<\/p>\n\n<h4>Also Recommended<\/h4>\n\n<p><strong>Protect your church website's contact information.<\/strong> Staff email addresses, office phone numbers, and your building's physical address are harvested by spam bots every day \u2014 the same bots that enable phishing attacks, robocalls, and junk mail. <a href=\"https:\/\/wordpress.org\/plugins\/whoknew-shield\/\">WhoKnew Shield\u2122<\/a> protects all of it automatically, with zero configuration. Free version available.<\/p>\n\n<h4>More Free Tools for Nonprofits &amp; Ministries<\/h4>\n\n<p>This plugin is part of the <strong>Servantly<\/strong> suite \u2014 free, open-source WordPress plugins built for nonprofit organizations and ministries. For more information and additional free software, visit <a href=\"https:\/\/servantly.org\">servantly.org<\/a>.<\/p>\n\n<h4>Credits<\/h4>\n\n<p><strong>WhoKnew.io<\/strong> \u2014 <a href=\"https:\/\/whoknew.io\">whoknew.io<\/a><\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects to the following third-party services. Your WordPress server makes these requests \u2014 not your visitors' browsers, except for embedded iframes and scripture links noted below.<\/p>\n\n<h4>YouTube Data API v3 (Google LLC)<\/h4>\n\n<p><strong>What it is:<\/strong> Google's YouTube Data API, used to retrieve sermon videos from your connected YouTube channel.<\/p>\n\n<p><strong>What data is sent and when:<\/strong><\/p>\n\n<ul>\n<li>Your YouTube channel ID and API key are sent to Google's servers each time the plugin fetches your uploads playlist (<code>playlistItems.list<\/code>), checks for an active live stream (<code>videos.list<\/code>), or resolves a non-standard channel ID to its uploads playlist (<code>channels.list<\/code>). These requests originate from your WordPress server.<\/li>\n<li>Live-stream checks only occur during configurable windows around your saved <strong>Service Times<\/strong> \u2014 no YouTube API requests are made outside those windows.<\/li>\n<li>Sermon data returned by the API (titles, descriptions, thumbnails, publish dates, video IDs) is stored in your WordPress database.<\/li>\n<\/ul>\n\n<p><strong>YouTube embed iframes:<\/strong> The Watch Online page and single sermon pages display YouTube video players via <code>youtube.com\/embed\/\u2026<\/code> iframes. These load in the visitor's browser and are governed by YouTube's own cookie, tracking, and autoplay policies.<\/p>\n\n<ul>\n<li><a href=\"https:\/\/www.youtube.com\/t\/terms\">YouTube Terms of Service<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/youtube\/terms\/api-services-terms-of-service\">YouTube API Services Terms of Service<\/a><\/li>\n<li><a href=\"https:\/\/policies.google.com\/privacy\">Google Privacy Policy<\/a><\/li>\n<\/ul>\n\n<h4>Bible.com (YouVersion \/ Life.Church)<\/h4>\n\n<p><strong>What it is:<\/strong> An optional feature. When <strong>Scripture Links<\/strong> is enabled in Settings, displayed scripture references become clickable links that open the corresponding passage on Bible.com in a new tab. No data is sent to Bible.com by your server; the link simply directs the visitor's browser to the passage URL.<\/p>\n\n<ul>\n<li><a href=\"https:\/\/www.bible.com\/terms\">Bible.com Terms of Service<\/a><\/li>\n<li><a href=\"https:\/\/www.bible.com\/privacy\">Bible.com Privacy Policy<\/a><\/li>\n<\/ul>\n\n<h4>WhoKnew\u2122 (plugin author)<\/h4>\n\n<p>This plugin does <strong>not<\/strong> send any data to WhoKnew.io servers. The optional <strong>Protect Your Church<\/strong> admin tab contains static promotional links only.<\/p>\n\n<ul>\n<li><a href=\"https:\/\/whoknew.io\/terms\/\">WhoKnew\u2122 Terms of Service<\/a><\/li>\n<li><a href=\"https:\/\/whoknew.io\/privacy\/\">WhoKnew\u2122 Privacy Policy<\/a><\/li>\n<\/ul>\n\n<!--section=installation-->\n<p><strong>Setup takes about five minutes.<\/strong> After you activate the plugin, open <strong>Sermon Importer \u2192 Settings<\/strong>. The admin screen walks you through <strong>API Key<\/strong> and <strong>Channel ID<\/strong> in order, with <strong>the same direct links<\/strong> to Google Cloud Console (project, enable <strong>YouTube Data API v3<\/strong>, create an <strong>API key<\/strong>), Google\u2019s API overview, <strong>YouTube Studio<\/strong>, and Google\u2019s official Channel ID help. You should not have to guess which Google screen to use or whether you need OAuth.<\/p>\n\n<ol>\n<li>Upload the <strong><code>servantly-sermon-importer<\/code><\/strong> folder (the one that contains <code>servantly-sermon-importer.php<\/code> alongside <code>readme.txt<\/code>, <code>includes\/<\/code>, <code>assets\/<\/code>, etc.) to <code>\/wp-content\/plugins\/<\/code>. If a ZIP wraps that folder in an extra parent directory, use the inner folder that contains the main plugin PHP file.<\/li>\n<li>Activate the plugin under <strong>Plugins<\/strong> (look for <strong>Servantly Sermon Archive<\/strong> in the list).<\/li>\n<li>Open <strong>Sermon Importer \u2192 Settings<\/strong>. Paste your <strong>YouTube Data API v3<\/strong> key and <strong>Channel ID<\/strong> using the on-screen explanations and links. Under <strong>Comments &amp; discussions<\/strong>, leave the default (<strong>do not change comments<\/strong>) unless you want sermon-only or sitewide closure \u2014 then <strong>Save<\/strong>. Use a plain <strong>API key<\/strong> \u2014 not an OAuth \u201cWeb application\u201d client. Restrict <strong>APIs<\/strong> to <strong>YouTube Data API v3<\/strong> only; leave <strong>Application restrictions<\/strong> on <strong>None<\/strong> until imports and live checks work, then optionally use <strong>IP addresses<\/strong> if your host provides a stable outbound IP. Avoid <strong>HTTP referrers<\/strong> \u2014 WordPress calls YouTube from your <strong>server<\/strong>, not from visitors\u2019 browsers, so referrer rules usually break everything.<\/li>\n<li>Open <strong>Service Times<\/strong> and add the recurring times you stream or meet. Live detection only calls YouTube <strong>during windows<\/strong> around these times (see FAQ), which keeps day-to-day quota use low.<\/li>\n<li>Open <strong>Import<\/strong>. If the key or channel ID is missing, the tab shows a warning with a <strong>link back to Settings<\/strong>. Run <strong>Import latest<\/strong> for a small first test, or <strong>Import full channel<\/strong> when you are ready to backfill history (see FAQ for quota).<\/li>\n<li>Create or edit pages: assign the <strong>Sermon Archive<\/strong> template where needed. <strong><code>sermons_url<\/code><\/strong> on the hero defaults to <code>home_url( '\/sermons\/' )<\/code> unless overridden. Put <code>[servantly_watch]<\/code> on your Watch page (any slug); the hero finds it automatically, or set <strong>Watch online page URL<\/strong> in Settings. Add <code>[servantly_latest_sermon]<\/code> on your homepage (or any hero page).<\/li>\n<\/ol>\n\n<h4>Getting a YouTube API Key (same links as in Settings)<\/h4>\n\n<p>If you prefer this readme over the admin screen, follow the same path:<\/p>\n\n<ol>\n<li><a href=\"https:\/\/console.cloud.google.com\/\">Google Cloud Console<\/a> \u2014 pick or create a project.<\/li>\n<li>Enable <a href=\"https:\/\/console.cloud.google.com\/apis\/library\/youtube.googleapis.com\">YouTube Data API v3<\/a>.<\/li>\n<li><a href=\"https:\/\/console.cloud.google.com\/apis\/credentials\">Credentials<\/a> \u2192 <strong>Create credentials<\/strong> \u2192 <strong>API key<\/strong> (not OAuth \/ not \u201cWeb application\u201d).<\/li>\n<li>Optional context: <a href=\"https:\/\/developers.google.com\/youtube\/v3\/getting-started\">YouTube Data API overview<\/a>.<\/li>\n<li><strong>Edit<\/strong> the key \u2192 <strong>API restrictions<\/strong> \u2192 <strong>Restrict key<\/strong> \u2192 only <strong>YouTube Data API v3<\/strong>. <strong>Application restrictions<\/strong> \u2192 <strong>None<\/strong> first; then optionally <strong>IP addresses<\/strong>. Avoid <strong>HTTP referrers<\/strong> for server-side calls.<\/li>\n<li>Paste the key into <strong>Sermon Importer \u2192 Settings<\/strong> and save.<\/li>\n<\/ol>\n\n<h4>Finding Your Channel ID (same steps as in Settings)<\/h4>\n\n<p>Your <strong>channel ID<\/strong> is almost always <strong>24 characters<\/strong>: <strong>UC<\/strong> plus <strong>22<\/strong> more letters and numbers (no spaces). For standard <strong>UC\u2026<\/strong> IDs, the plugin derives your hidden <strong>uploads playlist<\/strong> ID without an extra <code>channels.list<\/code> call.<\/p>\n\n<ol>\n<li><a href=\"https:\/\/studio.youtube.com\/\">YouTube Studio<\/a> while signed in as the account that owns the church channel.<\/li>\n<li><strong>Settings<\/strong> (gear) in the left sidebar \u2192 <strong>Channel<\/strong> \u2192 <strong>Advanced settings<\/strong>.<\/li>\n<li>Copy <strong>Channel ID<\/strong> (full string starting with <strong>UC<\/strong>).<\/li>\n<\/ol>\n\n<p>Official help: <a href=\"https:\/\/support.google.com\/youtube\/answer\/3250431\">Find your YouTube user &amp; channel IDs<\/a> (includes <strong>youtube.com\/account_advanced<\/strong>).<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"can%20i%20see%20a%20live%20example%3F\"><h3>Can I see a live example?<\/h3><\/dt>\n<dd><p>Yes. The plugin is running at <a href=\"https:\/\/calvarycla.org\/\">Calvary Chapel Lake Arrowhead<\/a>. See the <a href=\"https:\/\/calvarycla.org\/sermons\/\">sermon archive<\/a>, the <a href=\"https:\/\/calvarycla.org\/watch\/\">Watch Online page<\/a>, and the homepage sermon hero shortcode in action.<\/p><\/dd>\n<dt id=\"what%20type%20of%20google%20credential%20do%20i%20need%3F\"><h3>What type of Google credential do I need?<\/h3><\/dt>\n<dd><p>A <strong>YouTube Data API v3 API key<\/strong> created in Google Cloud <strong>Credentials<\/strong> (<strong>Create credentials \u2192 API key<\/strong>). You do <strong>not<\/strong> need OAuth, a \u201cWeb application\u201d client ID, or a Google Sign-In flow \u2014 those are for a different kind of integration. Restrict the key to <strong>YouTube Data API v3<\/strong> under API restrictions; see Installation for application restrictions (avoid HTTP referrers).<\/p><\/dd>\n<dt id=\"how%20do%20i%20find%20my%20channel%20id%3F\"><h3>How do I find my Channel ID?<\/h3><\/dt>\n<dd><p>It is almost always <strong>UC<\/strong> plus <strong>22<\/strong> more characters (<strong>24<\/strong> total), no spaces. In <a href=\"https:\/\/studio.youtube.com\/\">YouTube Studio<\/a>: <strong>Settings \u2192 Channel \u2192 Advanced settings \u2192 Channel ID<\/strong>. Google\u2019s help: <a href=\"https:\/\/support.google.com\/youtube\/answer\/3250431\">Find your YouTube user &amp; channel IDs<\/a>.<\/p><\/dd>\n<dt id=\"what%20is%20the%20difference%20between%20latest%20import%20and%20full%20import%3F\"><h3>What is the difference between Latest import and Full import?<\/h3><\/dt>\n<dd><p><strong>Import latest<\/strong> (and <strong>Auto-Import<\/strong>) only fetch the <strong>newest batch<\/strong> of videos from your uploads playlist \u2014 the same cap shown on the Import tab \u2014 so routine updates stay fast and light on quota. <strong>Import full channel<\/strong> walks the <strong>entire<\/strong> uploads playlist from newest to oldest until the end, which is ideal for a <strong>first-time backfill<\/strong> but uses more quota because YouTube charges <strong>one quota unit per playlist page<\/strong> (up to <strong>50 videos<\/strong> per page). Standard <strong>UC\u2026<\/strong> channel IDs also avoid an extra <code>channels.list<\/code> call when resolving the uploads playlist.<\/p><\/dd>\n<dt id=\"how%20much%20youtube%20api%20quota%20does%20this%20plugin%20use%3F%20do%20i%20need%20to%20worry%20about%2010%2C000%3F\"><h3>How much YouTube API quota does this plugin use? Do I need to worry about 10,000?<\/h3><\/dt>\n<dd><p>Google\u2019s default free quota for the YouTube Data API is <strong>10,000 units per day<\/strong> per project (Google may change policy; check your Cloud Console <strong>Quotas<\/strong> page). <strong>Units are not \u201csermons\u201d<\/strong> \u2014 each <code>playlistItems.list<\/code> or <code>videos.list<\/code> request typically costs <strong>1 unit<\/strong>; <code>channels.list<\/code> is <strong>1 unit<\/strong> when needed (non-standard channel IDs).<\/p>\n\n<p><strong>Imports:<\/strong> roughly <strong>1 unit per 50 videos<\/strong> listed from the uploads playlist (each API page). A <strong>latest<\/strong> run only pulls a capped number of recent videos. <strong>Auto-Import<\/strong> uses that same recent-only scope on your schedule.<\/p>\n\n<p><strong>Live detection:<\/strong> when the site actually hits YouTube during a <strong>service-time window<\/strong>, one refresh uses <strong>playlistItems<\/strong> + <strong>videos.list<\/strong> = <strong>up to 2 units<\/strong>. Outside those windows the plugin does <strong>not<\/strong> poll YouTube for live status; cached responses may use <strong>0<\/strong> additional units.<\/p>\n\n<p>For a typical church schedule, <strong>10,000 units\/day is plenty<\/strong> if you use <strong>latest<\/strong> imports day-to-day and only run <strong>full<\/strong> when you mean to. If something spikes (quota errors, <code>quotaExceeded<\/code> in JSON), open <strong>Sermon Importer \u2192 API log<\/strong> to see the exact reason.<\/p><\/dd>\n<dt id=\"why%20does%20live%20detection%20only%20work%20sometimes%3F\"><h3>Why does live detection only work sometimes?<\/h3><\/dt>\n<dd><p><strong>By design.<\/strong> Live status is only checked <strong>during windows<\/strong> built from your <strong>Service Times<\/strong> (before start, during expected length, and a few minutes after). Outside those windows the site does not call YouTube for live checks \u2014 that saves quota and avoids pointless API traffic. The Watch UI still works; it simply will not \u201cdiscover\u201d live until a window is active (or a cached live state is still valid).<\/p><\/dd>\n<dt id=\"what%20does%20the%20api%20log%20tab%20show%3F\"><h3>What does the API log tab show?<\/h3><\/dt>\n<dd><p>Recent <strong>failures<\/strong> from the YouTube Data API and related import steps: <strong>time<\/strong>, <strong>HTTP status<\/strong>, <strong>context<\/strong> (e.g. which API method), <strong>error code<\/strong>, a <strong>human-readable message<\/strong>, and an expandable <strong>JSON response body<\/strong> when available so you can read Google\u2019s reasons (<strong>quotaExceeded<\/strong>, <strong>keyInvalid<\/strong>, etc.). <strong>API keys are redacted<\/strong> in stored text (<code>key=***<\/code>), so you can share a screenshot with support without leaking your secret.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20any%20youtube%20channel%3F\"><h3>Does this work with any YouTube channel?<\/h3><\/dt>\n<dd><p>Yes. Any church or ministry with a YouTube channel can use this plugin. It works with standard <strong>UC\u2026<\/strong> channel IDs and can resolve uploads playlist identifiers for the importer when the ID format needs a <code>channels.list<\/code> lookup.<\/p><\/dd>\n<dt id=\"will%20it%20import%20all%20our%20past%20sermons%3F\"><h3>Will it import all our past sermons?<\/h3><\/dt>\n<dd><p>Yes. Use <strong>Import full channel<\/strong> on the <strong>Import<\/strong> tab to scan your channel\u2019s entire uploads playlist. Depending on how many videos you have, the first run may take a while and will use more quota than day-to-day <strong>latest<\/strong> runs. After the backfill, use <strong>Auto-Import<\/strong> or <strong>Import latest<\/strong> for new uploads.<\/p><\/dd>\n<dt id=\"what%20does%20auto-import%20do%2C%20exactly%3F\"><h3>What does Auto-Import do, exactly?<\/h3><\/dt>\n<dd><p>WP-Cron runs <strong>once per hour<\/strong>. If auto-import is enabled and the current <strong>day and hour<\/strong> match your configured slots (up to <strong>two hours per day<\/strong>), the plugin runs a <strong>recent-only<\/strong> import (capped batch size), not a full historical rescan.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20we%20upload%20a%20non-sermon%20video%3F\"><h3>What happens if we upload a non-sermon video?<\/h3><\/dt>\n<dd><p>The title parser expects common sermon title patterns. Videos that do not match well still import as posts \u2014 you can lock or delete them from the <strong>Manage Sermons<\/strong> tab.<\/p><\/dd>\n<dt id=\"can%20we%20edit%20imported%20sermons%20without%20losing%20our%20changes%3F\"><h3>Can we edit imported sermons without losing our changes?<\/h3><\/dt>\n<dd><p>Yes. Lock any sermon post from the <strong>Manage Sermons<\/strong> tab. Locked posts are not overwritten by import. Unlocked posts can be refreshed when you re-import.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20our%20theme%3F\"><h3>Does it work with our theme?<\/h3><\/dt>\n<dd><p>The plugin targets compatibility with common WordPress themes (including Storefront, Divi, and many Elementor-built sites). For the archive layout, assign the <strong>Sermon Archive<\/strong> page template to your sermons page in the editor. Advanced users can still override via a child theme if needed.<\/p><\/dd>\n<dt id=\"what%20if%20we%20have%20duplicate%20speaker%20names%3F\"><h3>What if we have duplicate speaker names?<\/h3><\/dt>\n<dd><p>Use <strong>Sermon Importer \u2192 Bulk &amp; titles<\/strong> to merge duplicate taxonomy terms. On the same tab you can enable a <strong>custom title split<\/strong> (delimiter + part-to-field map) when your channel uses a consistent pattern different from the built-in parser.<\/p><\/dd>\n<dt id=\"is%20there%20a%20pro%20version%3F\"><h3>Is there a Pro version?<\/h3><\/dt>\n<dd><p>No paid <strong>Sermon Importer<\/strong> tier exists. This plugin is completely free for all sermon and archive features, with no feature locks. It was built for our church and given to the church community at no cost.<\/p><\/dd>\n<dt id=\"why%20are%20comments%20turned%20off%20everywhere%3F\"><h3>Why are comments turned off everywhere?<\/h3><\/dt>\n<dd><p>By default they are <strong>not<\/strong> \u2014 <strong>Sermon Importer \u2192 Settings \u2192 WordPress comments<\/strong> is set to <strong>\u201cDo not change comments.\u201d<\/strong> If you choose <strong>\u201cDisable sitewide,\u201d<\/strong> then comments and pings are closed everywhere while that option is saved (and the Comments screen is hidden). Pick <strong>\u201cSermon posts only\u201d<\/strong> if you want blog or page comments but not on imported sermons.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.0.3<\/h4>\n\n<ul>\n<li>Feature: All public-facing text on the archive page is now configurable via Settings \u2014 including the \"Load More\" button, \"All Sermons\" button, \"Sermon Details\" button, \"Most Recent Sermons\" heading, \"Teaching Library\" heading, sort option label, no-results message, and load error message. Enables use of the plugin for any content type beyond sermons.<\/li>\n<\/ul>\n\n<h4>2.0.2<\/h4>\n\n<ul>\n<li>Fix: Resources button arrow no longer overflows outside the button boundary on the Manage Sermons admin table.<\/li>\n<li>Fix: Resources expandable row now opens correctly when the toggle button is clicked.<\/li>\n<\/ul>\n\n<h4>2.0.1<\/h4>\n\n<ul>\n<li>Fix: resolve taxonomy terms by ID before assignment so WordPress never creates duplicate speaker\/book\/series terms when the object cache is cold after an import purge.<\/li>\n<li>Fix: add auto-merge duplicate terms utility to Bulk &amp; titles admin tab (Tool 3) \u2014 scans all three sermon taxonomies and one-click merges exact-name duplicates into the canonical term.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Initial public release.<\/li>\n<\/ul>","raw_excerpt":"YouTube sermon importer: posts, archive, live stream, speaker\/book\/series taxonomies\u2014Search &amp; Filter friendly. Free.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/308513","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=308513"}],"author":[{"embeddable":true,"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/whoknewio"}],"wp:attachment":[{"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=308513"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=308513"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=308513"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=308513"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=308513"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/sk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=308513"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}