{"id":370926,"date":"2026-10-05T03:07:18","date_gmt":"2026-10-05T03:07:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/belltime-events-calendar\/"},"modified":"2026-10-05T03:06:55","modified_gmt":"2026-10-05T03:06:55","slug":"belltime-events-calendar","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/belltime-events-calendar\/","author":23560846,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.0","stable_tag":"0.1.0","tested":"7.1.2","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"Belltime Events Calendar","header_author":"WeCode","header_description":"Events with full recurrence, per-event time zones and an outgoing iCal feed. The times stay right across daylight saving and time zone database changes.","assets_banners_color":"727888","last_updated":"2026-10-05 03:06:55","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/belltimecalendar.pages.dev\/","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":104,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.0":{"tag":"0.1.0","author":"frostydev","date":"2026-10-05 03:06:55","revision":3728003}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3728003,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3728003,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3728032,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3728032,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"belltime\/events":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"belltime\/events","version":"0.1.0","title":"Belltime Events Calendar","category":"widgets","icon":"calendar-alt","description":"Belltime: a list or month view of your events, with recurrence expanded as the page is read.","keywords":["belltime","events","calendar","schedule","ical"],"textdomain":"belltime-events-calendar","attributes":{"view":{"type":"string","default":""},"limit":{"type":"number","default":0},"days":{"type":"number","default":0},"category":{"type":"string","default":""},"month":{"type":"string","default":""}},"supports":{"html":false,"align":["wide","full"]},"editorScript":"belltime-events-editor","style":"belltime-events"}},"tagged_versions":["0.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3728032,"resolution":"1","location":"assets","locale":"","width":1280,"height":960},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3728032,"resolution":"2","location":"assets","locale":"","width":1280,"height":960},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3728032,"resolution":"3","location":"assets","locale":"","width":1280,"height":960},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3728032,"resolution":"4","location":"assets","locale":"","width":1280,"height":960},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3728032,"resolution":"5","location":"assets","locale":"","width":1280,"height":960},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3728032,"resolution":"6","location":"assets","locale":"","width":1280,"height":960}},"screenshots":{"1":"The event editing screen, showing date, start time, length and timezone, with the\nrepeat rule below.","2":"Every date a repeat rule produced, listed under the event. This one is a six week\ncourse, so there are exactly six.","3":"Cancelling a single occurrence of a series, leaving the other dates untouched.","4":"The month grid on the front end.","5":"The list view on the front end.","6":"The settings screen: two steps to a first calendar with the shortcode to copy, then the\ndefault layout, the address of the events page and how far ahead to show."}},"plugin_section":[],"plugin_tags":[416,4745,1486,7103,5881],"plugin_category":[40],"plugin_contributors":[284373],"plugin_business_model":[],"class_list":["post-370926","plugin","type-plugin","status-publish","hentry","plugin_tags-calendar","plugin_tags-event-calendar","plugin_tags-events","plugin_tags-ical","plugin_tags-recurring-events","plugin_category-calendar-and-events","plugin_contributors-frostydev","plugin_committers-frostydev"],"banners":{"banner":"https:\/\/ps.w.org\/belltime-events-calendar\/assets\/banner-772x250.png?rev=3728032","banner_2x":"https:\/\/ps.w.org\/belltime-events-calendar\/assets\/banner-1544x500.png?rev=3728032","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/belltime-events-calendar\/assets\/icon-128x128.png?rev=3728003","icon_2x":"https:\/\/ps.w.org\/belltime-events-calendar\/assets\/icon-256x256.png?rev=3728003","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/belltime-events-calendar\/assets\/screenshot-1.png?rev=3728032","caption":"The event editing screen, showing date, start time, length and timezone, with the\nrepeat rule below."},{"src":"https:\/\/ps.w.org\/belltime-events-calendar\/assets\/screenshot-2.png?rev=3728032","caption":"Every date a repeat rule produced, listed under the event. This one is a six week\ncourse, so there are exactly six."},{"src":"https:\/\/ps.w.org\/belltime-events-calendar\/assets\/screenshot-3.png?rev=3728032","caption":"Cancelling a single occurrence of a series, leaving the other dates untouched."},{"src":"https:\/\/ps.w.org\/belltime-events-calendar\/assets\/screenshot-4.png?rev=3728032","caption":"The month grid on the front end."},{"src":"https:\/\/ps.w.org\/belltime-events-calendar\/assets\/screenshot-5.png?rev=3728032","caption":"The list view on the front end."},{"src":"https:\/\/ps.w.org\/belltime-events-calendar\/assets\/screenshot-6.png?rev=3728032","caption":"The settings screen: two steps to a first calendar with the shortcode to copy, then the\ndefault layout, the address of the events page and how far ahead to show."}],"raw_content":"<!--section=description-->\n<p>Belltime Events Calendar is an events calendar for sites where a wrong time has a\ncost \u2014 venues, studios, course providers, conference organisers. It does three\nthings carefully and leaves the rest alone.<\/p>\n\n<p><strong>Recurring events, in full, in the free plugin.<\/strong> Not just \"every week\": intervals,\noccurrence counts, end dates, ordinal weekdays such as the second Tuesday or the\nlast Friday, days of the month counted from either end, months of the year,\nset positions, explicit extra dates, and cancelled dates. If your quiz night is\nevery other Tuesday and your class is the first Saturday of the month, the plugin\nexpresses both and produces the right dates for them.<\/p>\n\n<p><strong>Occurrences are never database rows.<\/strong> A weekly class running for two years is one\nevent with one rule, not 104 posts in your database, your sitemap and every other\nplugin's queries. The dates are worked out when a page is drawn. No scheduled job\ngenerates anything, and there is nothing to reconcile when you edit a series.\nCancelling or moving a single occurrence records only that exception \u2014 the rest of\nthe series keeps its dates and its links.<\/p>\n\n<p><strong>Times that stay right.<\/strong> Every event stores a wall-clock time, a length, and the\nname of its timezone. That combination is what keeps a 19:00 event at 19:00 after\nthe clocks change, keeps a two-hour event two hours long across a daylight-saving\ntransition, and lets a touring show carry the local time of each city it plays. When\nthe timezone database is updated, the derived values are recalculated rather than\nleft to drift.<\/p>\n\n<h4>What it includes<\/h4>\n\n<ul>\n<li>Events with title, description, featured image, location, organiser, link, categories and tags<\/li>\n<li>Per-event timezone, overriding the site default where needed<\/li>\n<li>All-day events<\/li>\n<li>Full recurrence, as described above, expanded when the page is drawn<\/li>\n<li>Move, rename or cancel a single occurrence without touching the series<\/li>\n<li>Month grid and list views, as a block and as a shortcode<\/li>\n<li>Archive and single-event views from the post type<\/li>\n<li>An outgoing iCal feed visitors can subscribe to in their own calendar app<\/li>\n<li>Add-to-calendar links for Google, Outlook and .ics on each event<\/li>\n<li>Documented filters and actions so other plugins can extend it<\/li>\n<\/ul>\n\n<h4>What it deliberately does not do<\/h4>\n\n<ul>\n<li><strong>No ticketing, checkout, cart or bookings.<\/strong> This is a calendar. Link to whatever\nsystem already holds your inventory.<\/li>\n<li><strong>No maps, geocoding or address lookup.<\/strong> Location is free text.<\/li>\n<li><strong>No telemetry of any kind.<\/strong> See \"External services\" below.<\/li>\n<li><strong>No work on pages the calendar is not on.<\/strong> Seven callbacks are registered, and each\nreturns on its first line wherever the calendar is not involved. The plugin autoloads\ntwo small options and does nothing else until something asks it to draw a calendar.<\/li>\n<li><strong>No database tables.<\/strong> Events are posts, categories are terms, and nothing in the\nWordPress schema is altered.<\/li>\n<\/ul>\n\n<h4>Pro<\/h4>\n\n<p>A separate paid add-on adds incoming synchronisation: subscribing to .ics feeds from\nGoogle Calendar, Outlook and Microsoft 365, Apple iCloud, Nextcloud, Teamup and\nanything else that speaks iCalendar, with several calendars at once and a panel\nshowing when each last synced and what failed. It is not required, and\nnothing here is limited or disabled without it.<\/p>\n\n<p>This plugin mentions the add-on only to administrators, and only on its own screens: a\n\"Sync from other calendars\" tab and a dismissible line on its settings screen, a line\nin the \"Get started\" box while the events list is empty and a button on the list once\nit has events, a dismissible line when adding an event once one already exists, and a\nlink in its own row on the Plugins screen. Nothing appears in the block editor. None of\nthem is a site-wide notice or a dashboard widget, none opens by itself, none shows a\nprice, and all of them disappear once an add-on is active. Details are on the plugin's\nhome page, which is the Plugin URI on this listing.<\/p>\n\n<h3>External services<\/h3>\n\n<p><strong>This plugin does not use any external services.<\/strong> It makes no outbound network\nrequests of any kind: no licence check, no update check, no usage statistics, no\ntelemetry, no error reporting, and no request to any third party. Nothing about your\nsite, your events or your visitors is transmitted anywhere by this plugin.<\/p>\n\n<p>The outgoing iCal feed this plugin publishes is served from your own site. When a\nvisitor subscribes to it, their calendar application requests it from your server\ndirectly; no third party is involved and no request is made from your site to anyone.<\/p>\n\n<p>The separate paid add-on does contact a licence and update service, and discloses that\nin its own documentation. That add-on is not this plugin and is not distributed here.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>In your WordPress admin, go to Plugins, then Add New, and search for\n\"Belltime Events Calendar\".<\/li>\n<li>Press Install, then Activate.<\/li>\n<li>Go to Settings, then General, and make sure the site timezone is a named city such\nas <code>Europe\/Copenhagen<\/code> rather than a fixed offset such as <code>UTC+1<\/code>. A fixed offset\ndoes not know when your country changes its clocks, and every event will be an hour\nout for half the year. This is the single most common cause of wrong event times on\nWordPress sites, and it is not specific to this plugin.<\/li>\n<li>An <strong>Events<\/strong> menu appears. Create an event, set its date, its start time as it\nappears on a wall clock, and how long it runs.<\/li>\n<li><p>Add the <strong>Belltime Events Calendar<\/strong> block to a page \u2014 it is under <em>Widgets<\/em> in the block\ninserter \u2014 or use the shortcode:<\/p>\n\n<p>[belltime_events]<\/p>\n\n<p>The shortcode takes optional attributes:<\/p>\n\n<p>[belltime_events view=\"month\"]\n[belltime_events view=\"list\" limit=\"5\" days=\"90\" category=\"concerts\"]<\/p>\n\n<p>Visitors can subscribe to your calendar at <code>\/belltime-calendar.ics<\/code>.<\/p><\/li>\n<\/ol>\n\n<p>If your site's PHP or WordPress version is older than this plugin requires, it will\nnot load and will tell you so in an admin notice. It will not take your site down.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20create%20a%20post%20for%20every%20occurrence%20of%20a%20repeating%20event%3F\"><h3>Does it create a post for every occurrence of a repeating event?<\/h3><\/dt>\n<dd><p>No. One event carries one recurrence rule and the dates are calculated when a page is\ndrawn. Only exceptions \u2014 a cancelled or moved occurrence \u2014 are stored, and there is\none record per exception rather than per occurrence.<\/p><\/dd>\n<dt id=\"which%20recurrence%20rules%20are%20supported%3F\"><h3>Which recurrence rules are supported?<\/h3><\/dt>\n<dd><p>FREQ (daily, weekly, monthly, yearly), INTERVAL, COUNT, UNTIL, WKST, BYDAY including\nordinals such as 2TU and -1FR, BYMONTHDAY including negative values, BYMONTH,\nBYSETPOS, plus EXDATE and RDATE. If the plugin meets a rule it cannot expand, it shows\nthe base occurrence and says so in an admin notice rather than silently producing\nwrong dates.<\/p><\/dd>\n<dt id=\"can%20each%20event%20have%20its%20own%20timezone%3F\"><h3>Can each event have its own timezone?<\/h3><\/dt>\n<dd><p>Yes. The site timezone is the default and any event can override it. Useful for\ntouring productions, online courses and organisations operating in more than one\ncountry.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20a%20two-hour%20event%20that%20crosses%20a%20daylight-saving%20change%3F\"><h3>What happens to a two-hour event that crosses a daylight-saving change?<\/h3><\/dt>\n<dd><p>It stays two hours long. The plugin stores a duration rather than an end time, which\nis what keeps the length correct across a clock change in either direction.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20the%20block%20editor%20and%20with%20page%20builders%3F\"><h3>Does it work with the block editor and with page builders?<\/h3><\/dt>\n<dd><p>Both. There is a block for the block editor and a shortcode for classic editors,\nwidget areas, page builders and theme templates. Both take the same options and\nproduce the same output. The plugin's settings screen shows the shortcode in its\n\"Get started\" box, so you can copy it without leaving the page. Its attributes are\n    view, <code>limit<\/code>, <code>days<\/code>, <code>category<\/code> and <code>month<\/code>, and they are documented here.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20my%20site%20down%3F\"><h3>Will it slow my site down?<\/h3><\/dt>\n<dd><p>It should cost nothing on pages that do not contain a calendar. Seven callbacks are\nregistered \u2014 two for the calendar feed (<code>template_redirect<\/code>, and <code>redirect_canonical<\/code> so\nthe feed address is not redirected), one on <code>pre_get_posts<\/code> for the events archive, two\non the content filters, and two on the date filters so an event shows its own date\nrather than the day it was published \u2014 and every one of them returns on its first line\nwhen the request is not about events. No scheduled task is\nregistered, no database table is created, and exactly two small options are autoloaded.\nThis is worth verifying yourself with Query Monitor rather than taking on trust.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20events%20if%20i%20delete%20the%20plugin%3F\"><h3>What happens to my events if I delete the plugin?<\/h3><\/dt>\n<dd><p>They stay. Deleting the plugin removes its options and its cached values, and leaves\nyour events in the database. Removing them as well is a checkbox you have to tick\ndeliberately before deleting, because a deletion that cannot be undone should never\nbe the default.<\/p><\/dd>\n<dt id=\"does%20it%20import%20from%20google%20calendar%20or%20outlook%3F\"><h3>Does it import from Google Calendar or Outlook?<\/h3><\/dt>\n<dd><p>Not in this plugin. Incoming synchronisation is in the separate paid add-on described\nin the Description section. This plugin publishes an outgoing feed but does not read\nanyone else's.<\/p><\/dd>\n<dt id=\"i%20use%20a%20page%20cache%2C%20and%20the%20month%20grid%20highlights%20the%20wrong%20day\"><h3>I use a page cache, and the month grid highlights the wrong day<\/h3><\/dt>\n<dd><p>That is the cache, and it is worth knowing about rather than working around. The month\nview marks today while the page is built on your server. A full-page cache then serves\nthat same HTML to everyone until it expires, so if the page was built yesterday, the\nhighlight is on yesterday.<\/p>\n\n<p>Nothing else in the calendar is affected: dates, times and the order of events are all\nproperties of the events themselves, and they stay right. Only the \"today\" highlight\ndepends on when the page was rendered.<\/p>\n\n<p>We have deliberately not fixed this with JavaScript. The frontend of this plugin ships\nnone at all, which is what lets it work inside caches, AMP-style output and strict\ncontent security policies without special cases, and a highlight is not worth giving\nthat up. If it matters on your site, exclude the page from your cache, or set the cache\nlifetime to expire nightly.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"An events calendar with complete recurring events, per-event timezones and an outgoing iCal feed. No ticketing, no limits, nothing locked.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/370926","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=370926"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/frostydev"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=370926"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=370926"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=370926"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=370926"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=370926"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=370926"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}