{"id":3214,"date":"2008-06-20T03:31:35","date_gmt":"2008-06-20T03:31:35","guid":{"rendered":"https:\/\/wordpress.org\/plugins-wp\/sermon-browser\/"},"modified":"2026-10-13T23:32:54","modified_gmt":"2026-10-13T23:32:54","slug":"sermon-browser","status":"closed","type":"plugin","link":"https:\/\/zul.wordpress.org\/plugins\/sermon-browser\/","author":52354,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.49.1","stable_tag":"0.49.1","tested":"7.1.3","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Sermon Browser","header_author":"Mark Barnes","header_description":"","assets_banners_color":"10232e","last_updated":"2026-10-13 23:32:54","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/markbarnes\/sermon-browser","header_author_uri":"https:\/\/www.markbarnes.net\/","rating":3.5,"author_block_rating":0,"active_installs":500,"downloads":109297,"num_ratings":0,"support_threads":1,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.10":{"tag":"0.10","author":"mark8barnes","date":"2008-06-20 22:17:09","revision":51335},"0.20":{"tag":"0.20","author":"mark8barnes","date":"2008-06-20 22:17:09","revision":51335},"0.21":{"tag":"0.21","author":"mark8barnes","date":"2008-06-20 22:17:09","revision":51335},"0.22":{"tag":"0.22","author":"mark8barnes","date":"2008-06-20 22:17:09","revision":51335},"0.23":{"tag":"0.23","author":"mark8barnes","date":"2008-06-20 22:17:09","revision":51335},"0.24":{"tag":"0.24","author":"mark8barnes","date":"2008-06-21 00:56:56","revision":51348},"0.25":{"tag":"0.25","author":"mark8barnes","date":"2008-06-24 13:38:08","revision":51773},"0.30":{"tag":"0.30","author":"mark8barnes","date":"2008-06-25 10:36:42","revision":51888},"0.30.1":{"tag":"0.30.1","author":"mark8barnes","date":"2008-06-26 19:13:34","revision":52078},"0.31":{"tag":"0.31","author":"mark8barnes","date":"2008-07-04 11:03:23","revision":53127},"0.32":{"tag":"0.32","author":"mark8barnes","date":"2008-07-28 17:13:14","revision":56728},"0.33":{"tag":"0.33","author":"mark8barnes","date":"2008-07-30 17:19:34","revision":57003},"0.34":{"tag":"0.34","author":"mark8barnes","date":"2008-07-31 13:10:35","revision":57227},"0.35":{"tag":"0.35","author":"mark8barnes","date":"2008-08-04 10:08:02","revision":58027},"0.36":{"tag":"0.36","author":"mark8barnes","date":"2008-10-01 00:45:02","revision":67002},"0.37":{"tag":"0.37","author":"mark8barnes","date":"2008-10-06 22:25:55","revision":67681},"0.37.1":{"tag":"0.37.1","author":"mark8barnes","date":"2008-10-08 09:27:02","revision":67967},"0.37.2":{"tag":"0.37.2","author":"mark8barnes","date":"2008-10-08 23:26:03","revision":68148},"0.37.3":{"tag":"0.37.3","author":"mark8barnes","date":"2008-10-14 13:34:11","revision":68922},"0.38":{"tag":"0.38","author":"mark8barnes","date":"2008-11-29 00:33:21","revision":76392},"0.39":{"tag":"0.39","author":"mark8barnes","date":"2008-12-01 18:35:05","revision":76788},"0.40":{"tag":"0.40","author":"mark8barnes","date":"2008-12-12 02:49:21","revision":79265},"0.40.1":{"tag":"0.40.1","author":"mark8barnes","date":"2008-12-30 12:24:11","revision":83059},"0.40.2":{"tag":"0.40.2","author":"mark8barnes","date":"2009-01-03 16:28:36","revision":83833},"0.41":{"tag":"0.41","author":"mark8barnes","date":"2009-04-08 00:01:50","revision":108596},"0.41.1":{"tag":"0.41.1","author":"mark8barnes","date":"2009-04-09 00:10:52","revision":108954},"0.41.2":{"tag":"0.41.2","author":"mark8barnes","date":"2009-04-10 10:30:55","revision":109328},"0.42":{"tag":"0.42","author":"mark8barnes","date":"2009-04-10 10:49:07","revision":109334},"0.42.1":{"tag":"0.42.1","author":"mark8barnes","date":"2009-04-12 13:36:46","revision":109985},"0.42.2":{"tag":"0.42.2","author":"mark8barnes","date":"2009-04-12 23:10:10","revision":110084},"0.42.3":{"tag":"0.42.3","author":"mark8barnes","date":"2009-04-17 10:24:35","revision":111224},"0.42.4":{"tag":"0.42.4","author":"mark8barnes","date":"2009-06-21 11:35:05","revision":128007},"0.43":{"tag":"0.43","author":"mark8barnes","date":"2009-09-14 22:22:53","revision":154784},"0.43.1":{"tag":"0.43.1","author":"mark8barnes","date":"2009-09-18 18:30:25","revision":156094},"0.43.2":{"tag":"0.43.2","author":"mark8barnes","date":"2009-10-02 01:55:46","revision":159842},"0.43.3":{"tag":"0.43.3","author":"mark8barnes","date":"2009-10-02 18:46:34","revision":160007},"0.43.4":{"tag":"0.43.4","author":"mark8barnes","date":"2009-10-02 21:19:55","revision":160039},"0.43.5":{"tag":"0.43.5","author":"mark8barnes","date":"2009-10-06 21:25:46","revision":161055},"0.43.6":{"tag":"0.43.6","author":"mark8barnes","date":"2011-04-27 11:04:38","revision":377843},"0.44":{"tag":"0.44","author":"mark8barnes","date":"2011-05-01 05:24:32","revision":379390},"0.44.1":{"tag":"0.44.1","author":"mark8barnes","date":"2011-05-09 16:53:43","revision":382875},"0.45":{"tag":"0.45","author":"mark8barnes","date":"2011-05-13 18:53:51","revision":384544},"0.45.1":{"tag":"0.45.1","author":"mark8barnes","date":"2011-05-15 19:30:50","revision":385191},"0.45.10":{"tag":"0.45.10","author":"bhengh","date":"2013-07-31 20:59:20","revision":748939},"0.45.11":{"tag":"0.45.11","author":"bhengh","date":"2013-08-07 17:39:50","revision":753111},"0.45.12":{"tag":"0.45.12","author":"bhengh","date":"2013-09-16 18:46:50","revision":773546},"0.45.13":{"tag":"0.45.13","author":"mark8barnes","date":"2015-11-06 17:08:17","revision":1281270},"0.45.14":{"tag":"0.45.14","author":"mark8barnes","date":"2015-11-06 22:41:57","revision":1281422},"0.45.15":{"tag":"0.45.15","author":"mark8barnes","date":"2015-11-10 10:37:15","revision":1283208},"0.45.16":{"tag":"0.45.16","author":"mark8barnes","date":"2016-05-09 17:26:00","revision":1413169},"0.45.17":{"tag":"0.45.17","author":"mark8barnes","date":"2016-05-30 14:40:22","revision":1426898},"0.45.18":{"tag":"0.45.18","author":"mark8barnes","date":"2016-05-30 14:46:23","revision":1426902},"0.45.19":{"tag":"0.45.19","author":"mark8barnes","date":"2016-05-31 21:04:07","revision":1427862},"0.45.2":{"tag":"0.45.2","author":"mark8barnes","date":"2011-05-16 22:58:05","revision":385617},"0.45.20":{"tag":"0.45.20","author":"mark8barnes","date":"2018-08-29 11:10:13","revision":1932349},"0.45.21":{"tag":"0.45.21","author":"mark8barnes","date":"2018-08-29 11:10:13","revision":1932349},"0.45.22":{"tag":"0.45.22","author":"mark8barnes","date":"2018-08-29 11:10:13","revision":1932349},"0.45.3":{"tag":"0.45.3","author":"mark8barnes","date":"2011-05-19 12:10:20","revision":386545},"0.45.4":{"tag":"0.45.4","author":"mark8barnes","date":"2011-05-26 21:45:40","revision":389535},"0.45.5":{"tag":"0.45.5","author":"mark8barnes","date":"2013-05-10 11:04:25","revision":710849},"0.45.6":{"tag":"0.45.6","author":"mark8barnes","date":"2013-05-10 11:31:33","revision":710882},"0.45.7":{"tag":"0.45.7","author":"mark8barnes","date":"2013-05-22 22:33:06","revision":716911},"0.45.8":{"tag":"0.45.8","author":"mark8barnes","date":"2013-06-06 00:10:24","revision":723326},"0.45.9":{"tag":"0.45.9","author":"bhengh","date":"2013-07-08 17:44:39","revision":737871},"0.46.0":{"tag":"0.46.0","author":"mark8barnes","date":"2026-10-13 23:32:54","revision":3745050},"0.46.1":{"tag":"0.46.1","author":"mark8barnes","date":"2026-10-13 23:32:54","revision":3745050},"0.47.0":{"tag":"0.47.0","author":"mark8barnes","date":"2026-10-13 23:32:54","revision":3745050},"0.47.1":{"tag":"0.47.1","author":"mark8barnes","date":"2026-10-13 23:32:54","revision":3745050},"0.48.0":{"tag":"0.48.0","author":"mark8barnes","date":"2026-10-13 23:32:54","revision":3745050},"0.49.0":{"tag":"0.49.0","author":"mark8barnes","date":"2026-10-13 23:32:54","revision":3745050},"0.49.1":{"tag":"0.49.1","author":"mark8barnes","date":"2026-10-13 23:32:54","revision":3745050}},"upgrade_notice":{"0.49.1":"<p>Date fields use the browser&#039;s own date picker; two old bundled scripts are removed.<\/p>","0.49.0":"<p>Templates are read when a page is shown instead of being run as PHP. Pages look the same; misplaced template tags are now left out and listed on the Templates page. Theme developers: see the changelog for changed functions.<\/p>","0.48.0":"<p>Reads sermons through a new storage layer, the first step towards storing them as WordPress posts. Fixes a fatal error on some old sermons&#039; pages; a few orders and filters change slightly (see the changelog).<\/p>","0.47.1":"<p>Sorting by preacher and passage works again, the admin pages are hardened, and the help is built in. The &quot;Powered by&quot; link now points to GitHub.<\/p>","0.47.0":"<p>Reorganises the plugin&#039;s code, with no change for visitors except two broken sort options removed. Themes calling the plugin&#039;s internal functions should check the changelog.<\/p>","0.46.1":"<p>Fixes NET Bible text and searching for titles with apostrophes, and removes Bible versions whose service no longer exists.<\/p>","0.46.0":"<p>Security release: fixes CVE-2022-0499 and other serious vulnerabilities. Update as soon as possible.<\/p>"},"ratings":{"1":"1","2":"2","3":"1","4":0,"5":"4"},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":1932354,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":1932354,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":1932354,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":1932354,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.10","0.20","0.21","0.22","0.23","0.24","0.25","0.30","0.30.1","0.31","0.32","0.33","0.34","0.35","0.36","0.37","0.37.1","0.37.2","0.37.3","0.38","0.39","0.40","0.40.1","0.40.2","0.41","0.41.1","0.41.2","0.42","0.42.1","0.42.2","0.42.3","0.42.4","0.43","0.43.1","0.43.2","0.43.3","0.43.4","0.43.5","0.43.6","0.44","0.44.1","0.45","0.45.1","0.45.10","0.45.11","0.45.12","0.45.13","0.45.14","0.45.15","0.45.16","0.45.17","0.45.18","0.45.19","0.45.2","0.45.20","0.45.21","0.45.22","0.45.3","0.45.4","0.45.5","0.45.6","0.45.7","0.45.8","0.45.9","0.46.0","0.46.1","0.47.0","0.47.1","0.48.0","0.49.0","0.49.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3745050,"resolution":"1","location":"assets","locale":"","width":1280,"height":1430},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3745050,"resolution":"2","location":"assets","locale":"","width":1280,"height":1580},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3745050,"resolution":"3","location":"assets","locale":"","width":1280,"height":660},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3745050,"resolution":"4","location":"assets","locale":"","width":1280,"height":910},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3745050,"resolution":"5","location":"assets","locale":"","width":1280,"height":1000}},"screenshots":{"1":"<strong>The sermons page:<\/strong> the one-click filter by preacher, book, series, service and date, the podcast links, and each sermon with its Bible passage, series and audio player (shown in Twenty Twenty-Five).","2":"<strong>A sermon's page:<\/strong> the preacher, series, service and tags, the audio with a download link, the sermons before and after it, and the text of the Bible passage (here from the NET Bible).","3":"<strong>The Sermons admin page:<\/strong> every sermon, with how often its files have been downloaded.","4":"<strong>Adding or editing a sermon:<\/strong> the preacher, series, service and date, any number of Bible passages, and any number of files, links or embedded videos.","5":"<strong>The Templates page:<\/strong> the HTML for the sermons page and each sermon's page, with template tags such as <code>[sermon_title]<\/code> and <code>[files_loop]<\/code>, and the stylesheet."}},"plugin_section":[],"plugin_tags":[452,12198,6970,238,6969],"plugin_category":[39,50,56],"plugin_contributors":[80511],"plugin_business_model":[],"class_list":["post-3214","plugin","type-plugin","status-closed","hentry","plugin_tags-audio","plugin_tags-bible","plugin_tags-church","plugin_tags-podcast","plugin_tags-sermons","plugin_category-business","plugin_category-media","plugin_category-social-and-sharing","plugin_contributors-mark8barnes","plugin_committers-mark8barnes"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/sermon-browser_10232e.svg","icon_2x":false,"generated":true},"screenshots":[{"src":"https:\/\/ps.w.org\/sermon-browser\/assets\/screenshot-1.png?rev=3745050","caption":"<strong>The sermons page:<\/strong> the one-click filter by preacher, book, series, service and date, the podcast links, and each sermon with its Bible passage, series and audio player (shown in Twenty Twenty-Five)."},{"src":"https:\/\/ps.w.org\/sermon-browser\/assets\/screenshot-2.png?rev=3745050","caption":"<strong>A sermon's page:<\/strong> the preacher, series, service and tags, the audio with a download link, the sermons before and after it, and the text of the Bible passage (here from the NET Bible)."},{"src":"https:\/\/ps.w.org\/sermon-browser\/assets\/screenshot-3.png?rev=3745050","caption":"<strong>The Sermons admin page:<\/strong> every sermon, with how often its files have been downloaded."},{"src":"https:\/\/ps.w.org\/sermon-browser\/assets\/screenshot-4.png?rev=3745050","caption":"<strong>Adding or editing a sermon:<\/strong> the preacher, series, service and date, any number of Bible passages, and any number of files, links or embedded videos."},{"src":"https:\/\/ps.w.org\/sermon-browser\/assets\/screenshot-5.png?rev=3745050","caption":"<strong>The Templates page:<\/strong> the HTML for the sermons page and each sermon's page, with template tags such as <code>[sermon_title]<\/code> and <code>[files_loop]<\/code>, and the stylesheet."}],"raw_content":"<!--section=description-->\n<p>The Sermon Browser Wordpress Plugin allows churches to simply upload sermons to their website, where they can be searched, listened to, and downloaded. It is easy to use, and is used on hundreds of church websites. Features include:<\/p>\n\n<ol>\n<li>Store thousands of sermons, and <strong>search<\/strong> them by topic, preacher, bible passage or date.<\/li>\n<li>Full <strong>podcasting<\/strong> capabilities, including custom podcasts for individual users.<\/li>\n<li>Sermons uploaded as MP3s can be <strong>played directly<\/strong> on your website, using WordPress's built-in player or any MP3 plugin that provides a shortcode.<\/li>\n<li>Three optional <strong>sidebar widgets<\/strong> can display sermons on all of your posts or pages.<\/li>\n<li><strong>Embed videos<\/strong> from sites such as <a href=\"https:\/\/www.youtube.com\/\">YouTube<\/a> or <a href=\"https:\/\/vimeo.com\/\">Vimeo<\/a>, using the embed code those sites provide, or a shortcode from a WordPress plugin.<\/li>\n<li><strong>Other file types<\/strong> can also be uploaded, including PDF, Powerpoint, Word, text and RTF. Multiple files can be attached to single sermons.<\/li>\n<li>The <strong>full Bible text<\/strong> of the passage being preached on can be included on each sermon page (ESV, with a free API key, or NET).<\/li>\n<li>Files can be uploaded to your own site <strong>through the browser or via FTP<\/strong>. Alternatively you can use free audio hosting sites.<\/li>\n<li>Details about each sermon can be <strong>added automatically from the MP3's ID3 tags<\/strong>.<\/li>\n<li>Powerful <strong>templating function<\/strong> allows complete customisation to complement the look of your site.<\/li>\n<li>Simple statistics show how often each sermon has been listened to.<\/li>\n<li>Support for multisite.<\/li>\n<li><strong>Help<\/strong> built in: a help page, and help on each admin page, including every template tag.<\/li>\n<li>Report problems and suggest features on <a href=\"https:\/\/github.com\/markbarnes\/sermon-browser\/issues\">GitHub<\/a>.<\/li>\n<li>Translated into Brazilian Portugese, German, Hindi, Italian, Romanian, Russian, Spanish, Ukrainian and Welsh.<\/li>\n<\/ol>\n\n<h4>Translations provided by<\/h4>\n\n<ul>\n<li>Brazilian Portugese <a href=\"http:\/\/www.djio.com.br\/sermonbrowser-em-portugues-brasileiro-pt_br\/\">DIJO<\/a><\/li>\n<li>German - Monika Gause<\/li>\n<li>Hindi - <a href=\"http:\/\/outshinesolutions.com\/\">Chanel<\/a><\/li>\n<li>Italian - Manoah Cammarano<\/li>\n<li>Romanian - <a href=\"http:\/\/lucianwebservice.com\/\">Lucian Mihailescu<\/a><\/li>\n<li>Russian - <a href=\"http:\/\/www.fatcow.com\/\">FatCow<\/a>, <a href=\"http:\/\/www.vady.kiev.ua\/\">Vadym Gulyi<\/a> and <a href=\"http:\/\/www.everycloudtech.com\/\">Alisa Bagrii<\/a><\/li>\n<li>Spanish - Juan, and Marvin Ortega<\/li>\n<li>Ukrainian - Alisa Bagrii from <a href=\"http:\/\/www.everycloudtech.com\/\">Everycloudtech<\/a><\/li>\n<li>Welsh - Emyr James<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>Sermon Browser connects to these services only when you use the features that need them.<\/p>\n\n<h4>ESV API (Crossway)<\/h4>\n\n<p>If a template includes <code>[esvtext]<\/code> and you enter an ESV API key on the Options page, each sermon page fetches the ESV text of the sermon's Bible passages from api.esv.org when it is viewed. The request sends the passage reference and your API key. <a href=\"https:\/\/api.esv.org\/\">Terms (on the API's home page)<\/a>, <a href=\"https:\/\/www.crossway.org\/policy\/\">privacy policy<\/a>.<\/p>\n\n<h4>NET Bible Web Service (Bible.org)<\/h4>\n\n<p>If a template includes <code>[nettext]<\/code>, each sermon page fetches the NET Bible text of the sermon's passages from labs.bible.org when it is viewed. The request sends the passage reference. <a href=\"https:\/\/labs.bible.org\/api_web_service\">API documentation<\/a>; use of the API must comply with the <a href=\"https:\/\/bible.org\/copyright#cpyrt\">NET Bible copyright<\/a>.<\/p>\n\n<h4>Files and links you add<\/h4>\n\n<p>When you attach a URL to a sermon or import a file from a URL, the site requests that URL to check it, to copy the file (if you choose to) and to read its ID3 tags. The podcast feed asks for the size of each attached URL, and the download link for an attached URL fetches it to send to the visitor. These requests go only to the addresses you entered. Embedded media (such as Vimeo or YouTube players) is loaded by visitors' browsers from the service you embedded.<\/p>\n\n<h3>Customisation<\/h3>\n\n<p>Sermon Browser works out of the box, but if you wish, you can customise it to fit in with your own theme, and to display or hide whatever information you choose. If you want to create an extra page on your site that just shows a few sermons (for example, just the sermons preached at a recent conference), use <strong>shortcodes<\/strong>. If you want to customise how Sermon Browser appears throughout your site, use <strong>template tags<\/strong> (scroll down for more info), or the built-in CSS editor.<\/p>\n\n<h3>Shortcodes<\/h3>\n\n<p>Shortcodes allow you to put individual sermons or lists of sermons on any page or post of your website. A simple shortcode looks like this: <code>[sermons id=52]<\/code>, though you can combine parameters like this: <code>[sermons filter=none preacher=3 series=7]<\/code>. The list below gives examples of shortcode uses. A pipe character <code>|<\/code> means 'or'. So <code>[sermons id=52|latest]<\/code> means you would either write <code>[sermons id=52]<\/code>, or <code>[sermons id=latest]<\/code>.<\/p>\n\n<h4>[sermons id=52|latest]<\/h4>\n\n<p>Displays a single sermon page corresponding to the ID of the sermon (you can see a list of sermon IDs by looking on the Sermons page in admin). You can also use the special value of <code>latest<\/code> which displays the most recent sermon.<\/p>\n\n<h4>[sermons filter=dropdown|oneclick|none]<\/h4>\n\n<p>Specifies which filter to display with a sermon list.<\/p>\n\n<h4>[sermons filterhide=show|hide]<\/h4>\n\n<p>Specifies whether the filter should be shown or hidden by default.<\/p>\n\n<h4>[sermons preacher=6]<\/h4>\n\n<p>Displays a list of sermons preached by one preacher (you can see a list of preacher IDs by looking on the Preachers page in admin).<\/p>\n\n<h4>[sermons series=11]<\/h4>\n\n<p>Displays a list of sermons in particular series (you can see a list of series IDs by looking on the Series &amp; Services page in admin).<\/p>\n\n<h4>[sermons service=2]<\/h4>\n\n<p>Displays a list of sermons preached at a particular service (you can see a list of service IDs by looking on the Series &amp; Services page in admin).<\/p>\n\n<h4>[sermons book=\"1 John\"]<\/h4>\n\n<p>Displays a list of sermons on a particular Bible book. The book name should be written out in full, and if it includes spaces, should be surrounded by quotes.<\/p>\n\n<h4>[sermons tag=hope]<\/h4>\n\n<p>Displays a list of sermons matching a particular tag.<\/p>\n\n<h4>[sermons limit=5]<\/h4>\n\n<p>Sets the number of sermons on each page, instead of the number on the Options page.<\/p>\n\n<h4>[sermons dir=asc|desc]<\/h4>\n\n<p>Sets the sort order to ascending or descending.<\/p>\n\n<h3>Template Tags<\/h3>\n\n<p>If you want to change the output of Sermon Browser, you'll need to edit the templates. You'll need to understand the basics of HTML and CSS, and to know the special SermonBrowser template tags. There are two templates, one (called the results page) is used to produce the search results on the main sermons page. The other template (called the sermon page) is used to produce the page for single sermon. Most tags can be used in both templates, but some are specific.<\/p>\n\n<h4>Results Page Only<\/h4>\n\n<ul>\n<li><strong>[filters_form]<\/strong> - The search form which allows filtering by preacher, series, date, etc.<\/li>\n<li><strong>[sermons_count]<\/strong> - The number of sermons which match the current search criteria.<\/li>\n<li><strong>[sermons_loop][\/sermons_loop]<\/strong> - These two tags should be placed around the output for one sermon. (That is all of the tags that return data about sermons should come between these two tags.)<\/li>\n<li><strong>[first_passage]<\/strong> - The main bible passage for this sermon<\/li>\n<li><strong>[previous_page]<\/strong> - Displays the link to the previous page of search results (if needed)<\/li>\n<li><strong>[next_page]<\/strong> - Displays the link to the next page of search results (if needed)<\/li>\n<li><strong>[podcast]<\/strong> - Link to the podcast of all sermons<\/li>\n<li><strong>[podcast_for_search]<\/strong> - Link to the podcast of sermons that match the current search<\/li>\n<li><strong>[itunes_podcast]<\/strong> - iTunes (itpc:\/\/) link to the podcast of all sermons<\/li>\n<li><strong>[itunes_podcast_for_search]<\/strong> - iTunes (itpc:\/\/) link to the podcast of sermons that match the current search<\/li>\n<li><strong>[podcasticon]<\/strong> - Displays the icon used for the main podcast<\/li>\n<li><strong>[podcasticon_for_search]<\/strong> - Displays the icon used for the custom podcast<\/li>\n<li><strong>[tag_cloud]<\/strong> - Displays a tag cloud<\/li>\n<li><strong>[most_popular]<\/strong> - The most popular sermons, series and preachers, as in the popular sermons widget<\/li>\n<\/ul>\n\n<h4>Both results page and sermon page<\/h4>\n\n<ul>\n<li><strong>[sermon_title]<\/strong> - The title of the sermon<\/li>\n<li><strong>[preacher_link]<\/strong> - The name of the preacher (hyperlinked to their sermons)<\/li>\n<li><strong>[series_link]<\/strong> - The name of the series (hyperlinked to search results)<\/li>\n<li><strong>[service_link]<\/strong> - The name of the service (hyperlinked to search results)<\/li>\n<li><strong>[date]<\/strong> - The date of the sermon<\/li>\n<li><strong>[files_loop][\/files_loop]<\/strong> - These two tags should be placed around the [file] tag if you want to display all the files linked with to sermon. They are not needed if you only want to display the first file.<\/li>\n<li><strong>[file]<\/strong> - Displays the files and external URLs<\/li>\n<li><strong>[file_with_download]<\/strong> - The same as [file], but includes a download link after the media player for MP3 files<\/li>\n<li><strong>[embed_loop][\/embed_loop]<\/strong> - These two tags should be placed around the tag if you want to display all the embedded objects linked to this sermon. They are not needed if you only want to display the first embedded object.<\/li>\n<li><strong>[embed]<\/strong> - Displays an embedded object (e.g. video)<\/li>\n<li><strong>[creditlink]<\/strong> - displays a \"Powered by Sermon Browser\" link to the plugin's home page.<\/li>\n<li><strong>[editlink]<\/strong> - Displays a link to edit the current sermon if you are logged in as an admin<\/li>\n<\/ul>\n\n<h4>Sermon page only<\/h4>\n\n<ul>\n<li><strong>[sermon_description]<\/strong> - The description of the sermon.<\/li>\n<li><strong>[preacher_description]<\/strong> - The description of the preacher.<\/li>\n<li><strong>[preacher_image]<\/strong> - The photo of the preacher.<\/li>\n<li><strong>[passages_loop][\/passages_loop]<\/strong> - These two tags should be placed around the [passage] tag if you want to display all the passages linked with to sermon.<\/li>\n<li><strong>[passage]<\/strong> - Displays the reference of the bible passage with the book name hyperlinked to search results.<\/li>\n<li><strong>[next_sermon]<\/strong> - Displays a link to the next sermon preached (excluding ones preached on the same day)<\/li>\n<li><strong>[prev_sermon]<\/strong> - Displays a link to the previous sermon preached<\/li>\n<li><strong>[sameday_sermon]<\/strong> - Displays a link to other sermons preached on that day<\/li>\n<li><strong>[tags]<\/strong> - Displays the tags for that sermons<\/li>\n<li><strong>[esvtext]<\/strong> - Displays the full text of the ESV Bible for all passages linked to that sermon (needs an API key).<\/li>\n<li><strong>[nettext]<\/strong> - Displays the full text of the NET Bible for all passages linked to that sermon.<\/li>\n<li><strong>[biblepassage]<\/strong> - Displays the reference of the bible passages for that sermon. Useful for utilising other bible plugins (see FAQ).<\/li>\n<\/ul>\n\n<p>The tags for other Bible versions (<code>[kjvtext]<\/code>, <code>[asvtext]<\/code>, <code>[ylttext]<\/code>, <code>[webtext]<\/code>, <code>[akjvtext]<\/code>, <code>[hnvtext]<\/code>, <code>[lbrvtext]<\/code>, <code>[cornilescutext]<\/code> and <code>[synodaltext]<\/code>) print nothing, because the service that provided them no longer exists. The help tab on the Templates page lists every tag.<\/p>\n\n<!--section=installation-->\n<h4>Installing<\/h4>\n\n<ul>\n<li>Until Sermon Browser is back on WordPress.org, download <code>sermon-browser.zip<\/code> from the <a href=\"https:\/\/github.com\/markbarnes\/sermon-browser\/releases\/latest\">latest release on GitHub<\/a>. In your WordPress admin, go to Plugins, Add New, Upload Plugin, and choose the zip. (Don't use GitHub's \"Download ZIP\" button: it unpacks to a folder with the wrong name, and the plugin's folder must be called <code>sermon-browser<\/code>.)<\/li>\n<li>Once it is back on WordPress.org, go to Plugins, Add New, search for \"sermon browser\", and click Install Now.<\/li>\n<\/ul>\n\n<h4>After you have installed the plugin:<\/h4>\n\n<ol>\n<li>Activate the plugin from the Plugins page. On a multisite network, activate it on each site that needs it, or network-activate it.<\/li>\n<li>Create a page with the text <code>[sermons]<\/code>. The plugin will display your sermons on this page.<\/li>\n<li>Add your preachers, series and services, then your sermons, under Sermons in the admin menu. The Help page there explains each step.<\/li>\n<li>You can also display sermons (filtered according to your criteria) on additional pages or posts by using <strong>shortcodes<\/strong>. See Customisation for more details.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"i%27ve%20activated%20the%20plugin%2C%20and%20entered%20in%20a%20few%20sermons%2C%20but%20they%20are%20not%20showing%20up%20to%20my%20website%20users.%20where%20are%20they%3F\"><h3>I've activated the plugin, and entered in a few sermons, but they are not showing up to my website users. Where are they?<\/h3><\/dt>\n<dd><p>SermonBrowser only displays your sermons where you choose. You need to create the page\/post where you want the sermons to appear (or edit an existing one), and add [sermons] to the page\/post. You can also add some explantory text if you wish. If you do so, the text will appear on all your sermons pages. If you want your text to only appear on the list of sermons, not on individual sermon pages, you need to edit the SermonBrowser templates (see customisation).<\/p><\/dd>\n<dt id=\"what%20does%20the%20error%20message%20%22error%3A%20the%20upload%20folder%20is%20not%20writeable.%20you%20need%20to%20chmod%20the%20folder%20to%20666%20or%20777.%22%20mean%3F\"><h3>What does the error message \"Error: The upload folder is not writeable. You need to CHMOD the folder to 666 or 777.\" mean?<\/h3><\/dt>\n<dd><p>SermonBrowser creates its upload folder (usually <code>wp-content\/uploads\/sermons\/<\/code>) and needs to be able to write to it. If it can't, give the web server permission to write to that folder, as it can to <code>wp-content\/uploads<\/code>, or ask your host to. Don't make the folder writeable by everyone (777), whatever the message says.<\/p><\/dd>\n<dt id=\"sermonbrowser%20spends%20a%20long%20time%20attempting%20to%20upload%20files%2C%20but%20the%20file%20is%20never%20uploaded.%20what%27s%20happening%3F\"><h3>SermonBrowser spends a long time attempting to upload files, but the file is never uploaded. What's happening?<\/h3><\/dt>\n<dd><p>The most likely cause is that you're reaching either the maximum file size that can be uploaded, or the maximum time a PHP script can run for. The Options page warns if either is low. You may be able to raise them in php.ini or your host's control panel, but if you're on shared hosting, your host may have set limits you cannot change. If that's the case, upload your files to the upload folder by FTP, and the Files page will find them. FTP is generally a better option than your browser anyway, particularly if you have several files to upload. These settings should be adequate:<\/p>\n\n<pre><code>file_uploads = On\nupload_max_filesize = 15M\npost_max_size = 15M\nmax_execution_time = 600\nmax_input_time = 600\nmemory_limit = 48M\n<\/code><\/pre><\/dd>\n<dt id=\"why%20are%20my%20mp3%20files%20are%20appearing%20as%20an%20icon%2C%20rather%20than%20as%20a%20player%2C%20as%20i%27ve%20seen%20on%20other%20sermonbrowser%20sites%3F\"><h3>Why are my MP3 files are appearing as an icon, rather than as a player, as I've seen on other SermonBrowser sites?<\/h3><\/dt>\n<dd><p>SermonBrowser shows each MP3 with the MP3 shortcode on the Options page. The default, <code>[audio mp3=\"%SERMONURL%\"]<\/code>, uses WordPress's built-in player. If you see an icon, check that the shortcode includes <code>%SERMONURL%<\/code>, and that the plugin providing it (if you use another player) is active. The admin pages warn about either problem.<\/p><\/dd>\n<dt id=\"how%20do%20i%20change%20the%20bible%20version%20from%20the%20esv%3F\"><h3>How do I change the Bible version from the ESV?<\/h3><\/dt>\n<dd><p>Sermon Browser can show the ESV (which needs a free API key, entered on the Options page) or the NET Bible. To switch to the NET Bible, go to Templates, and edit the single template: replace <code>[esvtext]<\/code> with <code>[nettext]<\/code>. Thanks go to Crossway for providing access to the ESV, and bible.org for the NET Bible.<\/p>\n\n<p>The other versions Sermon Browser used to offer (KJV, ASV, YLT, WEB, AKJV, HNV, Reina Valera, Cornilescu and Synodal) came from a service that no longer exists. Their template tags now show nothing.<\/p>\n\n<p>To show a version Sermon Browser doesn't offer, use another Bible plugin that finds references on the page: in the single template, replace <code>[esvtext]<\/code> with <code>[biblepassage]<\/code>, which prints the sermon's Bible references as plain text for such plugins to find.<\/p><\/dd>\n<dt id=\"how%20do%20i%20get%20recent%20sermons%20to%20display%20in%20my%20sidebar%20or%20elsewhere%20in%20my%20theme%3F\"><h3>How do I get recent sermons to display in my sidebar or elsewhere in my theme?<\/h3><\/dt>\n<dd><p>SermonBrowser comes with several widgets you can add to your sidebars - just go to Appearance and choose Widgets.<\/p>\n\n<p>If you want to add sermons elsewhere on your site, and you are comfortable in editing template files, add the following code: <code>&lt;?php if (function_exists('sb_display_sermons')) sb_display_sermons(array('display_preacher' =&gt; 1, 'display_passage' =&gt; 1, 'display_date' =&gt; 1, 'preacher' =&gt; 0, 'service' =&gt; 0, 'series' =&gt; 0, 'limit' =&gt; 5, 'url_only' =&gt; 0)) ?&gt;<\/code>. Each of the values in that line can be changed or omitted (if they are omitted, the default values are used). For example, you could just use: <code>&lt;?php if (function_exists('sb_display_sermons')) sb_display_sermons(array('preacher' =&gt; 12)) ?&gt;<\/code>. The various array keys are used to specify the following:<\/p>\n\n<ul>\n<li>display_preacher, display_passage and display_date affect what is displayed (0 is off, 1 is on).<\/li>\n<li>preacher, service and series allow you to limit the output to a particular preacher, service or series. Simply change the number of the ID of the preacher\/services\/series you want to display. You can get the ID from the Preachers page, or the Series &amp; Services page. 0 shows all preachers\/services\/series.<\/li>\n<li>limit is the maximum number of sermons you want displayed.<\/li>\n<li>url_only means that only the URL of a sermon is returned. It's useful if you want to create your own link (e.g. click here for Bob's latest sermon). url_only means the display_ values are ignored, and limit is set to 1.<\/li>\n<\/ul><\/dd>\n<dt id=\"my%20host%20only%20allows%20me%20a%20certain%20amount%20of%20disk%20space%2C%20and%20i%20have%20so%20many%20sermons%20uploaded%2C%20i%27ve%20run%20out%20of%20space%21%20what%20can%20i%20do%3F\"><h3>My host only allows me a certain amount of disk space, and I have so many sermons uploaded, I've run out of space! What can I do?<\/h3><\/dt>\n<dd><p>You could, of course, change your host to someone a little more generous! You should also make sure you encode your sermons at a medium to high compression. Usually, 22.05kHz, 48kbps mono is more than adequate (you could probably go down to 32kbps for even higher compression). 48kbps means every minute of recording takes up 360kb of disk space, so a thirty minute sermon will be just over 10Mb. At this setting, 5Gb would be enough for over 450 sermons.<\/p>\n\n<p>If you can't change your host, you can still use SermonBrowser. You'll just have to upload your sermon files to another site. You can then use the other site's embed code, or just link to the MP3 file if they allow you (when you add your sermon to SermonBrowser, select \"Enter an URL\" and paste it in).<\/p><\/dd>\n<dt id=\"how%20do%20i%20upload%20videos%20to%20sermonbrowser%3F\"><h3>How do I upload videos to SermonBrowser?<\/h3><\/dt>\n<dd><p>SermonBrowser doesn't host videos. Upload them to a video site such as <a href=\"https:\/\/www.youtube.com\/\">YouTube<\/a> or <a href=\"https:\/\/vimeo.com\/\">Vimeo<\/a>, and copy the embed code it gives you. Then edit your sermon, choose \"Enter embed or shortcode\", and paste it in. A video plugin's shortcode works too.<\/p><\/dd>\n<dt id=\"can%20i%20turn%20off%20the%20%22powered%20by%20sermonbrowser%22%20link%3F\"><h3>Can I turn off the \"Powered by Sermonbrowser\" link?<\/h3><\/dt>\n<dd><p>The link is only shown if a template includes [creditlink]. New installations don't include it; templates saved by older versions may, and you can remove it on the Templates page. If you'd like to help other churches find SermonBrowser, add [creditlink] to your templates.<\/p><\/dd>\n<dt id=\"what%20is%20the%20difference%20between%20the%20public%20and%20private%20podcast%20feeds%3F\"><h3>What is the difference between the public and private podcast feeds?<\/h3><\/dt>\n<dd><p>In SermonBrowser options, you are able to change the address of the public podcast feed. This is the feed that is shown on your sermons page, and is usually the same as your private feed (i.e. you won't need to change it). However, if you publish your podcast through another service, which reads your private feed, set the public feed to that service's address. Otherwise, just make sure your public and private feeds are the same.<\/p><\/dd>\n<dt id=\"on%20the%20sermons%20page%2C%20what%20is%20the%20difference%20between%20subscribing%20to%20the%20podcast%20for%20%22all%20sermons%22%2C%20and%20subscribing%20to%20a%20podcast%20for%20%22filtered%20sermons%22%3F\"><h3>On the sermons page, what is the difference between subscribing to the podcast for \"All sermons\", and subscribing to a podcast for \"Filtered sermons\"?<\/h3><\/dt>\n<dd><p>The link under Subscribe to Podcast for \"All sermons\" gives a podcast of all sermons that you add to your site through SermonBrowser. But it may be that some people may just want to subscribe to a feed for certain speakers, or for a certain service. If they wish to do this, they should set the search filters and perform their search, then click on the subscribe link for \"Filtered sermons.\" This will give them a podcast according to the filter they selected. You could also copy this link, and display it elsewhere on the site - for example to provide separate feeds for morning and evening services.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20default%20sort%20order%20of%20the%20sermons%3F\"><h3>Can I change the default sort order of the sermons?<\/h3><\/dt>\n<dd><p>Yes. Use the <strong>shortcode<\/strong> <code>[sermons dir=asc]<\/code> instead of just <code>[sermons]<\/code>.<\/p><\/dd>\n<dt id=\"why%20do%20i%20get%20a%20page%20not%20found%20error%20when%20i%20click%20on%20my%20podcast%20feed%3F\"><h3>Why do I get a page not found error when I click on my podcast feed?<\/h3><\/dt>\n<dd><p>You've probably changed the address of your public feed to an incorrect value. Try changing it back to the same value as your private feed in Sermon Options.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20way%20sermons%20are%20displayed%3F\"><h3>Can I change the way sermons are displayed?<\/h3><\/dt>\n<dd><p>Yes, definitely, although you need to know a little HTML and\/or CSS. SermonBrowser has a powerful templating function, so you can exclude certain parts of the output (e.g. if you don't want the links to other sermons preached on the same day to be displayed). The <strong>Customisation<\/strong> section has much more information.<\/p><\/dd>\n<dt id=\"the%20search%20form%20is%20too%20big%2Ftoo%20small%20for%20my%20layout.%20how%20do%20i%20make%20it%20narrower%2Fwider%3F\"><h3>The search form is too big\/too small for my layout. How do I make it narrower\/wider?<\/h3><\/dt>\n<dd><p>The search form is set to roughly 500 pixels, which should be about right for most WordPress templates. To change it, look for a line in the CSS stylesheet that begins <code>table.sermonbrowser td.field input<\/code>, and change the width specified after it. To make the form narrower, reduce the width. To make it bigger, increase the width. You'll also need to change the width of the date fields on the line below, which should be 20 pixels smaller.<\/p>\n\n<p>Alternatively, you could try using the one-click style filter, which is inherently responsive.  The one-click style filter is selected on the Sermons, Options admin screen.<\/p><\/dd>\n<dt id=\"why%20is%20sometimes%20the%20bible%20text%20missing%3F\"><h3>Why is sometimes the Bible text missing?<\/h3><\/dt>\n<dd><p>This usually happens for one of three reasons: (1) The Bible texts are provided by external websites, and sometimes they can go down. If you can't see Genesis 1 then the problem is with those websites. They're rarely down for long. (2) If you specify an invalid bible passage (e.g. Romans 22). If this is the case your sermon page will display ERROR: No results were found for your search. (3) Your site must be able to fetch pages from other websites. Some hosts block this; if yours does, ask them to allow requests to api.esv.org and labs.bible.org.<\/p><\/dd>\n<dt id=\"why%20is%20the%20esv%20text%20missing%3F\"><h3>Why is the ESV text missing?<\/h3><\/dt>\n<dd><p>The ESV text needs an API key from api.esv.org, entered on the Options page. Without one, the <code>[esvtext]<\/code> tag prints nothing. The ESV API allows 5,000 lookups a day for each key, and SermonBrowser looks up the passage each time a sermon page with <code>[esvtext]<\/code> is viewed, so a busy site may run out. Once the limit is reached, sermon pages show no ESV text.<\/p><\/dd>\n<dt id=\"how%20can%20i%20change%20the%20file%20icons%20that%20sermon%20browser%20uses%2C%20or%20add%20new%20icons%3F\"><h3>How can I change the file icons that Sermon Browser uses, or add new icons?<\/h3><\/dt>\n<dd><p>You'll need to edit the <code>filetypes.php<\/code> file that comes with Sermon Browser. The icon is chosen on the basis of the file extension (or in the case of URLs the file extension then the site address). If you do create new icons for other file types, consider offering them <a href=\"https:\/\/github.com\/markbarnes\/sermon-browser\/issues\">on GitHub<\/a> so they can be included in future versions of the plugin.<\/p><\/dd>\n<dt id=\"where%20is%20the%20best%20place%20to%20go%20for%20help%2C%20ask%20questions%2C%20or%20discuss%20a%20potential%20bug%3F\"><h3>Where is the best place to go for help, ask questions, or discuss a potential bug?<\/h3><\/dt>\n<dd><p>The Help page in the plugin's admin menu explains how to get started, the shortcode and every template tag, and each admin page has a help tab. To ask a question, report a bug or suggest a feature, <a href=\"https:\/\/github.com\/markbarnes\/sermon-browser\/issues\">open an issue on GitHub<\/a>. Include a link to your site, and your WordPress and PHP versions.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.49.1 (13 October 2026)<\/h4>\n\n<ul>\n<li><strong>Change:<\/strong> The date fields in the drop-down filter and on the Add Sermon page use the browser's own date picker, instead of a bundled script from 2006 and its stylesheet.<\/li>\n<li><strong>Change:<\/strong> The Add Sermon page no longer loads a bundled Base64 script to show a sermon's embed code.<\/li>\n<li><strong>Change:<\/strong> New screenshots for the readme.<\/li>\n<\/ul>\n\n<h4>0.49.0 (13 October 2026)<\/h4>\n\n<p>The search results and sermon page templates no longer run as PHP.<\/p>\n\n<ul>\n<li><strong>Change:<\/strong> The search results and sermon page templates are read when a page is shown, instead of being turned into PHP when saved and run with <code>eval()<\/code>. They print the same as before.<\/li>\n<li><strong>Change:<\/strong> A template tag where it can't work (outside its loop, after its loop has ended, or in a loop that is never closed) is left out, instead of printing PHP warnings, the loop's last value or stopping the page with an error. Those who can edit the templates see why, with a link to a new section of the Help page, and the Templates page lists them.<\/li>\n<li><strong>Bug fix:<\/strong> <code>[file]<\/code>, <code>[file_with_download]<\/code> and <code>[embed]<\/code> outside their loops show the sermon's first file or embed, as the template tag help has always said; they printed a broken link, or the last one shown.<\/li>\n<li><strong>Bug fix:<\/strong> The sermon list printed PHP deprecation notices for sermons without a series.<\/li>\n<li><strong>Bug fix:<\/strong> A backslash in a sermon's title or tags, or in a preacher's, series' or service's name, was removed from sermon lists, sermon pages and the recent sermons widget.<\/li>\n<li><strong>Bug fix:<\/strong> <code>sb_display_sermons()<\/code> with <code>url_only<\/code> printed PHP warnings when no sermon matched.<\/li>\n<li><strong>Bug fix:<\/strong> Saving the templates turned an attribute in single quotes, such as <code>data-x='y'<\/code>, into <code>data-x=\"&amp;apos;y&amp;apos;\"<\/code>.<\/li>\n<li><strong>Development:<\/strong> The functions in <code>template-tags.php<\/code> that print parts of a sermon (<code>sb_print_preacher_link()<\/code>, <code>sb_formatted_date()<\/code>, <code>sb_print_preacher_description()<\/code> and the rest) take a <code>SermonBrowser\\Sermon<\/code> instead of a database row, <code>sb_print_code()<\/code> takes the embed's HTML instead of base64, and <code>sb_get_sermons()<\/code>, <code>sb_get_single_sermon()<\/code>, <code>sb_get_stuff()<\/code>, <code>sb_get_books()<\/code>, <code>sb_print_bible_passage()<\/code>, <code>sb_add_bible_text()<\/code> and <code>sb_compile_template()<\/code> are gone (<code>SermonBrowser\\Passage::reference()<\/code> formats a passage). <code>sb_display_sermons()<\/code> is unchanged.<\/li>\n<\/ul>\n\n<h4>0.48.0 (13 October 2026)<\/h4>\n\n<p>Sermons are read through one storage layer, the first step towards storing them as WordPress posts.<\/p>\n\n<ul>\n<li><strong>Bug fix:<\/strong> The page of a sermon whose passages were saved empty by an old version (stored as <code>null<\/code>) stopped with a fatal error on PHP 8.<\/li>\n<li><strong>Bug fix:<\/strong> <code>[sermons id=\"latest\"]<\/code> printed PHP warnings when no sermon matched its filters.<\/li>\n<li><strong>Change:<\/strong> Sermon lists sort only by date, title, preacher and passage, the orders the filters offer; links that ask for another column (such as <code>sortby=s.name<\/code>) sort by date.<\/li>\n<li><strong>Change:<\/strong> The tag cloud lists tags used equally often in alphabetical order, and the most popular widget lists sermons downloaded equally often newest first, and series and preachers that rank equally by their latest sermon; these followed the database's order before.<\/li>\n<li><strong>Change:<\/strong> Filtering by date leaves out sermons whose date is unknown, and the one-click filter's dates no longer list them under 1970.<\/li>\n<li><strong>Development:<\/strong> Sermons are read through a repository (<code>SermonBrowser\\Sermon_Repository<\/code>) that returns <code>SermonBrowser\\Sermon<\/code> objects, instead of queries spread through the plugin, with PHPUnit contract tests that any storage must pass.<\/li>\n<\/ul>\n\n<h4>0.47.1 (13 October 2026)<\/h4>\n\n<p>Restores sorting by preacher and passage, finishes escaping the admin pages, and moves the plugin's help from sermonbrowser.com into the plugin.<\/p>\n\n<ul>\n<li><strong>Bug fix:<\/strong> The drop-down filter can sort by preacher and by passage again, which had sorted by date since 0.45.12. Passages sort in Bible order of each sermon's first passage, with sermons that have none at the end; a preacher's sermons are listed newest first. Old links that sort by <code>p.name<\/code> or <code>b.id<\/code> still work.<\/li>\n<li><strong>Bug fix:<\/strong> After uploading or importing a file on the Files page with import options set, the Add Sermon page opened without the file's details, because the link to it was escaped for HTML inside a script.<\/li>\n<li><strong>Bug fix:<\/strong> Series, preacher and service names with HTML entities (such as an en dash saved as <code>&amp;#8211;<\/code>) showed the entity in the admin pages' drop-down lists.<\/li>\n<li><strong>Bug fix:<\/strong> The Options page didn't show its error when the upload folder doesn't exist.<\/li>\n<li><strong>Bug fix:<\/strong> Some of the dashboard's sermon statistics weren't translated.<\/li>\n<li><strong>Change:<\/strong> The plugin's home is now <a href=\"https:\/\/github.com\/markbarnes\/sermon-browser\">on GitHub<\/a>, until it is back on WordPress.org. The sermonbrowser.com site, its forum and its tutorials are no longer maintained, so the plugin no longer links to them: the \"Powered by\" link (<code>[creditlink]<\/code>), the podcast feed's generator and the plugin's home page point to GitHub, and the Help page and help tabs now hold the help themselves, including a description of every template tag. Report problems on GitHub.<\/li>\n<li><strong>Change:<\/strong> Removed the global constants <code>IS_MU<\/code> (use WordPress's <code>is_multisite()<\/code>), <code>SB_PLUGIN_DIR<\/code> and <code>SB_WP_CONTENT_DIR<\/code>, and support for installing the plugin in <code>mu-plugins<\/code>, which didn't work: its URLs were wrong.<\/li>\n<li><strong>Documentation:<\/strong> The FAQ and installation instructions are brought up to date, and <code>[sermon_description]<\/code> and <code>[most_popular]<\/code> are documented. The changelog before 0.46.0 is in CHANGELOG.md on GitHub.<\/li>\n<li><strong>Hardening:<\/strong> The admin pages escape their output where it is printed, use prepared statements for every query, and sanitise request values where they are read, as the rest of the plugin has since 0.46.1. Plugin Check now reports nothing in the plugin except the templates' <code>eval()<\/code>.<\/li>\n<\/ul>\n\n<h4>0.47.0 (13 October 2026)<\/h4>\n\n<p>The plugin's code is reorganised, to prepare for moving sermons to a custom post type. Output is unchanged except where noted below.<\/p>\n\n<ul>\n<li><strong>Change:<\/strong> The code is split into classes (namespace <code>SermonBrowser<\/code>, in <code>sb-includes\/classes<\/code>) and files by purpose: <code>functions.php<\/code>, <code>sermons.php<\/code> and <code>template-tags.php<\/code> (which was <code>frontend.php<\/code>). <code>podcast.php<\/code> and <code>style.php<\/code> are gone. <code>sb_display_sermons()<\/code> and the functions templates use are unchanged, but themes or plugins calling other internal functions (such as <code>sb_shortcode()<\/code>, <code>sb_hijack()<\/code>, <code>sb_add_headers()<\/code> or the widget functions) need updating.<\/li>\n<li><strong>Change:<\/strong> Removed functions nothing called: <code>display_sermons()<\/code> (deprecated since 0.41), <code>sb_first_mp3()<\/code>, <code>sb_get_bible_books()<\/code>, <code>sb_display_front_end()<\/code> and <code>sb_default_excerpt_template()<\/code>.<\/li>\n<li><strong>Change:<\/strong> The drop-down filter no longer offers sorting by preacher or passage. Neither has worked since 0.45.12; both sorted by date.<\/li>\n<li><strong>Bug fix:<\/strong> The default stylesheet's podcast box background pointed to the wrong folder. Saved stylesheets are unchanged; resetting to the default fixes it.<\/li>\n<li><strong>Documentation:<\/strong> The FAQ on ESV text describes the API key on the Options page.<\/li>\n<\/ul>\n\n<h4>0.46.1 (13 October 2026)<\/h4>\n\n<p>Preparation for reopening on WordPress.org, from the results of its Plugin Check.<\/p>\n\n<ul>\n<li><strong>Security:<\/strong> With SAVEQUERIES on, every page printed every database query (with its values) in an HTML comment that visitors could see. That output is gone.<\/li>\n<li><strong>Bug fix:<\/strong> NET Bible text (<code>[nettext]<\/code>) showed only the heading, because bible.org's old endpoint stopped working. It uses the current one.<\/li>\n<li><strong>Bug fix:<\/strong> Searching the sermon list for a title with an apostrophe (Paul's) found nothing.<\/li>\n<li><strong>Bug fix:<\/strong> Editing a page with the <code>[sermons]<\/code> shortcode in the block editor caused a fatal error.<\/li>\n<li><strong>Bug fix:<\/strong> The bundled translations weren't loaded on multisite networks.<\/li>\n<li><strong>Change:<\/strong> The KJV, ASV, YLT, WEB, AKJV, HNV, Reina Valera, Cornilescu and Synodal texts came from a service that no longer exists, so they already showed nothing. Their template tags now print nothing without trying, and <code>[esvtext]<\/code> without an API key shows nothing instead of falling back to the KJV.<\/li>\n<li><strong>Change:<\/strong> New installations no longer put a \"Powered by Sermon Browser\" link in the templates. Existing templates are unchanged.<\/li>\n<li><strong>Change:<\/strong> Removed an admin page that loaded remote content, and the notices shown at random after saving a sermon.<\/li>\n<li><strong>Change:<\/strong> The plugin no longer changes PHP settings (memory limit, time limit and upload sizes) on every request.<\/li>\n<li><strong>Change:<\/strong> Updates from WordPress.org are allowed again (the Update URI header is gone), ready for the plugin to be reopened there.<\/li>\n<li><strong>Hardening:<\/strong> Output on the front end, in the feed and in AJAX responses is escaped where it is printed, every query uses prepared statements, request values are sanitised where they are read, and uploads, deleting and renaming files use WordPress's functions. The readme lists the external services the plugin uses.<\/li>\n<\/ul>\n\n<h4>0.46.0 (12 October 2026)<\/h4>\n\n<p>Security release. The plugin was closed on WordPress.org in February 2022 for CVE-2022-0499; this version fixes that and the other problems found in a full review. Update from WordPress.org is disabled (Update URI), so install it by uploading a zip.<\/p>\n\n<ul>\n<li><strong>Security:<\/strong> AJAX requests from the admin pages had no authentication, so anyone could add, rename or delete preachers, series and services, and rename or delete uploaded files. They now need a logged-in user, a nonce and the right capability.<\/li>\n<li><strong>Security (CVE-2022-0499):<\/strong> Uploads (Files page, URL import, Add Sermon, preacher images) had no nonce and no file type check, so a forged request could upload and run PHP. Uploads now need a nonce and only accept file types WordPress allows. The upload folder gets an .htaccess that refuses scripts, and must be inside the WordPress folder.<\/li>\n<li><strong>Security:<\/strong> ?download&amp;url= and ?show&amp;url= worked as an open proxy and open redirect for any URL. They now only serve URLs attached to a sermon.<\/li>\n<li><strong>Hardening:<\/strong> Queries that built SQL from request data or MP3 ID3 tags now use prepared statements. These weren't exploitable in 0.45.22, because the values were slashed, cast to integers or HTML-encoded first, but they relied on that.<\/li>\n<li><strong>Security:<\/strong> Output is escaped throughout (front end, widgets, podcast feed, admin), templates can no longer contain PHP, embed code can no longer use iframe srcdoc, and Bible text from remote APIs is filtered.<\/li>\n<li><strong>Bug fix:<\/strong> Works on PHP 8: the sermon list was always empty, and saving a sermon without a Bible passage or showing the popular sermons widget caused fatal errors.<\/li>\n<li><strong>Bug fix:<\/strong> No PHP errors, warnings, notices or deprecations on PHP 7.4 to 8.5 (tested on each), including for sermons without a Bible passage, missing files and new widgets. Translations are no longer loaded before init, which WordPress 6.7 and later warn about.<\/li>\n<li><strong>Bug fix:<\/strong> The popular sermons widget showed an empty entry in each list when a file wasn't attached to a sermon.<\/li>\n<\/ul>\n\n<h4>Earlier versions<\/h4>\n\n<p>The changes in 0.45.22 and earlier are in <a href=\"https:\/\/github.com\/markbarnes\/sermon-browser\/blob\/master\/CHANGELOG.md\">CHANGELOG.md<\/a> on GitHub.<\/p>","raw_excerpt":"Upload sermons to your website, where they can be searched, listened to, and downloaded. Easy to use, with help built in.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/3214","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=3214"}],"author":[{"embeddable":true,"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/mark8barnes"}],"wp:attachment":[{"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=3214"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=3214"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=3214"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=3214"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=3214"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/zul.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=3214"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}