ICS Calendar


Using a simple shortcode, you can embed any iCalendar-compatible feed (Google Calendar, Microsoft Outlook, macOS/iOS Calendar and many more) seamlessly into your WordPress site.

This plugin includes the PHP ICS Parser library by Jonathan Goode, John Grogg and Martin Thoma (MIT license).

Live Preview

You can preview your own calendar in any ICS Calendar view at our website: icscalendar.com/preview

Timezone Support

If your event times are off by an hour after Daylight Saving Time begins: Please check your WordPress timezone setting (Settings > General > Timezone) and make sure it is set to a city name, not a UTC offset. See FAQ for additional details.

As of version 6, customized timezone adjustments are supported. Events will default to displaying in the timezone of your site’s general settings. Use the tz setting and specify a region/city named timezone, as such: tz="America/Chicago"


Once the plugin is installed and activated, use the shortcode below to insert a calendar into your pages. See FAQ for details.


How do I find my calendar’s ICS feed URL?

Different calendar systems have different ways to obtain the feed URL. You may need to consult your calendar software’s documentation for assistance. You will also need to make sure that your calendar is public. Private calendars cannot be accessed by this plugin.

Documentation quick links:

How do I insert a calendar into my page?

Use this shortcode:

[ics_calendar url="ICAL_SUBSCRIBE_URL"]

Be sure you are using the subscribe URL (i.e. for importing into a calendar program), not the URL for viewing a calendar in a web browser.

Additional customization options can be found in WordPress admin under Settings > ICS Calendar.

If you are using the Classic Editor, you can also use the Add ICS Calendar button to build the customized shortcode automatically from a set of options.

Can I combine multiple calendars?

Yes! You can combine multiple calendars by including more than one feed URL in the url parameter. Separate the calendar URLs with one space. Do not include any other delimiter characters, as they will be interpreted as part of the URL.

Why isn’t my calendar loading?

This may be due to your server’s configuration. This plugin requires either the PHP cURL extensions, or the allow_url_fopen PHP setting to be turned on. Check your PHP configuration or your server administrator if you think this may be the issue.

Why isn’t my calendar updating?

For performance, this plugin uses WordPress transients to limit the number of times the ICS feed is loaded from the source. If you have updated events that are not showing up in your page, you can force the plugin to reload the ICS feed every time by adding reload="1" to the shortcode. Be sure to remove this when you no longer need to force reload.

Why are event times an hour off after Daylight Saving Time begins?

PHP has two different ways of defining timezones: as a number of hours offset from GMT/UTC (e.g. “UTC-5”), or as a continent/city combination (e.g. “America/Chicago”). Timezones using UTC offsets do not handle Daylight Saving Time correctly (as noted in the PHP documentation). Please check your WordPress timezone settings (Settings > General > Timezone). If it is set to a UTC offset, change it to the city closest to your location, in the same timezone.

(Earlier versions of this plugin had complicated timezone workaround settings, using tzoffset and tzignore which are now deprecated, but newer versions pull timezone data directly from the feed with none of the standard PHP/WordPress manipulations.)

Feature requests and such…

We are currently developing a new paid “Pro” add-on that will include additional layout options, tools for customizing the calendar’s appearance more easily than directly editing CSS, an improved insertion tool, and more. If you have suggestions for features you’d like to see or any other additional input, please let us know by following the support link on the admin page or in the WordPress support forums! The core plugin of course will always be free to use.


July 16, 2020
Great plugin - very flexible and clean. Does exactly as expected. Developer is super-helpful. Highly recommend!
July 1, 2020
I was looking a calendar add-on that I could add my existing ical feed to and have an actual calendar displayed on my site. This is exactly what this add-on does presenting the calendar in a clear tidy manner that I can add anywhere with a simple short code. I would suggest that the author adds a couple of screenshots or a demo page so that people can see the format because the text description does not do this add-on justice. Keep up the good work guys, and thank you.
February 20, 2020
This plugin is lightweight and works great. If I may, I'd like to request the ability to export any single event as another ICS file download by the end user!
January 20, 2020
Thank you for all of your work. Excellent quality. I'm using this on a web site that I'm developing to advertise a short term rental house. I like how it is able to pull in my calendar feeds from VRBO & AirBnB. The updates on those web sites feed in fairly quickly and keep my calendar current. I will likely subscribe to your paid version when you make it available. A few things that I would like to see; 1) multiple months display (six months would be terrific). 2) Better handling for checkout date. For example, if a guest is staying from January 1 to January 4 (January 4th being their check=out date), I'd like to see a half day on January 1 and a 1/2 day on January 4. Currently, with the way the dates feed from the other sites, this reservation would show January 1,2 & 3 Blocked/Booked, but nothing on January 4. 3) In this business we deal with what we call back-to-back stays. If a guest is departing on January 4th, and another guest is arriving on January 4th we call this a back-to-back booking. I need this to show on the calendar as 2 stays on the same day (1/2 day for each). this might be dependent on how the feed comes from AirBnB or VRBO so you have no control. 4) I'd like to be able and control the view based on device. I.e. - if the user is on a desktop, show monthly or 6 month view. If they are on a phone, weekly view. Thanks again. Excellent piece of work that I am getting some good use out of. There are some alternatives out there. I've chosen yours because it is free, it has good functionality, it works, and you are actively updating it. As mentioned, I'm likely going to be a subscriber when you go Pro.
Read all 20 reviews

Contributors & Developers

“ICS Calendar” is open source software. The following people have contributed to this plugin.


“ICS Calendar” has been translated into 2 locales. Thank you to the translators for their contributions.

Translate “ICS Calendar” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.


6.2.0 – 2020.10.23

  • Added monthnav attribute with options of select, arrows or both to choose how user navigates through months (month view only).
  • Added “Show past events”/”Hide past events” toggle in month view on mobile breakpoint (month view only).
  • Corrected documentation for default behavior when limitdays is not set.
  • Refactored jQuery interactive elements to better support multiple ICS Calendars on one page.
  • Removed @todo comment regarding refactoring how views iterate through dates. – 2020.10.22

  • Further refinements to tz parameter and timezone handling to avoid fatal errors if site does not have a timezone set and to default to WP timezone string instead of null if tz is not specified. – 2020.10.21

  • Reworked r34ics_get_feed_tz() to prevent thrown exceptions on an invalid timezone string. Added r34ics_is_valid_tz() function for support.
  • Fixed syntax error in r34ics_organizer_format() function.

6.1.2 – 2020.10.21

  • Changed condition for toggle event description excerpts so it can be used in pro and custom templates.
  • Fixed URL-encoded character output that may appear in event organizer names.
  • Changed r34ics_get_feed_tz() to using timezone_open() instead of new DateTimeZone to easily handle exceptions.
  • Updated i18n translation files with additional text strings. Added translations for Danish and Korean. Added localized translation versions for Austria, Belgium, Canada, Portugal, Spain, Switzerland. If you are interested in helping improve the accuracy of these machine translations please email us at support@room34.com.

6.1.1 – 2020.10.21

  • Added data-feed-color attribute to events to make color-based CSS customizations easier.
  • Used data-feed-color to remove unnecessary padding on events without a color background.
  • Added proper handling of empty color settings on multi-feed calendars.
  • Miscellaneous CSS refinements.

6.1.0 – 2020.10.20

  • Added legendstyle parameter with value options of “block” (default), “inline” or “none”. Will eventually replace legendinline parameter, which is functionally equivalent to legendstyle="inline".
  • Added legendposition parameter with value options of “above” (default) or “below”. Determines whether legend is displayed above or below the calendar itself.

6.0.0 – 2020.10.10

  • Refactored parsing of event dates and times to properly adjust for site’s local time zone. (Plugin previously used the feed’s embedded time zone with no adjustments.) IMPORTANT: This change may cause a time zone shift in your existing calendars if your WordPress time zone setting is incorrect or differs from the feed’s time zone. Be sure to check Settings > General > Timezone in your WordPress configuration, or use the new tz parameter (see below).
  • Added new tz parameter to allow overriding the site’s default time zone on an individual calendar. (See admin page for usage instructions.)
  • Bumped ICS Parser library to v. 2.1.20, which removes Carbon library dependency… and its own numerous dependencies. (Reduced this plugin’s overall weight by 82% by removing ICS Parser library’s vendor folder entirely, as ICS Parser’s dependencies are now only required for development on the library itself.) – 2020.10.06

  • Added CSS position and z-index properties to select dropdown and adjacent container to fix issue where select dropdown may be inaccessible due to default z-index stacking order. – 2020.09.25

  • Fixed incorrect variable name in two curl_setopt() calls added in version 5.10.0.

5.10.0 – 2020.09.23

  • Improved handling of 301 and 302 redirects in feed URLs and debugger details around URL retrieval.

5.9.2 – 2020.09.11

  • Added “Show/hide all” toggle checkbox on color key when the calendar is displaying 5 or more feeds.
  • Updated translations.
  • Added version check when enqueuing plugin’s JavaScript file.
  • Bumped “Tested up to” to 5.5.1.

5.9.1 – 2020.08.20

  • Added r3417_event_description_html_filter, r3417_event_label_html_filter and r3417_event_sublabel_html_filter filters to allow modification of event information display on a per-event basis. Used by the new Regular Expressions feature in “Pro” version.
  • Updated admin user guide with Developer documentation for the r34ics_display_calendar_filter_ics_data filter.
  • Updated admin sidebar with new information about the Pro version. – 2020.08.17

  • Modified logic for identifying all-day events to search for T000000 in datetime strings instead of T000000Z. (This change resolves an issue in at least one test case but may require further review. Please submit a support ticket if you are seeing new issues with all-day events.)

5.9.0 – 2020.08.17

  • Added r34ics_display_calendar_filter_ics_data filter to allow external filtering of ICS data prior to display.
  • Added link to live preview in readme.txt.
  • Bumped tested up to version to 5.5.

5.8.1 – 2020.07.15

  • Added r34ics_display_calendar_exclude_event filter to allow custom theme/plugin code to determine whether or not each event should be excluded from display. Note: This filter runs on the loop that parses events. Avoid redundant or processor-heavy logic in uses of the filter. (For example, if a query is being run, execute it outside of the filter and pass its results into the filter as global variable.)
  • Added customoptions attribute to shortcode. This attribute will never be used directly within the core ICS Calendar plugin, but may be used in ICS Calendar Pro or in customizations/add-ons to pass additional data into the shortcode for use within filters. Developers are advised to use the pipe delimiter to separate multiple discrete options within this attribute value, as the plugin will explode this option into an array on the pipe character.
  • Updated documentation. – 2020.07.10

  • Added missing input parameter to current_time() call in R34ICS::first_dow() method to resolve a fatal error that may occur in rare cases.
  • Changed jQuery in week view from using .show() and .hide() methods to using .css('display','table-row') to prevent layout issues with certain themes. – 2020.07.01

  • Added conversions of am/pm into their Greek equivalents in r34ics_time_format() function when site language is set to Greek. – 2020.06.30

  • Added value for CURLOPT_CAINFO in r34ics_url_get_contents() function for sites that are experiencing errors related to verifying peers. See this Stack Overflow post for more details.
  • Extended show/hide logic from v. to month headers in list view. – 2020.06.26

  • Modified jQuery for list view filters to hide day labels when all events scheduled for that day are hidden. – 2020.06.24

  • Fixed bug on week view that would cause the time on filtered-out events to continue displaying when the events themselves were hidden. – 2020.06.24

  • Changed HTML tags for .ics-calendar-VIEW-wrapper elements from div to article to work around glitch affecting at least week view when the color key is displayed. (Issue with use of :first-of-type selector.) – 2020.06.17

  • Added option to use pipes as the delimiter between multiple URLs and colors instead of spaces, to resolve an apparent conflict with the HivePress plugin that was causing the url attribute of the shortcode to be blanked out when used on a HivePress listing. – 2020.06.17

  • Fixed handling of an empty or irretrievable URL. No longer allows one empty URL to cause the entire calendar to fail when multiple URLs are provided.

5.8.0 – 2020.06.11

  • Bumped ICS Parser library to v. 2.1.19. (Core now incorporates my fix in src/ICal/ICal.php, line 1692.)
  • Added “Object moved” to set of values for detecting a URL rewrite. – 2020.05.16

  • Added missing documentation for feedlabel parameter.

5.7.2 – 2020.05.05

  • Added legendinline option to display color key legend as an inline list instead of stacked.
  • Encapsulated dynamic feed color CSS into r34ics_feed_colors_css() function and removed redundant code from each template file. – 2020.04.13

  • Minor CSS fix on color key checkbox alignment.
  • Bumped tested up to version to 5.4. – 2020.03.23

  • Removed unused Block Editor stub code to prevent WordPress plugin directory from falsely indicating Block Editor support. Sites can continue to use the shortcode with the Block Editor.

5.7.1 – 2020.03.22

  • i18n translation updates.
  • Corrected smart quote formatting on User Guide page.
  • Fixed admin page tabbing jQuery to apply to in-page links only. – 2020.03.12

  • Updated admin documentation page. No functionality changes from version 5.7.0.

5.7.0 – 2020.03.10

  • Fully removed all code related to deprecated tzoffset and tzignore parameters.
  • Added .multi-feed CSS class for future customizations of calendar display with multiple feeds.
  • CSS refinements. – 2020.03.10

  • Added necessary $args parameter to R34ICS::color_key_html() method to allow for conditional logic based on shortcode parameters.

5.6.1 – 2020.03.10

  • Added array of URLs to general $ics_data array to allow for easier manipulation.
  • Added r34ics_color_key_html_after_feed_title action to new R34ICS::color_key_html() method.

5.6.0 – 2020.03.09

  • Changed default transient expiration value from 10 minutes to 1 hour for better caching performance.
  • Added skiprecurrence option to omit instances of recurring events. Use of this setting is discouraged in most cases, as it will prevent recurring events from displaying; however it may be useful in cases with extremely large calendars, if recurrences are not needed.
  • Added checkboxes to show/hide events from individual calendars with color code key if present; encapsulated color code key logic/display in R34ICS::color_key_html() method. Moved color code keys above calendar for improved usability.
  • Minor CSS improvements for more consistent display across different themes.

5.5.1 – 2020.03.03

  • Improved support for recursively following feed URLs that may return a 301 or 302 status code (redirect).
  • Improved performance and reduced potential for out-of-memory errors on feeds with a large amount of data, by using ICS Parser library’s date filtering settings.
  • Added some conditional logic (including a modification to the ICS Parser library) to avoid PHP warnings when certain data is missing in the feed, involving recurrence and/or DTEND being formatted differently than DTSTART.
  • Additional debugger output, including ICS Parser date filter values and peak server RAM usage while parsing.
  • Removed some unused (commented-out) code.
  • Changed hardcoded transient expiration value to a stored setting. – 2020.03.01

  • Fixed bad path for sidebar include on admin page.

5.5.0 – 2020.02.28

  • Added new attach parameter to allow handling of attachments independent of eventdesc. Possible values are true, false, image and download. If omitted or blank, attachments will be displayed if eventdesc is true, as before. If set to image, only image attachments will be displayed. If set to download only download-type attachments will be displayed.
  • Modified layout for list view to display attached images right-aligned and reduced in size. This can be further modified to suit your needs by customizing .ics-calendar .event .descloc .attach_float in your CSS.
  • Adjusted margins and line height settings event descriptions for better readability.

5.4.1 – 2020.02.27

  • Added admin notice and documentation regarding incorrect display times after Daylight Saving Time begins. (Be sure WordPress is using a city-based timezone setting, not a UTC offset.)
  • Fixed bug in pastdays calculations in list and month view. – 2020.02.24

  • Rolled back changes to r34ics_boolean_check() until issues with the new logic can be resolved.

5.4.0 – 2020.02.20

  • Refactored r34ics_boolean_check() function to leverage core PHP filter_var() function.
  • Wrote logic (not yet implemented, pending further tests) to automatically replace http:// with https:// in feed URLs.
  • Added r34ics_display_calendar_range_start and r34ics_display_calendar_range_start filters.
  • Bumped ICS Parser library to v. 2.1.17.

5.3.0 – 2020.02.09

  • Added new CSS classes and updated jQuery scope to mitigate possible functionality conflicts when multiple calendars are displayed on one page.
  • Removed extraneous slashes in paths that use plugin_dir_path() function.
  • Added text color to select menus to resolve issue in some browsers when page text color is white.

5.2.9 – 2020.02.03

  • Added error handling for shortcodes with empty/missing URL.
  • Minor CSS adjustments.
  • Improved r34ics_boolean_check() function’s handling of string input.

5.2.8 – 2020.01.22

  • Added experimental skip parameter for use in conjunction with count in list view. (Presently undocumented, as functionality may change.)

5.2.7 – 2020.01.21

  • Added formatmonthyear parameter to customize formatting of month/year headers, dropdown menus, etc. – 2020.01.19

  • Reorganized admin template file structure.

5.2.6 – 2020.01.18

  • Additional hooks for template manipulation in Pro version. – 2020.01.17

  • Fixed bug that was preventing support sidebar from appearing on admin screen. – 2020.01.15

  • Fixed bug that was displaying event start time (from first day) on last day of multi-day events. – 2020.01.13

  • Updated new time format function with support for European-style formats with “h” and “min”/”m”.
  • Changed default fallback time format from “His” to “H:i”.

5.2.5 – 2020.01.12

  • Continued work to resolve persistent time calculation issues for various users by replacing time display formatting that relies on PHP or WordPress functions, all of which apply timezone calculations to a timestamp, with a simple custom function that assumes the time string provided is already the correct time and just formats it for display based on the desired format string. Defaults to WordPress Time Format setting if a custom format is not provided.

We are actively working to resolve these time display issues for all plugin users worldwide. Please contact us at support@room34.com if you are encountering any issues, and we will work with you to find a resolution. – 2020.01.09

  • Replaced all instances of PHP mktime() function with gmmktime() to prevent display date/month label miscalculations due to differences between server timezone and UTC.

Additional background information about this issue and the difficulty in troubleshooting it: If all date-handling functions are not using the same timezone offset, date/month labels might occasionally be “off by one” as a result of the difference between the server’s timezone and UTC. These miscalculations only occur during the hours of the day when the local timezone’s current date is different than the current date in UTC.

The problem occurs for as many hours in the day as local time is offset from UTC. East of UTC, it occurs after midnight, and west of UTC, before midnight. So, for example, in the “Asia/Tokyo” timezone, it happens between midnight and 9 AM. In the “America/Chicago” timezone (where this plugin is developed), it occurs between 7 PM and midnight (during Daylight Saving Time). Because most of the development work on the plugin has been during the day, the problem has not often been observable in troubleshooting.

Recent updates to the plugin have been focused on moving all date calculations into using UTC for consistency, but in several places, mktime() (which uses local server time) was being used in combination with other functions (like the WordPress wp_date() function) that were using UTC. By switching all instances of mktime() to gmmktime(), this issue should now be resolved.

5.2.4 – 2020.01.08

  • Added hidealldayindicator parameter.
  • Updated admin User Guide content.

5.2.3 – 2020.01.07

  • Added r34ics_empty_content() function for checking HTML strings for the presence of actual content. (Tests string by stripping spaces, non-breaking spaces, and all HTML except media tags.)
  • Added r34ics_empty_content() checks on some output methods to avoid rendering empty hover boxes. – 2020.01.06

  • Fixed bug that would prevent event descriptions (eventdesc) from displaying when set to "true".

5.2.2 – 2020.01.04

  • Fixed display of empty hover box on calendar events that have no description content.
  • Fixed logic limiting eventdesc excerpts to list view.
  • Changed handling of event description excerpts in list view from tooltip (which could not contain HTML formatting) to click-to-expand in the main body.
  • Changed positioning of month view event description hover boxes to mitigate issue of being partially hidden if a container element has overflow: hidden set.
  • Fixed a minor CSS issue with list view and color blocks in some themes.
  • Updated admin documentation regarding use of toggle parameter. (Now deprecated in favor of the new eventdesc excerpt handling.

5.2.1 – 2020.01.04

  • Fixed bug with eventdesc not shortening to an excerpt when an integer value is provided.
  • Fixed bug with HTML entities in event titles rendering as code instead of the correct characters.

5.2.0 – 2020.01.03

  • Added new pastdays option to allow previous months’ events to appear.
  • Removed less frequently used options from Add ICS Calendar admin overlay to streamline UX.

5.1.1 – 2020.01.01

  • Standardized base color palette and updated CSS.
  • Fixed version numbering discrepancy.

5.0.2 – 2019.12.31

  • Minor formatting adjustments to Add ICS Calendar insertion overlay.
  • Added feedlabel parameter. (Currently undocumented, as usage may change.)
  • Added shortcode input arguments to debugger output.
  • Fixed issue with default date display format on week view. – 2019.12.31

  • Corrected formatting of day labels using $wp_locale.
  • Refactored elements of admin pages for compatibility with changes in Pro version.

5.0.1 – 2019.12.31

  • Fixes critical issue with 5.0.0 that may cause some date labels to display one day earlier than the correct date.
  • Switched R34ICS::days_of_week() method to using global $wp_locale object instead of manual translations and removed day names from i18n files.

5.0.0 – 2019.12.30

  • Bumped WordPress requirement to 5.3 and PHP requirement to 7.0.0. WordPress requirement is due to the use of the new wp_date() function to replace date_i18n(). PHP requirement is because most actively supported OSes now ship with at least PHP 7.0.
  • Replaced all uses of date_i18n() with wp_date() (if translations are needed for display) or PHP date() function (if dates are being formatted for processing only). Currently also using date() to format time-only display, due to issues on certain servers with redundant timezone offset adjustments when using wp_date().
  • Added r34ics_date_format() and r34ics_hour_format() functions for improved i18n support.
  • Removed tzignore and tzoffset functionality due to unreliable results. These parameters are now ignored. All events are displayed at the time determined by the timezone for the overall feed or the individual event. An arbitrary timezone offset feature will be added back in a future version.
  • Redesigned admin User Guide screen and added a full list of all available shortcode parameters.

4.7.2 – 2019.12.28

  • Switched to local WordPress time zone rather than UTC for events that do not explicitly include a time zone (“float” times).
  • Refactored logic around start/end time calculations, “float” times and manual offsets.
  • Fixed a logic error that would carry over one feed’s tzoffset setting into the next feed, if it didn’t have its own, for shortcodes with multiple feed URLs.
  • Removed time calculation workaround logic that appears redundant with the most recent ICS Parser library update. This may have resulted in a “double calculation” of time offsets relative to UTC if both tzoffset and tzignore were set.
  • Fixed a bug in calculating displayed start and end times that was not reading the event’s year properly.
  • Corrected some minor CSS omissions due to classes present in our default test theme.
  • Updated User Guide page and help messages on Add ICS Calendar insertion overlay.

4.7.1 – 2019.12.19

  • Added columnlabels attribute to allow use of abbreviated day names in column headers on month and week views.
  • Refactored logic around using custom or default calendar titles and descriptions; changed preferred value for suppressing defaults from none to false.
  • Refactored r34ics_boolean_check() function.
  • Updated admin documentation with notes on the use of general WordPress settings for language, date and time formats, and first day of week.

4.7.0 – 2019.12.17

  • Updated ICS Parser library to latest version (2.1.16) which may resolve some fatal errors on certain Google Calendar feeds.
  • Updated some formatting and added ICS Calendar Pro beta sign-up link on ICS Calendar admin user guide page.
  • Modified shortcode output to not execute on admin pages, for performance and to prevent any fatal errors in the output from causing editing screens not to load. (This change may need to be reversed in the future when full Block Editor support is implemented.)
  • Updated “Tested up to” to version 5.3.1.

4.6.2 – 2019.12.12

  • Refactored logic for determining date range to force future empty months to display when limitdays is set and to improve performance.
  • Added missing admin documentation for the color attribute.
  • Added .multiday_first, .multiday_middle and .multiday_last CSS classes to customize appearance of events spanning multiple days.
  • Fixed PHP warning if feed is empty.
  • Changed debug output in footer from a closure to a named function.
  • Updated “Tested up to” to version 5.3.

4.6.1 – 2019.11.25

  • Added CSS box-sizing: border-box on all elements inside .ics-calendar for more consistent layout.
  • Fixed bug that may prevent list view (and possibly the others) from showing the correct range of events, by adjusting scope of dates initially considered by the parser.

4.6.0 – 2019.11.18

  • Added linktitles attribute to make event titles into clickable links if the event contains a URL.
  • Refactored logic for displaying event labels (titles) and sublabels into class methods. – 2019.11.01

  • Modified .no_phone and .phone_only classes to override conflicts in some themes. This is a temporary solution that will be improved upon in a future version.
  • Added aria-hidden="true" attributes to date values that were changed in version 4.4.1 to prevent redundant date descriptions in screen readers.

4.5.0 – 2019.11.01

  • Fixed bug that prevented week view from showing events from the previous month when a new month begins during the current week. (Adjusted date range of initial parser run.)
  • Refactored time zone logic so tzoffset works properly and can be used in conjuction with tzignore to override the feed’s time zone data. (Previously tzoffset only worked if the feed did not contain any time zone data.)
  • Added support for multiple tzoffset values (space-delimited) for calendars that include multiple feed URLs and need to use a different time zone setting for each feed.

4.4.1 – 2019.11.01

  • Added support for the format attribute in the mobile breakpoint only for month and week views. (Already supported in list view.)
  • Updated “Tested up to” to 5.2.4. – 2019.10.07

  • Changed CSS class for toggle attribute to work around third-party plugin conflicts.
  • Fixed PHP notice that may occur if events in feed don’t have an ATTACH array.

4.4.0 – 2019.10.01

  • Added maskinfo option to hide event details (e.g. for vacation rental availability).
  • Updated admin User Guide page with additional resource links and updated information about the upcoming Pro version.

4.3.1 – 2019.09.30

  • Added support for attachments in event descriptions. Images will be displayed inline; PDFs will be download links. For security purposes, other file formats are not supported at this time. (As with URLs, these will be included automatically when eventdesc="true" is set.)
  • Removed commented-out workaround code.

4.3.0 – 2019.09.27

  • Refactored and streamlined ICS event parsing code.
  • Encapsulated event detail HTML in new R34ICS::event_description_html() method for cleaner template code.
  • Added support for URLs in events (included in output when eventdesc="true" is set, rather than as its own parameter).
  • Added jQuery to open offsite links in a new tab. (Can’t be added to the HTML directly because it relies on the core WordPress make_clickable() function.) – 2019.09.25

  • Modified r34ics_url_get_contents() to convert ampersand entities in URL to plain ampersands.

4.2.0 – 2019.09.23

  • Added organizer option to display organizer information if included in the feed.
  • Added support for startdate to all views.
  • Fixed bug preventing description/location/organizer data from displaying in list view when toggle is off.
  • Refactored Add ICS Calendar button/overlay to work with multiple WYSIWYG editors, including those with delayed initialization (e.g. Advanced Custom Fields).
  • Moved debugger CSS to separate file that only loads for site admins.
  • Added hooks to admin Add ICS Calendar overlay.
  • Miscellaneous admin CSS/JS debugging and refactoring.

4.1.4 – 2019.09.23

  • Per multiple support requests, reversed order of location and description in all views.
  • Modified color calculation function to increase opacity of “highlight” color. – 2019.09.22

  • Fixed issue with conditional for color key below calendars, to avoid a PHP warning that was appearing when no colors are set.

4.1.3 – 2019.09.21

  • Corrected code for custom limitdays value to calculate starting from calendar’s first event date rather than the current date and subtracted 1 from calculated value to account for the first date.
  • Broke out r34ics_hex2rgba() as separate function.
  • Included additional fields in parsed event data for display manipulation in Pro version.
  • Updated hooks for Pro version.

4.1.2 – 2019.09.18

  • Added bypassworkaround="true" option to allow users to test bypassing some existing workarounds for time zone calculation errors in ICS Parser that may no longer be needed. If you are finding issues with time calculations, especially around switching into/out of Daylight Saving Time, please add this parameter to your shortcode and let us know in the WordPress support forum if it is helpful.
  • Modified handling of limitdays parameter. When set, it now applies a hard end date for the display range, rather than ending at the date of the last event in the feed.

4.1.1 – 2019.09.18

  • Added missing documentation of the tzoffset feature to the admin page.
  • Fixed broken month layout for months ending on a Sunday when site’s “Week starts on” value is set to a day other than Sunday.

4.1.0 – 2019.09.16

  • Added nomobile option to shortcode to block the standard functionality of displaying month and week views as lists on mobile. This feature should only be used if you will be writing your own CSS to improve the cramped display of the grid on mobile. Basic instructions on how to do this are included on the admin page. Additional notes: 1) This feature involves a CSS change, so you may need to clear your cache before you will see the change on the front end of your site. 2) This is intended as a simple workaround option for the free version of the plugin. Additional views are planned for the upcoming pro version, including an enhanced mobile display option for month and week views.

4.0.2 – 2019.09.15

  • Fixed issue with jQuery on admin page that may have been conflicting with other plugins’ admin pages (e.g. Postie).
  • Skipped version 4.0.1 due to misnumbering error in previous update. – 2019.09.13

  • Fixed issue with data-dow values not resetting to 0 on Sunday on fill cells at end of month view grid if site’s Start of week value is set to a day other than Sunday.
  • Updated “Tested up to” version to 5.2.3.

4.0.0 – 2019.09.12

Updates in this new version are primarily focused on preparing to support the new Pro version currently in development. The Pro version is designed as an add-on to the free version, so the free version will continue to receive ongoing enhancements and bug fixes.

  • Added conditional loading of ICS Parser library dependencies.
  • Added hooks to support Pro add-on.
  • Changed capabilities requirement to view admin page.
  • Reorganized admin navigation with dedicated menu item.

3.3.1 – 2019.09.09

  • Added startdate="today" option.
  • Modified logic for displaying color key, so it only appears if there are multiple calendars in the display.

3.3.0 – 2019.08.12

  • Refactored main ICS Parser call to pass date range restrictions into the parser rather than limiting the range after parsing, for better performance.
  • Updated ICS Parser library to version 2.1.13. This was done mainly to resolve a bug with how the previous version of the library (2.1.9) handled weekly recurrences with an interval greater than 1. (This version of the library reverts to allowing Carbon 1.3.9 or greater as well as 2.0 or greater; we have avoided Carbon version 2.0 due to its very large number of new dependencies causing instability in our builds.) We have not updated any of the dependencies.
  • Overhauled debugger output details and interface elements.
  • Additional notes on the experimental color attribute: You can hide or modify the Key that appears below the calendar using these CSS classes: .ics-calendar-color-key for the outer container; .ics-calendar-color-key-label for the word “Key” (not yet included in the translation files), and .ics-calendar-color-key-item for the color items themselves; use .ics-calendar-color-key-item[data-feed-key="n"] to alter individual items. (Replace “n” with the number of the item in the list, starting with 0.)
  • Added release dates to version number headers in readme.txt.
  • Hotfix: Fixed CSS so month/week grids always fill the container.
  • Hotfix: Fixed an issue that would cause the new debugger output to appear on all pages (for site admins only).
  • Hotfix: Changed date formats passed into new ICal::eventsFromRange() call from r to Y/m/d for better international compatibility.

3.2.2 – 2019.08.12

Note: This is a minor “housecleaning” update that does not add any new features or bug fixes.

  • File structure clean-up: split class-r34ics.php and functions.php out from main ics-calendar.php file.
  • Added Additional Resources links on admin page.
  • Swapped in new Room 34 logo. – 2019.08.11

  • Fixed bug that would prevent fixed start dates from working if they are in the past.
  • Fixed minor logic issues with new experimental color attribute that may cause the color key to appear when no colors are set. (Note: The feature still currently supports an unequal number of calendars and colors, meaning some calendars might not have a color, or some colors may appear in the key even though they are not assigned to a calendar.) Also fixed issue that would prevent calendar names from appearing in the key if a color was not assigned to it.

3.2.1 – 2019.08.09

  • Added CSS word hyphenation to prevent long words from running outside day blocks in the calendar grid. This is especially important for text in German. (Previous versions just hid the overflow; we needed to turn on overflow: visible in 3.2.0 to allow the hover blocks that replaced tooltips.
  • Improved debugging messages.
  • Added scope to all properties of the R34ICS object.
  • Added experimental color attribute. This feature is not yet officially documented, but testing and feedback are welcome. Use color="#ffffff" or, if you have multiple URLs, enter multiple values in the color attribute, space-separated, and those colors will be applied in the same order as the URLs. You are setting the base color (the accent on the left edge). The highlight color behind the text is the same color with a 20% alpha transparency applied. (A full-featured color customizer tool is planned for inclusion in the upcoming Pro version.)

3.2.0 – 2019.08.06

  • Added “fixed week” capability (displaying an arbitrary date range up to 7 days) using the startdate and limitdays attributes.
  • Replaced tooltips on event hover with formatted HTML hover block.
  • Added function to apply make_clickable() in descriptions only if they do not already contain HTML. This function also applies html_entity_decode() to all parsed string output, as well as applying nl2br() if make_clickable() is being applied.
  • Changed “currentweek” view to “week” (retained “currentweek” for backwards compatibility).
  • Fixed logic sequence in loop to exclude out-of-range dates, for improved performance.
  • CSS refactoring. IMPORTANT CHANGE NOTE: If you have customized your CSS using the .eventdesc or .location classes, there is now a wrapper on those elements called .descloc; your customizations may need to be applied to that class instead.
  • Updated “Tested up to” to 5.2.2.

3.1.1 – 2019.06.24

  • Fixed issue in Firefox where calendar dropdown menu would not refresh if the page was reloaded.

3.1.0 – 2019.06.24

  • Added limitdays parameter to override default limit of 365 days.

3.0.0 – 2019.06.11

  • Added support for multiple calendars by including more than one URL, space-separated, in the url parameter. Known issue: Because the URLs are passed in together, any rules in other parameters will be applied to all calendars. This may present a problem if, for example, one calendar requires the tzignore parameter and another does not. These types of calendars should be considered “incompatible” at this time, and not combined into one display.
  • Miscellaneous refactoring.

2.3.0 – 2019.06.11

  • Added tzignore option to allow bypass of ICS Parser library’s time zone conversions, which fail in certain instances.
  • Added debugging option. (Requires Administrator role to view.)
  • Updated ICS Parser library to version 2.1.9. (Note: ICS Parser recommends updating the Carbon library as well, but the latest version adds a very large number of additional dependencies that make this plugin unstable.) – 2019.03.17

  • Added workaround to issue where an Outlook ICS URL might return a “Found” HTML link instead of an actual ICS feed.
  • Added code for Block Editor (coming in version 3.0 — not yet functional).

2.2.1 – 2019.03.05

  • Added toggle attribute to allow for event description/location display to be toggled on/off by clicking an event title. – 2019.03.05

  • Removed phone_only class from location information in list view.

2.2.0 – 2019.02.28

  • Modified transients to store parsed data instead of raw data, to improve performance for feeds with a large number of events.

2.1.4 – 2019.02.26

  • Fixed grid layout issues in month view if site’s Week Starts On value is set to a day other than Sunday.

2.1.3 – 2019.02.23

  • Fixed bug introduced in version 2.1.0 that prevented list view from displaying properly.

2.1.2 – 2019.02.22

  • Restructured logic for empty calendars so grid still displays when there are no events in a given period on month and current week views.

2.1.1 – 2019.02.21

  • Added “current week” as option in Add ICS Calendar editor button pop-up (Classic Editor only).
  • Fixed ampersand entities and escape backslashes in readme file.
  • Additional improvements to admin help page.

2.1.0 – 2019.02.21

  • Cleaned up FAQs.
  • Added new URL retrieval function that tries cURL and then falls back on file_get_contents.
  • Added full currentweek template with previous/this/next week selector. Deprecated currentweek option in favor of view="currentweek".
  • Added admin notice if allow_url_fopen is off and cURL is unavailable.
  • Added error handling if no ICS data was retrieved.
  • Improved layout of admin help page.
  • Minor refactoring.

2.0.5 – 2019.02.18

  • Added currentweek option to display just the current calendar week in the month grid style.

2.0.4 – 2019.02.04

(No updates — checked in new version number to correct issue with previous checkin.)

2.0.3 – 2019.02.04

  • Added object property for current plugin version.
  • Added current plugin version variable to enqueue stylesheet.

2.0.2 – 2019.02.04

  • Updated ICS loading to allow URLs using the webcal:// protocol. (Plugin automatically converts to https://.) Also updated instructions page to make it clearer that ICS URLs may not always have the .ics filename extension.
  • Updated CSS to allow any element to use the .phone_only class, not just tags. (Mainly affects the display of event descriptions in month view.)
  • Fixed issues with relative text sizes of various elements in month view.

Note: If your site was relying on the previous functionality, you can override the hidden .phone_only class by adding the following line of code in Appearance > Customizer > Additional CSS:

.ics-calendar .phone_only { display: initial; }

2.0.1 – 2019.02.04

  • Fixed issue where events would not appear in the calendar if the ICS feed entry does not contain a DTEND value.

2.0.0 – 2019.01.22

  • Added Add ICS Calendar button to editor with visual tools for inserting shortcode into page. Notes: 1) Currently works only with Classic Editor plugin or in WordPress versions before 5.0. 2) Admin interface not yet translated for internationalization, although the output on the page will be translated as usual.

1.5.8 – 2019.01.21

  • Fixed an issue with some recurring all-day events not displaying as all-day after the initial instance.

1.5.7 – 2019.01.21

  • Added location display option.
  • Refactored some variables.
  • Added support for additional field display on all-day events.

1.5.6 – 2019.01.18

  • Added user_agent string before retrieving the ICS calendar feed, to address an issue where some sites such as Airbnb might return a 403 Forbidden error.

1.5.5 – 2019.01.18

  • i18n: Added Finnish, Italian, Norwegian and Swedish translations. (Machine translations; may need some work. Please contact us with suggestions for improvement.)

1.5.4 – 2019.01.18

  • Added description display to month view on phone breakpoint.
  • CSS text formatting adjustments (improved text scaling on phones; removed letter-spacing).

1.5.3 – 2019.01.18

  • i18n: Fixed bug that caused day/date in list view to always display in English.
  • Added showendtimes option to always display the end time instead of only displaying on hover.
  • Added eventdesc option to show event descriptions, with an optional word count limit.

1.5.2 – 2018.12.28

  • i18n: Added Chinese (Simplified), Dutch, Greek, Hungarian and Japanese translations.

1.5.1 – 2018.12.28

  • Modified list view to only show events on or after the current date. (Previously showed all events for the current month, including past dates.)

1.5.0 – 2018.12.06

  • Added list view with related options.
  • Added option to hide times.
  • Modified display of non-“all day” events that span across multiple days for clarity.
  • Fixed issue with times displaying in GMT if ICS file is missing time zone offset information.
  • Fixed bug with title=”none” and description=”none” options.
  • Added a workaround for an unresolved issue that may cause All-Day events to appear between 9 AM and 10 AM instead of at beginning of day.
  • Updated transient to cache raw ICS file data instead of processed data; allowing modification of output without needing to force a reload of the ICS file from the server.

1.4.1 – 2018.11.19

  • Fixed translations that were not appearing properly.
  • Fixed bug in translation string format for multi-day events with start and end times.

1.4.0 – 2018.10.31

  • Refactored calendar loop to include months between the first and last month in the feed that do not have any events.
  • Replaced all calls to default PHP date() function with WordPress date_i18n() function to ensure proper formatting.
  • Added WordPress current_time() function to determination of today’s date to avoid time zone issues around midnight.
  • Fixed missing HTML tag when a feed returns no events.
  • Added ability to hide title and/or description with title=”none” or description=”none” in shortcode.
  • Added plugin icon.

1.3.0 – 2018.10.23

  • Added full i18n support.
  • Added these translations: German, English (Australia), English (United States), Spanish (Mexico), French, Portuguese (Brazil). (Note: All languages are machine-translated. Please contact us if you would like to assist in our translation efforts!)

1.2.1 – 2018.10.02

  • Added support for multi-day events. (Thanks to Henry Brink for identifying this issue and proposing a solution.) – 2018.09.20

  • Updated readme file for clarity.

1.2.0 – 2018.09.20

  • Fixed time zone error that was overcompensating for site’s offset from GMT. (The included third-party ICS Parser library apparently double-applies the time zone offset when time zone data is present in individual events.)
  • Added support for WordPress “Week Starts On” setting.
  • Moved events’ end time from direct display into tooltip on hover over start time, for cleaner appearance.
  • Inserted tag after any slashes in event label output, to prevent run-on lines overflowing table cells.
  • Added date limit to avoid memory issues with very large calendars. Currently hardcoded to 365 days, but will be a configurable option in version 2.0.
  • Added partial support for translations. Full language support coming in version 2.0.

1.1.4 – 2018.08.22

  • Added missing CSS class to display day of week in grid on phone layout only.

1.1.3 – 2018.07.27

  • Added support for localized time format.
  • Removed debugging code that would display for administrators in version 1.1.2.

1.1.2 – 2018.07.27

  • Ran composer update to fix missing dependencies in ics-parser library.
  • Removed recurrence handling code that was no longer needed with ics-parser library updates.

1.1.1 – 2018.07.26

  • Added handling for all-day events.
  • Added handling of multiple events with same start date/time.
  • Fixed start/end time bug affecting feeds that don’t include the time zone in every event.
  • CSS improvements.
  • Updated ics-parser library to version 2.1.4.

1.1.0 – 2018.07.26

  • Added explicit cell widths to CSS.
  • Added donation option to admin page.
    • Fixed bug that would cause all event end times to be 12:00am.
  • Removed unnecessary use of .siblings() jQuery method on month select dropdown.

1.0.1 – 2018.05.15

  • Added handling for empty calendars.
  • Updated “Tested up to” version.

1.0.0 – 2017.05.31

  • Initial release version.