Easily add any iCalendar feed (Google Calendar, Microsoft 365, iCloud Calendar, etc.) to your WordPress site. Auto-updating, loads of options.
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.
You can preview your own calendar in any ICS Calendar view at our website: icscalendar.com/preview
We’ve made it easier than ever to get started using ICS Calendar with our new online shortcode builder: icscalendar.com/shortcode-builder
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).
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.
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:
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.
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.
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.
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.
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.)
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.
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.
admin_options
with settings
for consistency with changes in 11.3.2.r34ics_memory_limit_mb()
and r34ics_memory_limit_select()
functions.)r34ics_display_calendar_event_item
filter on certain multi-day events.r34ics_init_start
and r34ics_init_end
custom events to pass an elem
parameter, containing the DOM object that called the r34ics_init()
function. On calendars not loaded via AJAX, the function runs on initial page load, and the value passed is null. When the calendar is loaded via AJAX, the object is the div.r34ics-ajax-container
element for that calendar. This allows custom functions using this event to have access to the properties of the DOM element, including the id
attribute, so developers can write calendar-specific JavaScript.class_exists()
and removed some ICS Calendar Pro-specific JavaScript by using the r34ics_init_end
event.r34ics_raw_feed_strip_dtend_none()
function (using the r34ics_display_calendar_preprocess_raw_feed
filter) to handle edge cases where feeds include the invalid DTEND:None
. (This is an identified issue with easyVerein calendars.)basicauth
parameter in conjunction with the R34ICS_FEED_BASICAUTH
constant in your wp-config.php
file.)feedlabelindesc
so feed color dot only appears in event details hover box, and not in inline descriptions; added styling for feed labels in lightbox.r34ics_display_calendar_event_item
filter. This filter runs immediately before a parsed event gets added to the data array for the calendar, allowing you to modify any event details as needed. This is very similar to our second example use case for the existing r34ics_display_calendar_filter_ics_data
filter, minus the need for five nested foreach
loops!img
from div
to figure
.eventdl
to reflect site locale instead of hardcoding EN
.feedlabelindesc
parameter and related functionality.R34ICS::shortcode_feed_array_params
property and logic to split pipe-delimited, feed-related parameters into arrays for easier logic elsewhere, plus related functionality, including r34ics_shortcode_feed_array_params
filter. (This is used by feedlabelindesc
and may be used by other future enhancements.)r34ics_has_desc()
function to support feedlabelindesc
.eventlocaltime
parameter. Will display all times in the local timezone of the individual event, if applicable. Note: When this parameter is used, the timezone abbreviation T
will automatically be appended to the timeformat
parameter while parsing the shortcode.T
(timezone abbreviation) in timeformat
parameter. Note: Currently only supports placing T
at the end of the string. (The timezone abbreviation will be inserted at the end of the time output, regardless of where T
appears in the timeformat
string.)fulldateintable
parameter. By default, month and list views show only the day number in the table on desktop breakpoints, and use the date format defined by the format
parameter for mobile breakpoints. When fulldateintable="true"
is set, the format
value will be used to display the date in the table on desktop as well.R34ICS
class already being defined, to prevent a potential fatal error on plugin activation.r34ics_views
filter to add any custom view template names to the list.r34ics_update()
if the version number has changed, not just if it has increased.R34ICS
class.hidecancelledevents
and hidetentativeevents
shortcode parameters. These hide events with a STATUS
value of CANCELLED
or TENTATIVE
, respectively.?? null
) with short ternary operators (?: ''
) setting empty strings rather than null values for event properties. This should not produce any noticeable changes in most cases, but may occasionally allow for values to be returned that have been missing in the output under the old logic.maskinfo
parameter to account for changes in the ics-parser library.R34ICS::get_list_style_views()
and r34ics_list_style_views
filter to allow external addition of list-style views for certain conditional logic.R34ICS::display_calendar_date_range()
to reduce memory usage and processing time for calendars with a large number of recurring events.r34ics_display_calendar_after_args
action.posts_per_page
site option; cast pagination value as integer when set; fixed missing #
in previous/next pagination URLs. Fixed two jQuery bugs.r34ics_is_block_editor()
function, and logic to prevent unnecessary processing potentially occurring on Block Editor screens.r34ics_shortcode_before_display_calendar
and r34ics_shortcode_after_display_calendar
. These actions fire off in R34ICS::shortcode()
before and after the call to R34ICS::display_calendar()
.add_action()
to add_filter()
for r34ics_display_calendar_exclude_event
in class-r34ics.php
.gzdecode()
in R34ICS::_url_get_contents()
because wp_remote_get()
already does that. Eliminates appearance of numerous related PHP warnings in log files.R34ICS::_url_get_contents()
to address some additional edge case issues introduced with the switch to wp_remote_get()
in version 11.0.0 that were not fully resolved by the 11.0.0.1 update. Specifically, added customized handling of 301 and 302 redirects to use the Location
header returned in the response object, rather than relying on the built-in redirection in wp_remote_get()
, which was causing some hosts (including Google Calendar) to reject the request.R34ICS::_url_get_contents_legacy()
method. For sites that are still not successfully retrieving feeds with the fixes added in 11.0.0.1, this option reverts to using the old method for requesting feeds using cURL and fopen functions.(Note: Version 11.0.0.2 was intentionally removed due to a logistical issue.)
PLEASE NOTE: This version includes a significant rewrite of the function that retrieves the contents of ICS feed URLs. It is now using the built-in wp_remote_get()
WordPress function (instead of PHP cURL and fopen functions as before), so it should be fully compatible with all existing installations. However, if you encounter any new issues, please visit the WordPress Support Forums for assistance.
wp_remote_get()
in R34ICS::_url_get_contents()
method. Correspondingly, deprecated the curlopts
and method
parameters. Note: The second and fourth parameters of the protected method R34ICS::_url_get_contents()
were removed rather than deprecated. No external plugins should be using this method other than ICS Calendar Pro, which has been correspondingly updated.r34ics_is_playground()
function to detect if running in WordPress Playground.r34ics_event_description_html
action.r34ics_system_report()
in rare situations where get_option('active_plugins')
returns a plugin that is not included in get_plugins()
. (May occur if the plugin has been manually removed from the file system.)R34ICS::event_description_html()
to handle $event['start_time']
and $event['end_time']
as alternatives to $event['start']
and $event['end']
.ics-calendar.php
..ics-calendar-arrow-nav > *.inactive
to completely hide inactive arrow navigation elements (e.g. “Previous” while on first month, “Today” while on current month, etc.) rather than screening back their opacity. Modified jQuery corresponding to these elements to dynamically add aria-hidden="true"
when inactive
class is added.Changelog truncated here due to WordPress repository requirements. Please see changelog.txt
for older logs.