{"id":285384,"date":"2026-03-04T17:47:49","date_gmt":"2026-03-04T17:47:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/sdaweb-channels-for-youtube\/"},"modified":"2026-09-21T18:53:01","modified_gmt":"2026-09-21T18:53:01","slug":"sdaweb-channels-for-youtube","status":"publish","type":"plugin","link":"https:\/\/en-ca.wordpress.org\/plugins\/sdaweb-channels-for-youtube\/","author":23453481,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.5.20","stable_tag":"1.5.20","tested":"7.1.1","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"SDAweb Channels for YouTube","header_author":"SDAweb - Rune Stake Stavdal, Vinjar Romsvik, Christer Andvik","header_description":"Curate YouTube channels and display their videos on your site with grids, tabs, and lightbox playback.","assets_banners_color":"696969","last_updated":"2026-09-21 18:53:01","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/sdaweb.no","rating":0,"author_block_rating":0,"active_installs":30,"downloads":2738,"num_ratings":0,"support_threads":1,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.4.10":{"tag":"1.4.10","author":"rstake","date":"2026-03-05 17:34:33","revision":3475821},"1.4.11":{"tag":"1.4.11","author":"rstake","date":"2026-03-05 18:04:43","revision":3475839},"1.4.12":{"tag":"1.4.12","author":"rstake","date":"2026-03-07 23:32:27","revision":3477209},"1.4.13":{"tag":"1.4.13","author":"rstake","date":"2026-03-07 23:55:06","revision":3477211},"1.4.14":{"tag":"1.4.14","author":"rstake","date":"2026-03-08 00:04:18","revision":3477214},"1.4.15":{"tag":"1.4.15","author":"rstake","date":"2026-03-08 00:50:43","revision":3477222},"1.4.16":{"tag":"1.4.16","author":"rstake","date":"2026-03-08 12:11:42","revision":3477404},"1.4.17":{"tag":"1.4.17","author":"rstake","date":"2026-03-08 12:58:57","revision":3477411},"1.4.18":{"tag":"1.4.18","author":"rstake","date":"2026-03-08 13:47:51","revision":3477430},"1.4.19":{"tag":"1.4.19","author":"rstake","date":"2026-03-17 19:12:57","revision":3485055},"1.4.20":{"tag":"1.4.20","author":"rstake","date":"2026-03-19 19:42:26","revision":3486797},"1.4.24":{"tag":"1.4.24","author":"rstake","date":"2026-03-21 08:41:15","revision":3487663},"1.4.25":{"tag":"1.4.25","author":"rstake","date":"2026-03-21 08:45:54","revision":3487665},"1.4.26":{"tag":"1.4.26","author":"rstake","date":"2026-03-23 09:23:39","revision":3488760},"1.4.27":{"tag":"1.4.27","author":"rstake","date":"2026-03-23 11:08:04","revision":3488868},"1.4.28":{"tag":"1.4.28","author":"rstake","date":"2026-03-28 18:23:10","revision":3493508},"1.4.29":{"tag":"1.4.29","author":"rstake","date":"2026-04-03 16:13:01","revision":3498371},"1.4.34":{"tag":"1.4.34","author":"rstake","date":"2026-04-03 23:58:30","revision":3498533},"1.4.35":{"tag":"1.4.35","author":"rstake","date":"2026-04-04 08:04:25","revision":3498637},"1.4.36":{"tag":"1.4.36","author":"rstake","date":"2026-04-04 21:39:43","revision":3498923},"1.4.37":{"tag":"1.4.37","author":"rstake","date":"2026-04-05 22:54:55","revision":3499375},"1.4.38":{"tag":"1.4.38","author":"rstake","date":"2026-04-11 19:22:29","revision":3504122},"1.4.5":{"tag":"1.4.5","author":"rstake","date":"2026-03-04 17:47:24","revision":3474789},"1.4.6":{"tag":"1.4.6","author":"rstake","date":"2026-03-04 17:47:24","revision":3474789},"1.4.7":{"tag":"1.4.7","author":"rstake","date":"2026-03-04 17:47:24","revision":3474789},"1.4.8":{"tag":"1.4.8","author":"rstake","date":"2026-03-04 18:30:37","revision":3474854},"1.4.9":{"tag":"1.4.9","author":"rstake","date":"2026-03-05 16:55:57","revision":3475811},"1.5.0":{"tag":"1.5.0","author":"rstake","date":"2026-04-11 20:00:37","revision":3504128},"1.5.1":{"tag":"1.5.1","author":"rstake","date":"2026-04-11 22:12:07","revision":3504190},"1.5.10":{"tag":"1.5.10","author":"rstake","date":"2026-05-20 13:02:14","revision":3539332},"1.5.11":{"tag":"1.5.11","author":"rstake","date":"2026-05-23 14:31:32","revision":3545222},"1.5.12":{"tag":"1.5.12","author":"rstake","date":"2026-05-23 15:43:49","revision":3545287},"1.5.14":{"tag":"1.5.14","author":"rstake","date":"2026-07-18 14:30:52","revision":3612679},"1.5.15":{"tag":"1.5.15","author":"rstake","date":"2026-07-19 12:12:16","revision":3613547},"1.5.16":{"tag":"1.5.16","author":"rstake","date":"2026-09-01 08:35:21","revision":3675654},"1.5.17":{"tag":"1.5.17","author":"rstake","date":"2026-09-20 20:15:47","revision":3704591},"1.5.18":{"tag":"1.5.18","author":"rstake","date":"2026-09-20 20:25:09","revision":3704594},"1.5.19":{"tag":"1.5.19","author":"rstake","date":"2026-09-20 20:40:34","revision":3704601},"1.5.2":{"tag":"1.5.2","author":"rstake","date":"2026-04-18 16:53:14","revision":3509707},"1.5.20":{"tag":"1.5.20","author":"rstake","date":"2026-09-21 18:53:01","revision":3706172},"1.5.3":{"tag":"1.5.3","author":"rstake","date":"2026-04-18 18:43:24","revision":3509748},"1.5.4":{"tag":"1.5.4","author":"rstake","date":"2026-04-24 11:58:26","revision":3514611},"1.5.5":{"tag":"1.5.5","author":"rstake","date":"2026-04-25 12:20:26","revision":3515246},"1.5.6":{"tag":"1.5.6","author":"rstake","date":"2026-05-02 14:36:12","revision":3520944},"1.5.7":{"tag":"1.5.7","author":"rstake","date":"2026-05-10 19:00:46","revision":3527952},"1.5.8":{"tag":"1.5.8","author":"rstake","date":"2026-05-11 07:11:35","revision":3528324},"1.5.9":{"tag":"1.5.9","author":"rstake","date":"2026-05-18 19:20:35","revision":3536225}},"upgrade_notice":{"1.5.20":"<p>Restores the scheduled video refresh if its cron jobs have gone missing (site clone, cron clean-up, multisite), corrects the description of the Auto player, and fixes keyboard focus in the lightbox and slider.<\/p>","1.5.19":"<p>Fixes a case where a bad answer from YouTube could empty a channel&#039;s feed until the next refresh, and makes videos added by &quot;Load More&quot; follow the feed&#039;s player and display settings.<\/p>","1.5.18":"<p>Maintenance release: removes a Plugin Check warning introduced in 1.5.17. No change in behaviour.<\/p>","1.5.17":"<p>Fixes the &quot;Load More&quot; button disappearing on sites with a page cache, and channels being refreshed far less often than the refresh-interval setting says (especially with more than three channels).<\/p>","1.5.16":"<p>Shorts detection now uses the channel&#039;s Shorts list (YouTube&#039;s 3-minute Shorts were being missed and short regular videos mislabelled), and the &quot;maxres&quot; thumbnail setting now serves the real 1280\u00d7720 image. Run Refresh All to apply to cached videos.<\/p>","1.5.15":"<p>Hides never-aired live broadcast placeholders that showed up as dead cards and opened to a YouTube &quot;player configuration error&quot; (Error 153) when clicked. Live and upcoming streams are unaffected.<\/p>","1.5.14":"<p>Upcoming streams now drop off within an hour of their start time (was 6h) and no longer show a stale countdown. Also loads the stylesheet earlier to remove the flash of unstyled cards, plus admin polish.<\/p>","1.5.13":"<p>Fixes Load More returning wrong videos on channels\/feeds with live streams, keeps feed ids scoped when paginating, and stops sliders truncating when Load More is set.<\/p>","1.5.6":"<p>Fixes lightbox video playback in Firefox, Vivaldi, and on iPad. The lightbox no longer loads YouTube&#039;s IFrame API script, which was being blocked by tracker protection in those browsers.<\/p>","1.4.26":"<p>Fixes video playback not working on tablets (iPad) in portrait orientation when using the auto player mode.<\/p>","1.4.11":"<p>Fixes lightbox not visible on themes with CSS transform on body (The7, Visual Composer). Lightbox now renders outside all theme containers.<\/p>","1.4.10":"<p>Fixes lightbox player not appearing on themes with CSS transforms on content wrappers.<\/p>","1.4.9":"<p>YouTube embeds now use the privacy-enhanced youtube-nocookie.com domain, fixing playback in Vivaldi and other privacy-focused browsers.<\/p>","1.4.8":"<p>Fixes incorrect player default in admin shortcode reference. Adds Getting Started guide for new users on the Dashboard.<\/p>","1.4.7":"<p>Maintenance release with minor internal improvements.<\/p>","1.4.6":"<p>Fixes landscape mobile: play and lightbox buttons now work correctly on phones in landscape orientation.<\/p>","1.4.5":"<p>Channel reorder SQL now passes Plugin Check security validation.<\/p>","1.4.4":"<p>WordPress.org Plugin Review compliance: proper escaping, WP_Filesystem, directory silencers, block editor i18n, and license standardization.<\/p>","1.4.3":"<p>Channel reorder optimized to a single database query.<\/p>","1.4.2":"<p>Major quality update: fixes N+1 queries, timezone bugs, cache key collisions, and accessibility gaps. Adds REST API limits, Gutenberg slider layout, dark theme support, and timeout-safe batch refresh.<\/p>","1.4.1":"<p>RSS feed results are now cached for 15 minutes, significantly reducing HTTP requests during frequent live status checks.<\/p>","1.4.0":"<p>New Auto player adapts to screen size (lightbox on desktop, inline on mobile). Landscape mobile gets optimized layouts. Private\/deleted videos are now automatically purged from cache. Also adds tab navigation modes, Live Broadcast Boost, server cron guidance, and avatar strip.<\/p>","1.3.1":"<p>Smarter live stream ordering: streams closest to the current time now appear first, so imminent broadcasts are no longer buried below old or far-future scheduled streams.<\/p>","1.3.0":"<p>Live stream support: automatic detection of live and upcoming broadcasts, dedicated [sdawchfo_live] shortcode, RSS feed discovery, and import\/export for easy migration.<\/p>","1.2.0":"<p>Mobile experience upgrade: bottom sheet player, better touch navigation, and thumbnail loading fix for tabbed layouts.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3474789,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3474789,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3474789,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3474789,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.4.10","1.4.11","1.4.12","1.4.13","1.4.14","1.4.15","1.4.16","1.4.17","1.4.18","1.4.19","1.4.20","1.4.24","1.4.25","1.4.26","1.4.27","1.4.28","1.4.29","1.4.34","1.4.35","1.4.36","1.4.37","1.4.38","1.4.5","1.4.6","1.4.7","1.4.8","1.4.9","1.5.0","1.5.1","1.5.10","1.5.11","1.5.12","1.5.14","1.5.15","1.5.16","1.5.17","1.5.18","1.5.19","1.5.2","1.5.20","1.5.3","1.5.4","1.5.5","1.5.6","1.5.7","1.5.8","1.5.9"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3474789,"resolution":"1","location":"assets","locale":"","width":1200,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3474789,"resolution":"2","location":"assets","locale":"","width":1200,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3474789,"resolution":"3","location":"assets","locale":"","width":1200,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3474789,"resolution":"4","location":"assets","locale":"","width":1200,"height":900},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3474789,"resolution":"5","location":"assets","locale":"","width":1200,"height":900},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3474789,"resolution":"6","location":"assets","locale":"","width":1200,"height":900}},"screenshots":{"1":"Dashboard with shortcode builder and channel status overview","2":"Grid layout displaying videos from a single channel","3":"Tabbed layout with multiple channels","4":"Lightbox video player with navigation","5":"Live and upcoming stream display with badges","6":"Admin settings page with customizable labels"}},"plugin_section":[],"plugin_tags":[5325,230,6302,222,1610],"plugin_category":[50,56],"plugin_contributors":[257114,256141],"plugin_business_model":[],"class_list":["post-285384","plugin","type-plugin","status-publish","hentry","plugin_tags-channel","plugin_tags-embed","plugin_tags-live-stream","plugin_tags-video","plugin_tags-youtube","plugin_category-media","plugin_category-social-and-sharing","plugin_contributors-rstake","plugin_contributors-sdaweb","plugin_committers-rstake"],"banners":{"banner":"https:\/\/ps.w.org\/sdaweb-channels-for-youtube\/assets\/banner-772x250.png?rev=3474789","banner_2x":"https:\/\/ps.w.org\/sdaweb-channels-for-youtube\/assets\/banner-1544x500.png?rev=3474789","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/sdaweb-channels-for-youtube\/assets\/icon-128x128.png?rev=3474789","icon_2x":"https:\/\/ps.w.org\/sdaweb-channels-for-youtube\/assets\/icon-256x256.png?rev=3474789","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/sdaweb-channels-for-youtube\/assets\/screenshot-1.png?rev=3474789","caption":"Dashboard with shortcode builder and channel status overview"},{"src":"https:\/\/ps.w.org\/sdaweb-channels-for-youtube\/assets\/screenshot-2.png?rev=3474789","caption":"Grid layout displaying videos from a single channel"},{"src":"https:\/\/ps.w.org\/sdaweb-channels-for-youtube\/assets\/screenshot-3.png?rev=3474789","caption":"Tabbed layout with multiple channels"},{"src":"https:\/\/ps.w.org\/sdaweb-channels-for-youtube\/assets\/screenshot-4.png?rev=3474789","caption":"Lightbox video player with navigation"},{"src":"https:\/\/ps.w.org\/sdaweb-channels-for-youtube\/assets\/screenshot-5.png?rev=3474789","caption":"Live and upcoming stream display with badges"},{"src":"https:\/\/ps.w.org\/sdaweb-channels-for-youtube\/assets\/screenshot-6.png?rev=3474789","caption":"Admin settings page with customizable labels"}],"raw_content":"<!--section=description-->\n<p>SDAweb Channels for YouTube is a lightweight, privacy-friendly way to showcase YouTube content on your WordPress site. Add any number of public YouTube channels and display their videos using shortcodes or a Gutenberg block. Videos are cached locally so visitor page views consume zero API quota.<\/p>\n\n<h4>Layouts &amp; Playback<\/h4>\n\n<ul>\n<li><strong>Grid<\/strong> \u2014 Responsive multi-column grid (1\u20134 columns)<\/li>\n<li><strong>Tabs<\/strong> \u2014 Channel-tabbed interface with 3 navigation modes: scroll, wrapping pills, and avatar strip<\/li>\n<li><strong>Slider<\/strong> \u2014 Horizontal carousel with arrow navigation<\/li>\n<li><strong>Auto player<\/strong> (default) \u2014 Adapts to screen size: lightbox on desktop and tablet, inline on mobile phones<\/li>\n<li><strong>Lightbox player<\/strong> \u2014 Fullscreen overlay with keyboard shortcuts (arrow keys, Escape), swipe gestures, and prev\/next navigation<\/li>\n<li><strong>Inline player<\/strong> \u2014 Play directly inside the video card with expand-to-lightbox<\/li>\n<li><strong>Link mode<\/strong> \u2014 Opens videos on YouTube in a new tab<\/li>\n<li><strong>Avatar strip<\/strong> \u2014 Compact row of channel avatars with labeled names and smart truncation<\/li>\n<li><strong>Mobile bottom sheet<\/strong> \u2014 Touch-optimized player with swipe-to-dismiss<\/li>\n<li><strong>Landscape mobile<\/strong> \u2014 Optimized layouts: horizontal cards for live streams, 2-column grid for regular content<\/li>\n<\/ul>\n\n<h4>Live &amp; Upcoming Streams<\/h4>\n\n<ul>\n<li>Automatic detection of live broadcasts and scheduled upcoming streams<\/li>\n<li>Smart sort order: live streams first, then all streams sorted by proximity to the current time \u2014 the most relevant broadcasts always appear first<\/li>\n<li>Dedicated <code>[sdawchfo_live]<\/code> shortcode for live and upcoming content<\/li>\n<li>Live badge with concurrent viewer count and pulse animation<\/li>\n<li>Upcoming badge with scheduled start time countdown<\/li>\n<li>Toggleable \"Live now\" and \"Coming up\" section headings<\/li>\n<li>Stale guard: upcoming streams auto-expire 1 hour after their scheduled start, live after 24 hours \u2014 no stuck statuses<\/li>\n<li>5-minute background polling keeps live status current (1-minute with Broadcast Boost)<\/li>\n<li>Live Broadcast Boost \u2014 configurable day\/time window for 1-minute polling during scheduled broadcasts<\/li>\n<li>Zero-quota RSS feed discovery catches scheduled broadcasts not in the uploads playlist<\/li>\n<li>Live and upcoming streams are automatically excluded from regular shortcodes<\/li>\n<\/ul>\n\n<h4>Channel Management<\/h4>\n\n<ul>\n<li>Add channels by URL, handle (@username), or channel ID<\/li>\n<li>Drag-and-drop reordering controls tab and section display order<\/li>\n<li>Custom labels per channel for friendly display names<\/li>\n<li>Automatic video caching with configurable 1\u201324 hour refresh intervals (up to 3 channels per cron run)<\/li>\n<li>Manual refresh per channel or all channels at once<\/li>\n<li>Import and export channels and settings as JSON<\/li>\n<\/ul>\n\n<h4>Shortcodes<\/h4>\n\n<p>Four shortcodes cover every use case:<\/p>\n\n<ul>\n<li><code>[sdawchfo_channel]<\/code> \u2014 Videos from a single channel (by id, handle, or label)<\/li>\n<li><code>[sdawchfo_channels]<\/code> \u2014 Multiple channels in grid, tabs, or slider layout<\/li>\n<li><code>[sdawchfo_feed]<\/code> \u2014 Combined feed mixing videos from all channels<\/li>\n<li><code>[sdawchfo_live]<\/code> \u2014 Live and upcoming streams with empty-state message<\/li>\n<\/ul>\n\n<p>All shortcodes support these attributes: <code>count<\/code>, <code>columns<\/code>, <code>layout<\/code>, <code>sort<\/code>, <code>player<\/code>, <code>pagination<\/code>, <code>per_page<\/code>, <code>show_stats<\/code>, <code>show_duration<\/code>, <code>show_channel<\/code>, and <code>live_only<\/code>.<\/p>\n\n<h4>Additional Features<\/h4>\n\n<ul>\n<li>Gutenberg block with live preview and inspector controls<\/li>\n<li>Shortcode builder in the admin dashboard \u2014 no coding required<\/li>\n<li>Customizable frontend labels (26 strings) for full translation support<\/li>\n<li>Customizable appearance: badge styles, button styles, tab colors, and time text colors with color pickers<\/li>\n<li>Load More pagination with configurable batch size<\/li>\n<li>Video stats: views, likes, duration, publish date<\/li>\n<li>Detects and labels YouTube Shorts using the channel's own Shorts list (covers up-to-3-minute Shorts)<\/li>\n<li>Up to 100 videos per channel with automatic API pagination<\/li>\n<li>Import\/export for easy migration between sites<\/li>\n<li>Tab navigation modes: scroll, wrapping pills, or avatar strip<\/li>\n<li>REST API endpoints for custom and headless integrations<\/li>\n<li>Server cron setup guidance in the admin settings<\/li>\n<li>Channel name truncation setting for the avatar strip<\/li>\n<li>Automatic cleanup of private and deleted videos from cache<\/li>\n<li>Dark theme support via CSS custom property (--sdawchfo-card-bg)<\/li>\n<li>Admin settings: tabbed Plugin Overview with 7 sections, quick-access links, and info tooltips explaining technical terms<\/li>\n<\/ul>\n\n<h4>Privacy &amp; Performance<\/h4>\n\n<ul>\n<li>All video data is cached in your local database<\/li>\n<li>Visitor page views make zero external API calls<\/li>\n<li>No cookies are set and no visitor data is sent to third parties<\/li>\n<li>YouTube embeds use the privacy-enhanced <code>youtube-nocookie.com<\/code> domain<\/li>\n<li>YouTube embeds load only when a visitor clicks play<\/li>\n<li>Lazy loading: thumbnail images load only when they scroll into view<\/li>\n<\/ul>\n\n<h3>Third-Party Services<\/h3>\n\n<h4>YouTube Data API v3<\/h4>\n\n<p>This plugin connects to the YouTube Data API v3 to fetch channel information and video data. API calls are made server-side only when:<\/p>\n\n<ul>\n<li>An admin adds or refreshes a channel<\/li>\n<li>The scheduled cron refresh runs (configurable interval, default 6 hours)<\/li>\n<li>The live status cron runs (every 5 minutes, or every 1 minute during a configured Broadcast Boost window)<\/li>\n<\/ul>\n\n<p>No API calls are made during normal visitor page views \u2014 all data is served from the local cache.<\/p>\n\n<ul>\n<li>Service provider: Google LLC<\/li>\n<li>API endpoint: <code>https:\/\/www.googleapis.com\/youtube\/v3<\/code><\/li>\n<li><a href=\"https:\/\/developers.google.com\/youtube\/terms\/api-services-terms-of-service\">YouTube API Terms of Service<\/a><\/li>\n<li><a href=\"https:\/\/policies.google.com\/privacy\">Google Privacy Policy<\/a><\/li>\n<\/ul>\n\n<p>A YouTube Data API v3 key is required. You can obtain one for free from the <a href=\"https:\/\/console.cloud.google.com\/apis\/credentials\">Google Cloud Console<\/a>.<\/p>\n\n<h4>YouTube RSS Feeds<\/h4>\n\n<p>This plugin fetches public YouTube RSS feeds (<code>https:\/\/www.youtube.com\/feeds\/videos.xml<\/code>) to discover recently published and scheduled videos. These requests are read-only, use no API quota, and contain only publicly available video IDs.<\/p>\n\n<ul>\n<li>Service provider: Google LLC (YouTube)<\/li>\n<li><a href=\"https:\/\/www.youtube.com\/t\/terms\">YouTube Terms of Service<\/a><\/li>\n<li><a href=\"https:\/\/policies.google.com\/privacy\">Google Privacy Policy<\/a><\/li>\n<\/ul>\n\n<h4>YouTube Embeds<\/h4>\n\n<p>When a visitor clicks play on a video, an iframe loads from YouTube's privacy-enhanced domain (<code>youtube-nocookie.com<\/code>). No embed loads until the visitor initiates playback. No cookies are set by this domain.<\/p>\n\n<ul>\n<li>Service provider: Google LLC (YouTube)<\/li>\n<li><a href=\"https:\/\/www.youtube.com\/t\/terms\">YouTube Terms of Service<\/a><\/li>\n<li><a href=\"https:\/\/policies.google.com\/privacy\">Google Privacy Policy<\/a><\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>sdaweb-channels-for-youtube<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the Plugins menu in WordPress<\/li>\n<li>Go to <strong>YouTube Channels &gt; Settings<\/strong> and enter your YouTube Data API v3 key<\/li>\n<li>Click <strong>Test Connection<\/strong> to verify the key works<\/li>\n<li>Go to <strong>YouTube Channels &gt; Dashboard<\/strong> or <strong>Channels<\/strong> to add your first channel<\/li>\n<li>Use the <strong>Shortcode Builder<\/strong> on the Dashboard to generate shortcodes, or add the <strong>Gutenberg block<\/strong> in the editor<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20do%20i%20get%20a%20youtube%20api%20key%3F\"><h3>Where do I get a YouTube API key?<\/h3><\/dt>\n<dd><p>Visit the <a href=\"https:\/\/console.cloud.google.com\/apis\/credentials\">Google Cloud Console<\/a>, create a project, enable the YouTube Data API v3, and create an API key. Step-by-step instructions are included on the plugin's Settings page.<\/p><\/dd>\n<dt id=\"is%20the%20api%20key%20free%3F\"><h3>Is the API key free?<\/h3><\/dt>\n<dd><p>Yes. Google provides 10,000 free quota units per day. A typical site with 10 channels uses 300\u2013500 units per day. Visitor page views use zero quota.<\/p><\/dd>\n<dt id=\"how%20often%20are%20videos%20refreshed%3F\"><h3>How often are videos refreshed?<\/h3><\/dt>\n<dd><p>By default every 6 hours. You can change this to anywhere from 1 to 24 hours in Settings. Live stream status is checked every 5 minutes automatically.<\/p><\/dd>\n<dt id=\"how%20does%20the%20live%20stream%20detection%20work%3F\"><h3>How does the live stream detection work?<\/h3><\/dt>\n<dd><p>The plugin checks for live and upcoming broadcasts every 5 minutes using the YouTube API and RSS feeds. Currently live streams show a red LIVE badge with viewer count. Upcoming streams show a blue UPCOMING badge with a countdown to the scheduled start time. Streams are automatically sorted by proximity to the current time, so the most imminent broadcasts always appear first regardless of when they were originally scheduled.<\/p><\/dd>\n<dt id=\"do%20live%20streams%20appear%20in%20regular%20shortcodes%3F\"><h3>Do live streams appear in regular shortcodes?<\/h3><\/dt>\n<dd><p>No. Live and upcoming streams are automatically excluded from <code>[sdawchfo_channel]<\/code>, <code>[sdawchfo_channels]<\/code>, and <code>[sdawchfo_feed]<\/code>. Use <code>[sdawchfo_live]<\/code> to display them separately, or add <code>live_only=\"true\"<\/code> to any shortcode to show only live content.<\/p><\/dd>\n<dt id=\"how%20do%20i%20control%20the%20tab%20order%3F\"><h3>How do I control the tab order?<\/h3><\/dt>\n<dd><p>Drag channels into the desired order on the Channels page. This order is used for tabs and sections site-wide. To set a different order on a specific page, list channel IDs in the shortcode: <code>[sdawchfo_channels layout=\"tabs\" ids=\"UCabc,UCxyz\"]<\/code>.<\/p><\/dd>\n<dt id=\"can%20i%20display%20more%20than%2050%20videos%3F\"><h3>Can I display more than 50 videos?<\/h3><\/dt>\n<dd><p>Yes. Set <code>count<\/code> to up to 100 in the shortcode or Shortcode Builder. The plugin paginates through the YouTube API automatically.<\/p><\/dd>\n<dt id=\"can%20i%20migrate%20settings%20between%20sites%3F\"><h3>Can I migrate settings between sites?<\/h3><\/dt>\n<dd><p>Yes. Use the Import\/Export section on the Settings page to download a JSON file with your channels and settings, then upload it on another site. Videos are not included \u2014 they are re-fetched automatically.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20work%20with%20caching%20plugins%3F\"><h3>Does this plugin work with caching plugins?<\/h3><\/dt>\n<dd><p>Yes. The plugin uses WordPress transients for its own internal cache, which is compatible with object caching plugins and page caching plugins.<\/p><\/dd>\n<dt id=\"what%20are%20the%20player%20modes%3F\"><h3>What are the player modes?<\/h3><\/dt>\n<dd><p>The plugin offers four player modes, selectable in the Shortcode Builder or via the <code>player<\/code> attribute:<\/p>\n\n<ul>\n<li><strong>Auto<\/strong> (default) \u2014 Adapts to screen size: opens a lightbox on desktop and tablet, plays inline on mobile phones. Best for sites with mixed audiences.<\/li>\n<li><strong>Lightbox<\/strong> \u2014 Always opens a fullscreen overlay with prev\/next navigation. Best for desktop-heavy audiences.<\/li>\n<li><strong>Inline<\/strong> \u2014 Always plays directly inside the video card with an expand-to-lightbox button. Best for mobile-heavy audiences.<\/li>\n<li><strong>Link<\/strong> \u2014 Opens the video on YouTube in a new tab. No on-site playback.<\/li>\n<\/ul><\/dd>\n<dt id=\"what%20happens%20to%20private%20or%20deleted%20videos%3F\"><h3>What happens to private or deleted videos?<\/h3><\/dt>\n<dd><p>The plugin automatically detects and removes them. When a channel is refreshed, any cached videos that YouTube no longer returns (because they were made private, deleted, or removed from the uploads playlist) are purged from your local database.<\/p><\/dd>\n<dt id=\"what%20are%20the%20tab%20navigation%20modes%3F\"><h3>What are the tab navigation modes?<\/h3><\/dt>\n<dd><p>The tabs layout offers three navigation modes, configurable in Settings &gt; Appearance:<\/p>\n\n<ul>\n<li><strong>Scroll<\/strong> (default) \u2014 A horizontally scrollable tab bar with arrow indicators. Works well with any number of channels.<\/li>\n<li><strong>Wrapping Pills<\/strong> \u2014 All channels are shown as pill buttons that wrap to multiple rows. Best when you have many channels and want them all visible at once.<\/li>\n<li><strong>Avatar Strip<\/strong> \u2014 A compact row of channel avatars with labeled names below. Long channel names are automatically truncated with a configurable truncation direction (show beginning or end).<\/li>\n<\/ul><\/dd>\n<dt id=\"what%20is%20live%20broadcast%20boost%3F\"><h3>What is Live Broadcast Boost?<\/h3><\/dt>\n<dd><p>Broadcast Boost increases the live status polling frequency from every 5 minutes to every 1 minute during a configurable time window. This is useful if your channels have a regular broadcast schedule (e.g. every Saturday from 10:30 to 13:00). Enable it in Settings and choose the day and time range. Outside the boost window, normal 5-minute polling continues. For best results, set up a real server cron that runs every minute.<\/p><\/dd>\n<dt id=\"how%20do%20i%20set%20up%20a%20real%20server%20cron%3F\"><h3>How do I set up a real server cron?<\/h3><\/dt>\n<dd><p>WordPress uses a pseudo-cron that only runs when someone visits your site, which can cause delays. For reliable scheduling:<\/p>\n\n<ol>\n<li>Add <code>define('DISABLE_WP_CRON', true);<\/code> to your <code>wp-config.php<\/code> (before \"That's all, stop editing!\").<\/li>\n<li>Set up a cron job on your server (via cPanel, Plesk, or SSH) to run every minute: <code>*\/1 * * * * wget -q -O \/dev\/null https:\/\/yoursite.com\/wp-cron.php?doing_wp_cron &gt;\/dev\/null 2&gt;&amp;1<\/code><\/li>\n<\/ol>\n\n<p>The plugin's Settings page shows your current cron status and provides the exact command for your site.<\/p><\/dd>\n<dt id=\"videos%20don%27t%20play%20in%20vivaldi.%20what%27s%20wrong%3F\"><h3>Videos don't play in Vivaldi. What's wrong?<\/h3><\/dt>\n<dd><p>As of version 1.4.9, the plugin uses YouTube's privacy-enhanced embed domain (<code>youtube-nocookie.com<\/code>) which resolves most Vivaldi playback issues. If you still experience problems, Vivaldi's built-in tracker and ad blocker may be blocking the embed. Click the shield icon in the address bar and disable the blocker for your site.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<p>The most recent releases are listed here. The complete history is in changelog.txt in the plugin folder.<\/p>\n\n<h4>1.5.20<\/h4>\n\n<ul>\n<li>Fix: The two scheduled jobs that fetch new videos and check for live streams were only set up when the plugin was activated. If they went missing \u2014 after cloning or migrating a site, after a cron clean-up tool, or on a multisite network where activation ran for one site only \u2014 the site silently stopped getting new videos until the plugin was deactivated and activated again. The plugin now puts missing jobs back when it is updated and when an administrator opens the dashboard. On a site where the jobs exist, nothing changes.<\/li>\n<li>Fix: The \"Auto\" player was described the wrong way round in the plugin description, on the Overview screen and in the Shortcode Builder. What it does \u2014 and has always done \u2014 is open a lightbox on desktop and tablet and play inline on mobile phones. Only the texts changed.<\/li>\n<li>Accessibility: In the lightbox, Tab and Shift+Tab could leave the dialog and move into the page behind it on the first video, on the last video, and whenever the list has a single video. Keyboard focus now stays inside the lightbox.<\/li>\n<li>Accessibility: The slider now shows a focus ring when it has keyboard focus, and the expand, close and mute buttons \u2014 visible only on mouse hover \u2014 are now also shown when they have keyboard focus. Nothing changes for mouse and touch.<\/li>\n<li>The complete version history has moved to changelog.txt in the plugin folder; this section lists the most recent releases.<\/li>\n<\/ul>\n\n<h4>1.5.19<\/h4>\n\n<ul>\n<li>Fix: If YouTube (or a proxy in front of it) answered a refresh with something that was technically successful but not video data \u2014 an error page, an empty or cut-off response \u2014 the plugin read it as \"this channel has no videos any more\" and deleted every cached video of the channel, leaving an empty feed until the next good refresh. Such an answer is now treated as a failed refresh: the cached videos stay, the channel shows the error on the Channels page and is tried again later. The same applies when YouTube lists a channel's videos but returns details for none of them. Videos that are removed or made private are still cleaned up individually as before.<\/li>\n<li>Fix: \"Test API key\" no longer reports success for an answer that is not YouTube data.<\/li>\n<li>Fix: Videos added by \"Load More\" ignored the feed's display settings and were always rendered with the lightbox player, statistics and duration on, and no description. With player=\"link\" the added videos did nothing when clicked (they tried to open a lightbox that is not on the page); with \"auto\" they behaved differently on phones from the videos above them; show_stats, show_duration, show_channel and show_description were ignored. Added videos now look and behave like the rest of the feed. Pages served from a page cache keep working as before until the cache is refreshed.<\/li>\n<\/ul>\n\n<h4>1.5.18<\/h4>\n\n<ul>\n<li>Code quality: the scheduled refresh no longer builds part of its database query at run time. 1.5.17 generated a list of placeholders for channels that are temporarily skipped after a failed refresh; the values were always passed safely through the database layer, but the Plugin Check tool cannot verify a generated query and raised a warning. The query now has two fixed placeholders and the skipped channels are filtered out afterwards. No change in behaviour.<\/li>\n<\/ul>","raw_excerpt":"Display YouTube channels with grids, tabs, sliders, live stream badges, and lightbox playback.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/285384","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=285384"}],"author":[{"embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/rstake"}],"wp:attachment":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=285384"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=285384"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=285384"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=285384"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=285384"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=285384"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}