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 adddebug="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
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.5 – 2024.04.05
- AJAX:
- Fixed logic that replaces
FILTER_SANITIZE_STRING
(introduced in version 10.13.1.1) to properly account for array values in shortcode parameters.
- Fixed logic that replaces
- List and basic views:
- Eliminated unnecessary JavaScript fade-in on load, except when
pagination
orajax
option is in use.
- Eliminated unnecessary JavaScript fade-in on load, except when
10.14.1.4 – 2024.04.01
- General:
- Fixed issue with
extendmultiday
where it would extend one-day events as well as multi-day events.
- Fixed issue with
- List and basic views:
- Added detection of the “current” page when pagination is turned on. The page will now automatically load with the page containing the current date displayed, instead of the first page, making list and basic views with pagination more useful when
pastdays
is set to include past events in the list. (Note: The pagination is set independently of the date, so it’s possible the page may still load with a few past events displaying before the current date’s events, but the current date’s events will be on the page.) - Minor template code refactoring.
- Added detection of the “current” page when pagination is turned on. The page will now automatically load with the page containing the current date displayed, instead of the first page, making list and basic views with pagination more useful when
- Month and week views:
- Added call to
r34ics_show_hide_headers()
function when clicking “Show past events” on mobile, as a possible solution to a client-side issue with date headers not displaying when the window is left open over a break between months. (Due to the nature of the bug, it can only be tested at the transition between months.)
- Added call to
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 reportICS Calendar AJAX request failed for element...
to the JavaScript console. (Previous versions would fail in this way after one attempt.)
- Added failure handling that will retry the AJAX request up to 5 times in situations where the AJAX response is only
- Bug fix:
- Modified conditional introduced in version 10.14.1.2, to resolve possible
Undefined array key "VALUE"
PHP warnings.
- Modified conditional introduced in version 10.14.1.2, to resolve possible
- Misc:
- Removed unnecessary
global $wp_locale;
line from all templates. - Added
changelog.txt
and moved older changelogs to that file; truncated changelog inreadme.txt
to comply with WordPress repository requirements.
- Removed unnecessary
- 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-preferredwp_add_inline_script()
inR34ICS::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).
- Replaced
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 addedr34ics_ajax_start
andr34ics_ajax_end
events. - Two changes to address the issue of AJAX requests occasionally outputting only “1” instead of the calendar:
- 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. - 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.
- Encapsulated AJAX client-side logic in a new
- JavaScript:
- Added JavaScript version of
r34ics_boolean_check()
function.
- Added JavaScript version of
- 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.
- Added text underline to events that have a clickable description when the
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 defaultselect
). - Fixed bug that would prevent “Show past events” link from appearing in mobile breakpoint under certain conditions.
- Added “Today” link to header navigation. Requires
- 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 settingreload
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
andhtmltageventdesc
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 tor34ics_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 addnostyle="true"
to your shortcode. This view supports most of the same parameters (and associated functionality) as List view, includingcount
,pagination
,color
,eventdesc
andtoggle
. - All views: Added
<span>
wrapping of date elements (day of week, month, day number, year, etc.) with a newdata-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.
- Added new “Basic” view. Use
- 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 toabove
rather thanbelow
. - Minor code refactoring in
templates/calendar-list.php
andfunctions.php
.
- The
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.
- Streamlined URL validation code added in v.10.12.0.4 to remove redundant custom logic, and instead rely on the WP core
- 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 fromr34ics_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 fortoggle
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.