ICS Calendar

Description

Using a simple shortcode, you can turn any iCalendar subscription (ICS) feed (Google Calendar, Microsoft Office 365, Apple iCloud, Airbnb, Vrbo, and many more) into a seamlessly integrated, auto-updating, zero-maintenance WordPress calendar.

Continue to manage your events in the calendar software you’re already using! You’ll automatically have an up-to-date calendar in your WordPress website with no extra work.

Display your calendar in month, list or week view. Many additional customization options are available. See our User Guide for full details.

No API keys required!

Works with ANY calendar software that generates a public iCalendar subscription link.

Live Preview

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

Shortcode Builder

We’ve made it easier than ever to get started using ICS Calendar with our new online shortcode builder: icscalendar.com/shortcode-builder

Language Support

All date strings (days of the week, months, etc.) are automatically translated into your site’s configured language (under Settings > General > Language) and date/time formats using core WordPress functionality. All text content for the calendar itself is displayed as-is from the feed.

The small amount of additional front-end displayed text generated by the plugin defaults to U.S. English, but also supports the following translations: Chinese, Danish, Dutch, Estonian, Finnish, French, German, Greek, Hungarian, Italian, Japanese, Korean, Latvian, Lithuanian, Norwegian, Polish, Portuguese, Russian, Spanish and Swedish.

Please contact us if you would like us to add support for your language!

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

Installation

Once the plugin is installed and activated, use the shortcode below (adding your own ICS feed URL between the quotation marks) to insert a calendar into your pages. Use our online Shortcode Builder to easily create a customized shortcode, or consult the User Guide for more information.

[ics_calendar url=""]

Be sure you are using the iCalendar subscription (ICS) URL (i.e. for importing into a calendar program), not the URL for viewing a calendar in a web browser. To test if you have the correct URL, paste it directly into your browser address bar. It should download an .ics file, not display the calendar in the browser.

FAQ

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. Find instructions for commonly used calendars below.

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, inserting your ICS feed URL between the quotation marks:

[ics_calendar url=""]

Be sure you are using the iCalendar subscription (ICS) URL (i.e. for importing into a calendar program), not the URL for viewing a calendar in a web browser. To test if you have the correct URL, paste it directly into your browser address bar. It should download an .ics file, not display the calendar in the browser.

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 or a pipe | character. 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. You can also add debug="true" to your shortcode and view your page to see debugging output which may provide additional details about any connection issues.

Why isn’t my calendar updating?

For performance, this plugin uses WordPress transients to store retrieved calendar data for one hour between requests to the calendar source server. If you have updated events that are not showing up in your page, visit the ICS Calendar page in your site admin and click the Clear Cached Calendar Data button.

Third-party caching plugins may interfere with ICS Calendar’s feed syncing. If you are using a caching plugin and your calendar is not updating, try using the AJAX option in your shortcode.

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. As of version 6.0 you can also set the timezone within the shortcode using the tz parameter. (Again, be sure to use a named region/city timezone, not a UTC offset.)

Additional documentation and support

Our User Guide includes extensive documentation of all features of the plugin, is frequently updated, and is translated into all languages supported by the plugin.

Feature requests

The paid ICS Calendar Pro add-on includes additional layout options, tools for customizing the calendar’s appearance more easily than directly editing CSS, an improved insertion tool, and more. We are also constantly adding new features and refinements to both the free and paid versions. 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 base plugin will always be free to use.

Reviews

16 February, 2024
Lots of functionality in the free version, intuitive, and the plugin author responds in support forum. Can't ask for much more than that. Thank you!
21 novèmber, 2023
I've been wanting to use an embedded Google Calendar in our nonprofit's website so volunteers could update the info but it's just too plain and ugly. ICS Calendar solves that and the free version has plenty of options for us. Upgrade to Pro is very reasonable but I can't find a reason why we would need that. Thanks to the devs!
06 novèmber, 2023
Out of the box the plugin looked and functioned amazingly without the need to too much additional styling. Developing the shortcodes was very easy and great options for various configurations. Their support team has been extremely responsive and very helpful to get us up and running. I highly recommend!
14 yüli, 2023
The best thing about this plugin is not how easy it is to use, nor how well it works, but the support offered by its creators.It's great!
29 June, 2023 4 replies
Works fine, the biggest Problem was the cache settings and the understanding in google calendar with public/private events. Can recommend. Regarding GDPR it would be great to inform, if any additional information is needed that need's to be listed when using this plugin Edit: thanks for the instant reply, there is no data collected
Read all 59 reviews

Contributors & Developers

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

Contributors

“ICS Calendar” has been translated into 6 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.

Changelog

10.14.1.3 – 2024.03.08

  • AJAX:
    • Added failure handling that will retry the AJAX request up to 5 times in situations where the AJAX response is only 1 instead of the proper calendar HTML output. After the fifth failure, AJAX will report ICS Calendar AJAX request failed for element... to the JavaScript console. (Previous versions would fail in this way after one attempt.)
  • Bug fix:
    • Modified conditional introduced in version 10.14.1.2, to resolve possible Undefined array key "VALUE" PHP warnings.
  • Misc:
    • Removed unnecessary global $wp_locale; line from all templates.
    • Added changelog.txt and moved older changelogs to that file; truncated changelog in readme.txt to comply with WordPress repository requirements.
  • Bumped ‘tested up to’ version to 6.5.

10.14.1.2 – 2024.03.06

  • Added a workaround for a possible issue with the ics-parser library on recurrence exclusions (EXDATE) where excluded event dates are still being included in the output array.
  • Updated embedded ics-parser library to v. 3.3.1 (carrying over existing modifications).

10.14.1.1 – 2024.02.21

  • JavaScript:
    • Replaced wp_localize_script() with the now-preferred wp_add_inline_script() in R34ICS::enqueue_scripts() method. Fixes an issue where the “localized” script was not actually rendering in the page in some situations.
    • Modified logic that hides “Show past events” on mobile month/week views, when there are no past events in the current month, to account for the .month_list_all class (an ICS Calendar Pro-only feature).

10.14.1 – 2024.01.25

  • Added Remove “Add ICS Calendar” button in Classic Editor admin option to leverage the existing r34ics_display_add_calendar_button action without the need for custom PHP code.
  • Added r34ics_purge_calendar_transients action to allow external cleanup functions to fire off on the Clear Cached Calendar Data utility.
  • JavaScript: added type casting to r34ics_boolean_check() function to prevent occasional AJAX loading errors.
  • i18n: New translation strings.

10.14.0 – 2024.01.11

  • AJAX:
    • Encapsulated AJAX client-side logic in a new r34ics_ajax_init() function, and added r34ics_ajax_start and r34ics_ajax_end events.
    • Two changes to address the issue of AJAX requests occasionally outputting only “1” instead of the calendar:
    1. Added a check on the R34ICS::display_calendar() method for transient data containing only “1” instead of the calendar, bypassing the transient cache if true.
    2. Added handling to the AJAX output itself to suppress display of the “1” if it still occurs, and write an error message to the console. We are still investigating the root cause of this issue.
  • JavaScript:
    • Added JavaScript version of r34ics_boolean_check() function.
  • List view:
    • Added text underline to events that have a clickable description when the toggle option is turned on, to give users a visual cue.

10.13.1.1 – 2023.12.16

  • AJAX: Replaced FILTER_SANITIZE_STRING, deprecated in PHP 8.1, with a new sanitization method, and added conditional to prevent processing the AJAX output if URL is missing.

10.13.1 – 2023.12.08

  • Basic view:
    • Switched event layouts to use CSS flexbox instead of float, to address issues where long event titles may force all text to wrap below the date block.
    • Additional minor CSS adjustments.
  • Month view:
    • Added “Today” link to header navigation. Requires monthnav to be set to an option that includes the previous/next arrows (all except the default select).
    • Fixed bug that would prevent “Show past events” link from appearing in mobile breakpoint under certain conditions.
  • i18n: Added new translation strings.

10.13.0.2 – 2023.12.04

  • Added missing logic to turn off caching if debug="3" is set; refactored logic for setting reload value.
  • Adjusted CSS for event hover effects to improve performance in some views in the Pro version.
  • Narrowed jQuery selector scope for pagination logic in List and Basic views, to fix a conflict with some views in the Pro version.

10.13.0.1 – 2023.11.28

  • Fixed a display bug introduced in v.10.13.0 that would cause broken HTML code to appear directly on the page for some sites. (The default values for the new htmltageventtitle and htmltageventdesc parameters were not being set correctly for sites with the Use new parameter defaults (v.10.6) setting turned off.)
  • Renamed new r34ics_filter_allowed_heading_tags() function to r34ics_allowed_heading_tags_check(), since it’s not technically a filter.
  • Hotfix: Added .event-info wrapper element in Basic view to prevent longer event descriptions from wrapping below the floating date block element.

10.13.0 – 2023.11.27

  • New Features:
    • Added new “Basic” view. Use view="basic" in your shortcode. This is a variant of List view that does not group events by date/month. By default, the date of each event is displayed in a prominent date box. For a “true” basic view, also add nostyle="true" to your shortcode. This view supports most of the same parameters (and associated functionality) as List view, including count, pagination, color, eventdesc and toggle.
    • All views: Added <span> wrapping of date elements (day of week, month, day number, year, etc.) with a new data-date-format attribute on each tag. Allows for custom styling of the components of a date. This feature is used for the date boxes in the new Basic view, but also allows for custom styling of List view.
  • New shortcode parameters:
    • htmltageventdesc: Sets the HTML tag used for the .eventdesc element on events.
    • htmltageventtitle: Sets the HTML tag used for the .title element on events.
    • htmltagtime: Sets the HTML tag used for the .time element.
    • nostyle: Turns off most of Basic view’s default HTML styling for a “true” basic view that you can customize with your own CSS. (Currently has no effect on any other views.)
  • New filter:
    • r34ics_display_add_calendar_button: Use with the __return_false function to turn off the “Add ICS Calendar” button in Classic Editor.
  • Functionality changes:
    • The paginationposition parameter in List and Basic views now defaults to above rather than below.
    • Minor code refactoring in templates/calendar-list.php and functions.php.

10.12.2 – 2023.11.13

  • Admin Utilities:
    • Removed raw data output from ICS Feed URL Tester utility.
    • Minor refactoring of r34ics_system_report() function.
  • Security:
    • Streamlined URL validation code added in v.10.12.0.4 to remove redundant custom logic, and instead rely on the WP core [wp_http_validate_url()](https://developer.wordpress.org/reference/functions/wp_http_validate_url/) function. This change also adds the ability for site developers to use the [http_request_host_is_external](https://developer.wordpress.org/reference/hooks/http_request_host_is_external/) filter to selectively grant access to specific internal network URLs, e.g. for retrieving ICS feeds from locally hosted mail/calendar servers.
    • Restricted debugging data collection to users with the Administrator role, and removed raw retrieved URL data from all debugging tools.
  • i18n:
    • Updated translation strings.
  • Vendors:
    • Updated ICS Parser library to 3.3.1 (with modified namespace, as usual, to avoid plugin conflicts).

10.12.1 – 2023.11.06

  • Bug fix: Corrected CSS logic for combinemultiday that would incorrectly display event titles if site’s Week starts on value was anything other than Sunday.
  • CSS: Tweaks to compact in Month and Week views.
  • Hooks: Added r34ics_eventdesc_include_time_and_title filter. This allows for additional external conditionals to determine whether or not the time and title for events should be included in the .eventdesc element.
  • Misc: Removed a few redundant lines of code.

10.12.0.4 – 2023.10.30

  • Added an extra security check for extremely rare conditions where the security fix added in versions 10.12.0.2 and 10.12.0.3 may not have been adequate. This fix has been backported to all earlier affected versions of the plugin in the repository.

10.12.0.3 – 2023.10.24

  • Critical bug fix: Addresses an additional condition of the same issue first addressed in 10.12.0.2. This is not a second bug, rather a more thorough and effective solution to the same bug. This fix has been backported to all earlier affected versions of the plugin in the repository.
  • Minor code refactoring.

10.12.0.2 – 2023.10.23

  • Critical bug fix: Addresses a security issue identified in earlier versions of the plugin. Per best practices we are not identifying the specific details of the issue or the fix. This fix has been backported to all earlier affected versions of the plugin in the repository.
  • Removed unnecessary retrieval of /etc/issue file contents from r34ics_system_report() function. (This is unrelated to the critical bug fix noted above.)

10.12.0.1 – 2023.10.16

  • Bug fix: Added stopPropagation() to jQuery logic for toggle feature. The modified selector added in version 10.12.0 was inadvertently causing the code to run twice (instantly re-closing the toggle) when clicking on the event title itself.

10.12.0 – 2023.10.06

  • a11y: Added tabindex="0" to all events and corresponding CSS changes to make event hover descriptions tab-accessible. Note: We are still troubleshooting some issues with tabbing to links contained within the description block. However, we are releasing this feature as-is due to the immediate accessibility improvements it can offer.
  • Developer: Removed deprecated filter names.

Changelog truncated here due to WordPress repository requirements. Please see changelog.txt for older logs.