Sermon Importer & Archive
Setup & FAQ
Answers below match how the free plugin works in WordPress. For bugs and one-off issues, use the WordPress.org support forums. Download: latest ZIP from WordPress.org.
YouTube API key
Where do I create the key?
In WordPress go to Sermon Importer → Settings. The plugin expects a Google Cloud API key with YouTube Data API v3 enabled — the same steps linked in the admin screen (Google Cloud Console → enable API → Credentials → Create API key).
Why not OAuth / “Web application”?
The plugin calls YouTube from your WordPress server, not from visitors’ browsers. Use a plain API key, not an OAuth client ID. OAuth is a different sign-in flow and is not what the API key field expects.
How should I restrict the key?
Under API restrictions, restrict the key to YouTube Data API v3 only. Under Application restrictions, start with None until everything works; then you may try IP addresses (your host’s outbound IP) if your host gives you a stable one. Avoid HTTP referrers for this plugin — server-side calls usually fail referrer locks.
Channel ID
What format is valid?
Almost always a single string starting with UC plus 22 more characters (24 characters total), no spaces — this is the channel ID YouTube shows for the channel, not the @handle URL.
Where do I find it in YouTube Studio?
Open YouTube Studio while signed into the account that owns the channel. Settings (gear) → Channel → Advanced settings → copy Channel ID (starts with UC). Google’s help also covers youtube.com/account_advanced for legacy paths.
Imports or live checks fail with “channel” errors
Double-check the ID is exactly the UC… value. Live diagnostics in Service Times may note when no probe has run if the ID does not look like UC….
Site time & timezone
Why does my countdown or live window feel “off”?
Service rows and live-check windows use the WordPress site timezone (same clock shown on the Service Times tab). If it looks wrong, set the correct city or offset under Settings → General in WordPress.
Service times & live windows
What are service times for?
Recurring rows (label, weekday, time) drive the countdown to next service in the hero shortcode and define when the site is allowed to ask YouTube whether you are live.
What are “minutes before”, “service length”, and “minutes after”?
Together they define a single window around each service: checks run from [start − before] through [start + service length + after]. Defaults in code are 15 min before, 90 min typical service, 30 min after (example: 9:30 start → roughly 9:15–11:30). Tune them so you are not polling YouTube 24/7 — outside these windows the plugin does not call YouTube for live status.
How much quota does a live check use?
When a fresh check hits YouTube inside a window, the detector uses a fixed pattern: playlistItems.list on the uploads playlist plus videos.list with live streaming details (documented in code as up to 2 quota units per refresh when the server actually calls the API). Cached responses reuse the transient and avoid extra calls until TTL expires.
Where can I see the computed windows?
Sermon Importer → Service Times includes a preview table “When YouTube live checks run” listing the next windows in site time. Warnings appear if before/after/service length look unusually tight.
Live status & cache
My site says offline but YouTube is live
You might be outside the configured live-check window, or reading a cached result. On Settings, use Clear Live Status Cache to force a re-check. Cache TTL is about one minute while live and two minutes when offline (to limit API churn).
What is “Last YouTube live probe”?
On Service Times, this shows the last time the server actually called YouTube during a window (cached page loads alone do not update it). Use it to confirm keys, channel ID, and API responses.
Manual import
“Import latest” vs “Import full channel”
Import latest only scans the newest videos (same cap as auto-import: 100 uploads in current code — good for routine updates and low quota use). Import full channel walks the entire uploads playlist page by page (heavier on quota; use for first-time backfills). Imports use the uploads playlist pattern, not search.list.
Why were sermons skipped?
Posts that already store the same YouTube video ID are skipped so you do not get duplicates. Individual posts can be locked in Manage Sermons so auto-import does not overwrite manual edits.
Import button does nothing / warns about Settings
Save a non-empty API key and Channel ID on the Settings tab first. The Import tab links back to Settings if either is missing.
Auto-import (WP-Cron)
How often does it run?
WordPress cron is scheduled hourly. A run only happens when the current weekday and hour match a slot you configured. Each successful run performs the same recent-only import as Import latest (newest 100 uploads).
Auto-import never fires on my host
Many hosts do not trigger WP-Cron until someone visits the site, or disable it entirely. If needed, configure a real system cron that hits wp-cron.php on an interval — standard WordPress guidance applies.
Archive, Watch, shortcodes
How do I show the sermon library?
Create a Page and set its template to Sermon Archive (block editor: Page sidebar → Template; classic: Page Attributes). That uses the plugin’s archive template.
Homepage hero
Add shortcode [calvary_latest_sermon]. Optional attributes: label (eyebrow text), sermons_url if your archive is not at /sermons/, and watch_url to override where “Play now” / live links go. If you omit watch_url, the plugin uses, in order: Sermon Importer → Settings → Watch online page URL (full URL when set) → the permalink of the most recently updated published page/post that contains [calvary_watch] → /watch/ on your site.
Watch / live page
Add [calvary_watch] on your Watch page. Set Watch online page URL in Settings if your Watch page is not auto-detected or you want an external URL. Hero and countdown scripts use the same resolution order as watch_url above so buttons and “live” links stay aligned.
REST API
Which routes exist?
Public read-only JSON under /wp-json/ccla-si/v1/: sermons (filters, pagination, sort), filters (filter payloads), and live-status. The live endpoint sends Cache-Control: no-store so CDNs do not cache stale “live” states.
What does ?refresh=1 on live-status do?
When allowed, it clears the short-lived server cache so the next request can hit YouTube again; a brief cooldown (about 45 seconds in code) limits abuse.
Speakers, books, series & bulk merge
Which taxonomies are created?
The plugin registers sermon_speaker, sermon_book, and sermon_series on normal posts, with REST exposure and rewrite slugs such as sermon-speaker, sermon-book, and sermon-series — useful with Search & Filter and similar tools.
Duplicate speaker or series names
Use Sermon Importer → Bulk & titles (merge tool) to merge duplicate taxonomy terms across many posts.
Other settings
Scripture links
You can enable linking scripture references on the front end (admin describes Bible.com-style URLs when enabled).
Colors & hero label
Choose a front-end palette (or custom colors) and set the homepage hero eyebrow label in Settings.
Speaker names & filter order
Options cover stripping common pastor prefixes on import and the order speakers appear in the teaching-library filter UI.
“Protect Your Church” tab
An optional tab may point to WhoKnew Shield. It is hidden when WhoKnew Shield Pro is active with a usable license state — so existing Shield customers are not upsold inside this plugin.
YouTube video titles
Parsing looks wrong for our church
By default the importer uses a built-in title parser tuned to common patterns (often Calvary-style layouts: title, scripture, speaker, series). If your channel uses a consistent delimiter between parts (pipe, comma, tab, etc.), open Sermon Importer → Bulk & titles, enable split each new YouTube title on a delimiter and assign fields, choose delimiter and how many segments (2–8), and map each segment to sermon title, scripture, speaker, series, bible book, or ignore. The tab includes a live preview. If the segment count does not match the title or any mapped segment is empty, the importer falls back to the built-in parser for that video. You can still standardize naming on YouTube for one-off odd titles.
Developers: adjust parsed fields on import
After delimiter mapping (if any) and the built-in parser run, parsed fields pass through the WordPress filter ccla_si_parsed_title so you can tweak results in code without forking the plugin.
Troubleshooting
Where do I see API errors?
Open Sermon Importer → API log for recent failures (HTTP status, messages, JSON bodies with secrets redacted in storage).
Advanced: filters
Developers can adjust live-window minutes via filters such as ccla_si_live_check_before_minutes (and the matching service/after filters) documented in the live detector code.
Comments & discussions
What does each option do?
Under Settings → Comments & discussions: Default leaves WordPress unchanged. You can optionally disable comments only on sermon posts (Sermons category or posts with a stored YouTube video ID), or sitewide (and hide some Comments UI in admin). No option deletes existing comments — it only affects whether new comments/pings are allowed where applied.