=== ICS Calendar ===
Contributors: room34
Donate link: https://icscalendar.com
Tags: iCalendar, Google Calendar, Office 365, events, ICS feed
Requires at least: 4.9
Tested up to: 6.9
Requires PHP: 7.2
Stable tag: 11.7.0.4
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html

Easily add any iCalendar feed (Google Calendar, Microsoft 365, iCloud Calendar, etc.) to your WordPress site. Auto-updating, loads of options.

== 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](https://icscalendar.com/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](https://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](https://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](https://icscalendar.com/shortcode-builder/) to easily create a customized shortcode, or consult the [User Guide](https://icscalendar.com/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.

== Frequently Asked Questions ==

= 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:_

* [Google Calendar](https://support.google.com/calendar/answer/37083#link)
* [Microsoft Office 365](https://support.office.com/en-us/article/share-your-calendar-in-outlook-on-the-web-7ecef8ae-139c-40d9-bae2-a23977ee58d5)
* [Apple iCloud](https://www.macobserver.com/tips/quick-tip/icloud-configure-public-calendar)

= 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](https://icscalendar.com/icsdocs/#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](https://www.php.net/manual/en/timezones.others.php)). 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](https://icscalendar.com/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](https://icscalendar.com) 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](https://wordpress.org/support/plugin/ics-calendar/)! The base plugin will always be free to use.

== Changelog ==

= 11.7.0.4 - 2025.12.08 =

* Performance:
  * Due to observed issues with some sites using `reload` in ways that exceed request rate limits, causing providers like Google Calendar to put temporary blocks on IP ranges, the `reload` option is now forced to a minimum value of 120 (2 minutes), _unless_ `debug` is also set to `2` or higher. **The `reload` option is intended for troubleshooting only.** If your calendar updates more frequently than once per hour, the best option is to change the **Transient (cache) expiration** setting to a lower value. Recommended value: 300 (5 minutes).

= 11.7.0.3 - 2025.11.30 =

* Added dynamic cookie handling when interacting with source servers that send cookies. May resolve an issue for Google Calendar users in Europe. If you are experiencing this issue, please note that it may take up to 24 hours after you apply this update for your calendars to reappear. [Your feedback is requested.](https://icscalendar.com/support) Also please note that these changes _only_ apply if you have the legacy feed request method turned _off._ That feature is deprecated and will not be receiving further feature updates. If you are currently using the legacy feed request method, you are encouraged to try turning it off and see if your site is now able to load feeds with the standard method.
* Added `r34ics_get_all_options()` function to retrieve all ICS Calendar options for the admin utility **Clear Cached Calendar Data** with the **Also reset all ICS Calendar settings** option checked. There is currently no way (even with filters) to force the WP core function `wp_load_alloptions()` to retrieve non-autoload options. (See [this note](https://developer.wordpress.org/reference/functions/wp_autoload_values_to_autoload/#comment-7430) for details. It's unclear whether this is a performance-focused intentional decision or a bug in the core `wp_autoload_values_to_autoload()` function.)
* Removed `r34ics_curl_cookie_path()` function and deprecated code that used it.

= 11.7.0.2 - 2025.11.28 =

* Appended real user agent string when retrieving feeds from Google Calendar.

= 11.7.0.1 - 2025.10.29 =

* Delayed application of `r34ics_shortcode_defaults_new_10_6` filter until other plugins are loaded.

= 11.7.0 - 2025.10.27 =

* schema.org structured data: _BETA_
  * Added `jsonld` shortcode parameter (and related `r34ics_event2jsonld()` function) for adding [JSON-LD structured data](https://schema.org/Event) to calendar output. This is still a beta/experimental feature. We have confirmed that our generated test code passes [validation](https://validator.schema.org), but we need to observe some real-world testing to determine whether or not the output needs additional refinements to match Google's expectations for structured event data. This feature is _off_ by default. To use it, add `jsondl="true"` to your shortcode. And please send your [feedback](https://icscalendar.com/support/) on how it works for you! **IMPORTANT: Because Google requires each event in the structured data to have a designated URL, _only_ events that have a URL are included in the structured data ICS Calendar generates.** (See [Google's documentation](https://developers.google.com/search/docs/appearance/structured-data/event) for more information.)
* Miscellaneous:
  * Bumped 'tested up to' to 6.9.

= 11.6.0 - 2025.10.10 =

* Print: _BETA_
  * Added `print` shortcode parameter, which will add a print button at the top of your calendar. Use `print="true"` to print the calendar with basic event info (time and event title), or `print="descriptions"` to include all event descriptions. (This works independently of how the event descriptions appear on-screen.) **Important: You MUST be using AJAX to render your calendar to use the `print` parameter.** You can accomplish this either by adding `ajax="true"` to your shortcode, or by turning on the **Always use AJAX to render calendars** setting.
  * Improved print CSS, now retains calendar colors. _Note: It is impossible for us to test all potential site configurations; if you experience problems with the new print colors, please [submit a support request](https://icscalendar.com/support)._
* Dark Mode: _BETA_
  * Resolved conflicts that mostly broke dark mode after adding new element-based CSS variables in v. 11.5.15.
* i18n:
  * Updated translation strings.
  * Added missing en_GB translation files. (Introduced in v. 11.5.17.4 but inadvertently omitted from repository.)

_The print and dark mode features are currently considered BETA and are subject to change._

= 11.5.17.4 - 2025.10.06 =

* a11y:
  * Added ARIA attributes and `label to HTML `select` tags in Month and Week views, and previous/next arrows in Month view.
* i18n:
  * Added English (UK) translations. _Note: Machine translations sometimes fail to replace US spellings with UK spellings. If you are using UK English and notice any US spellings in ICS Calendar output after this update, please [let us know](https://icscalendar.com/translation-suggestions/)._
  * Updated translation strings.

= 11.5.17.3 - 2025.10.03 =

* Fixed conflict between `combinemultiday` and `linktitles`.

= 11.5.17.2 - 2025.09.23 =

* Minor code tweak on admin utilities page.

= 11.5.17.1 - 2025.09.18 =

* Admin: Minor CSS tweaks.
* Utilities: Added option for **Clear Cached Calendar Data** utility to also reset all ICS Calendar settings to their defaults.
* i18n: Updated translation strings.

= 11.5.17 - 2025.09.17 =

* Added basic stub support for the [iCalendar `COLOR` property](https://icalendar.org/New-Properties-for-iCalendar-RFC-7986/5-9-color-property.html) (and the similar, vendor-specific `X-APPLE-CALENDAR-COLOR`). There is currently no functionality around this property, but events that contain `COLOR` will now include a `data-color` attribute on their HTML wrappers, which can be used with custom CSS or JavaScript to modify the appearance of the events.
* Added `CATEGORIES` and `COLOR` to the event properties that are masked by the `maskinfo` parameter.
* Changed color of spinner animation on AJAX loading to gray for optimal visibility on both light and dark backgrounds.
* Removed empty jQuery function for `r34ics_init_end` event.

= 11.5.16.1 - 2025.09.04 =

* Admin settings:
  * Added deprecation notice to **Use legacy feed request method** option.
  * Removed **Permanent feed URL mask IDs** option and associated logic. Feed URL mask IDs are now always permanent.
* Bug fix: Removed code related to the now-removed **Permanent feed URL mask IDs** option, that was causing the **Clear Cached Calendar Data** utility to exit early if that option was turned off (default). This issue may have been preventing some calendars from updating.
* Miscellaneous: Admin CSS tweaks.
* i18n: Updated translation strings.

= 11.5.16 - 2025.09.01 =

* Admin:
  * Refactored ICS Feed URL Tester with additional response details.
  * UI visual refinements on admin page.
* i18n: Updated translation strings.

= 11.5.15.1 - 2025.08.26 =

* Additional refinements to recent user agent string changes. Modified the default user agent string to conform to the [spec](https://httpwg.org/specs/rfc9110.html#field.user-agent). Updated legacy request method user agent strings. Note: The recently implemented fixes for Microsoft 365 support are available with the newer request method only. If you are using Microsoft 365 calendars, please turn _off_ the **Use legacy feed request method** setting on the ICS Calendar admin page.
* Fixed a fatal error that occurs when `organizer="true"` is set and the organizer name contains commas. (The `ics-parser` library explodes the name into an array.)
* Removed a status message from the **ICS Feed URL Tester** utility that encourages turning on the legacy request method. The legacy method will be removed in a future update.
* Added deprecation notice for legacy parser when in debug mode.
* Changed `$debug` and `$debug_messages` from `public` to `protected` in `R34ICS` class.
* Minor CSS refactoring (alphabetized color variables).

= 11.5.15 - 2025.08.20 =

* AJAX:
  * Added `r34ics_ajax_js_args` filter and `data-js-args` attribute to HTML output when using AJAX. This allows for arguments that need to be accessed by JavaScript.
* CSS: Created a new set of CSS variables based on element context rather than colors, to allow for specific adjustments to the style of the relevant elements. An extended [CSS Guide](https://icscalendar.com/css-guide/) will be available soon on our website.
* Modified Microsoft Office 365 user agent solution (added in 11.5.14.4) to _append_ the Windows/Edge user agent string to the standard ICS Calendar user agent string, rather than replacing it. This is verified to still resolve the issue, while retaining ICS Calendar's user agent details.

= 11.5.14.4 - 2025.08.19 =

* Resolved an issue with Microsoft Office 365 calendars not loading after recent Microsoft changes. Requests for Microsoft source feeds now use a real web browser user agent string (Windows/Edge) instead of ICS Calendar's default user agent.
* Fixed a boolean/integer variable type issue in the `R34ICS::_url_get_contents()` method that may "Increment on type bool has no effect" warnings under PHP 8.
* Corrected required minimum PHP version from 7.0 to 7.2. (The code that requires PHP 7.2 is in the `ics-parser` library, and has been present in ICS Calendar since 2018.)

= 11.5.14.3 - 2025.08.14 =

* Removed `load_plugin_textdomain()` call (restored in 11.3.4.4 after initially being removed in 11.3.4.3). A user reported on 2025.08.13 that the call was causing "triggered too early" warnings, although we have been unable to duplicate. Current best practice is to omit this function call altogether, but we had left it in due to observed issues in WP 6.7 with some portions of the plugin not being translated without it; however our current testing under WP 6.8.2 does not indicate any translation problems with the call omitted. If you are receiving error messages or if some translations appear to have gone missing after this update, please let us know in the [support forums](https://wordpress.org/support/plugin/ics-calendar/).

= 11.5.14.2 - 2025.08.11 =

* AJAX: Refactored AJAX request method to remove shortcode parameter details from front-end HTML. AJAX requests now only pass a key string, which must match the existing shortcode configuration on the back end.
* Bug fix: Resolved an issue when multiple month view calendars with different date ranges are included on the same page, where the page might load with no month selected in one or more of the calendars if the `r34icsym` query string variable is outside that calendar's date range. (Previously all calendars were evaluated by jQuery simultaneously; now each is evaluated individually.)

= 11.5.14.1 - 2025.08.06 =

* Bug fix: Modified conditional in `r34ics_colors_match_theme_json()` function to avoid possible 'Undefined array key "color"' error logs.

= 11.5.14 - 2025.08.01 =

* Admin:
  * Added icons and Support link to tab bar; updated text of Pro promo.
* Debugging:
  * Added `R34ICS::shortcode_required_params` property to allow for error messages when required parameters are missing. (Technically `url` and `view` are both required; however, `view` defaults to `"month"` if omitted.)
  * Added new settings to System Report and debugger panel.
  * Refactored logic in `R34ICS::display_calendar()` to initiate debug mode earlier.
  * Moved debugging output function call outside of excessively restrictive conditional on AJAX requests.
  * Removed deprecated debug function aliases.
* i18n:
  * Updated translation strings.

**Note:** Debugging-related changes in this version originated from a user observation that shortcode attributes are ignored if the shortcode is entered on multiple lines. _Shortcodes are intended to be entered on a single line; adding line breaks inside your shortcode may yield unpredictable results. This is due to how WordPress itself handles shortcodes prior to handing off the shortcode details to ICS Calendar._

= 11.5.13 - 2025.07.23 =

* Added **Default shortcode** setting on the ICS Calendar Settings admin page. This is useful for sites that will contain a large number of calendar shortcodes with mostly identical parameters. Individual shortcodes' settings will override the default, but only need to include the parameters that are unique.
* Added [PHP_CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Advanced-Usage) code comments where relevant.
* i18n: Updated translation strings.

= 11.5.12.7 - 2025.07.20 =

* Admin: Added **Permanent feed URL mask IDs** setting, to address an issue with Cloudflare (and possibly other caching systems) where pages may continue to request old masked feed URL IDs after they have been cleared/expired.
* CSS: Added `!important` to `text-align` and `vertical-align` in month grid views to force override of theme CSS.
* Miscellaneous: Minor code refactoring.
* i18n: Fixed text domain for two translation strings on admin page; updated translation strings.

= 11.5.12.6 - 2025.07.12 =

* CSS: Added `!important` to margin and padding on list elements in month grid views to force override of theme CSS.

= 11.5.12.5 - 2025.07.03 =

* Admin:
  * Changed order of tabs.
  * Added conditional to hide Settings tab if user doesn't have administrator-level access.
  * Updated link list on Getting Started page.
  * Updated presentation of ICS Calendar Pro promotion and admin sidebar postbox.
  * Minor CSS tweaks.
* i18n: Updated translation strings.

= 11.5.12.4 - 2025.06.20 =

* Added `$trim` parameter to `R34ICS::_url_get_contents()` method (defaults to `true`). This was added because of an observed issue with ICS feeds generated by the Simply Schedule Appointments plugin, which contain several lines of blank space at the beginning. The ics-parser library ICS Calendar uses specifically checks for `BEGIN:VCALENDAR` as the first line in the file when validating input, causing these feeds to fail to load. Trimming the retrieved data prior to parsing resolves the issue.

= 11.5.12.3 - 2025.06.20 =

* Fixed issue with the `r34ics_purge_calendar_transients()` function (the function used by the **Clear Cached Calendar Data** utility) that was causing the **Transient (cache) expiration** setting to get reset. This problem was exacerbated by the change introduced in version 11.5.12 that automatically runs the utility every time the ICS Calendar settings are saved. (A SQL statement in the function needed backslashes added for literal underscores.)

= 11.5.12.2 - 2025.06.12 =

* On Multisite installations, added "network active" plugins to System Report.

= 11.5.12.1 - 2025.06.04 =

* Fixed bug in new `r34ics_colors_match_theme_json()` that prevented transient storage of the adjusted CSS color palette.
* Added logic to `r34ics_colors_match_theme_json()` to handle situations where dark mode is on but the theme's color palette has too few colors defined. (Previously any remaining ICS Calendar colors were being kept at their defaults; they're now being inverted using an `hsl()` color formula.)

= 11.5.12 - 2025.06.03 =

* Block Themes / Site Editor Styles:
  * Added **Match calendar color palette to current Block Theme colors** setting. For sites that are using color palettes defined in a Block Theme or with the Site Editor, this option automatically replaces ICS Calendar's default neutral gray color palette with closest-match colors from your theme's color palette. _Note: This is a BETA feature and is still in development. Added and/or modified several color-related functions in `functions.php`. [Feedback](https://icscalendar.com/support) on this feature is welcomed._
  * Modified CSS and some logic for `solidcolors` and `whitetext` to accommodate the **Dark mode** option under the new **Match calendar color palette to current Block Theme colors** setting.
  * **Clear Cached Calendar Data** utility now runs automatically when saving ICS Calendar settings or Site Editor configuration, so any changes to these settings will take effect immediately without needing to manually run the utility.
* Bug Fixes: Fixed issue in Week view that might cause "Double timezone specification" PHP fatal errors after changes introduced in version 11.5.11.1.
* i18n: Updated translation strings.

= 11.5.11.1 - 2025.05.28 =

* Changed output of `r34ics_first_day_of()` and `r34ics_last_day_of()` functions to be strings in `Y-m-d` format, rather than Unix timestamps. This resolves a timezone related issue where the returned date may actually be one day earlier than intended, causing Month view to display one extra past month, showing only the events on the last day of that month. (Note: Because the output of these functions has changed, corresponding changes were made to code that handles the output of the functions where they are called in `class-r34ics.php`.)

= 11.5.11 - 2025.05.16 =

* Event downloads (`eventdl`):
  * Added "Save to your calendar" text in addition to icon. You can revert to the previous icon-only display by changing the shortcode parameter from `eventdl="true"` to `eventdl="minimal"`.
  * Fixed output errors in downloaded `.ics` files when the event includes the `EXDATE` or `RDATE` property.
* Admin page: Updated promotional content.
* CSS: Removed base64 encoding on embedded SVG background images, to reduce data size and eliminate unnecessary obfuscation.
* i18n: Updated translation strings.

= 11.5.10.1 - 2025.05.09 =

* Bug fix: Basic and List views now handle `paginationposition="both"` correctly.
* Improved error handling in `r34ics_uniqid_url()` function and `R34ICS::shortcode_defaults_merge()` method.

= 11.5.10 - 2025.05.02 =

* Actions and Filters:
  * Added actions to Month and Week view templates: `r34ics_display_calendar_after_day_label` and `r34ics_display_calendar_after_events_list`. As the names indicate, these actions allow for custom output after the day label and day events lists for each day in the table in these views. Hooked functions have access to four input parameters: `$view`, `$args`, `$date` and `$day_events`.

= 11.5.9.1 - 2025.04.28 =

* Modified `r34ics_url_tester_result_debug` hook to be able to account for situations where the response is empty.
* Vendors:
  * ics-parser: Changed timezone string mappings for "(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius" and "FLE Standard Time" from "Europe/Kiev" to "Europe/Helsinki". This is because the ics-parser library uses the spelling "Kiev", whereas ICS Calendar code uses the spelling "Kyiv". This discrepancy was causing time calculation issues, specifically for Microsoft source calendars, which use the "FLE Standard Time" designation. "Europe/Helsinki" was chosen to avoid alternate spelling confusion, and also because "FLE" stands for "Finland Latvia Estonia", making Helsinki a more logical choice than Kyiv. (Both cities share the same timezone rules.)

= 11.5.9 - 2025.04.24 =

* Added `wp_get_remote()` status check to System Report; refactored System Report to use transients.

= 11.5.8 - 2025.04.22 =

* Removed `r34ics_ajax_bypass_nonce` option. Nonce has now been removed from ICS Calendar AJAX requests altogether, as the requests do not have the ability to write to the database, making the nonce unnecessary. The nonce has consistently caused issues with AJAX requests in conjunction with third-party caching plugins.
* CSS tweaks on admin page.
* i18n:
  * Removed disused translation strings.
  * Removed Norwegian Nynorsk translation files, due to consistent issues with Poedit machine translations.

= 11.5.7.1 - 2025.04.11 =

* Bug fix: Added exception handling to prevent a fatal error if `r34ics_date()` is passed a timezone string that is not a valid format recognized by the PHP `DateTimeZone` class.
* Bug fix: Removed extraneous pagination close tag in list view that may cause the pagination HTML to break if the last item on a "page" is a multi-day event.
* Changed scope of special date range handling in week view.

= 11.5.7 - 2025.03.07 =

* Modified activation process to jump directly to **Getting Started** tab of admin page.
* Redesigned **Getting Started** tab and sidebar of admin page.
* i18n: Updated translation files, added missing text strings.

= 11.5.6.1 - 2025.03.06 =

* Updated help text on Settings page.

= 11.5.6 - 2025.02.26 =

* Added `none` as a valid option for the `monthnav` parameter, allowing for hiding the month navigation altogether. (Useful when showing month view in a kiosk environment or other settings where the user doesn't need the ability to switch the view to a different month.)
* Bumped 'tested up to' to 6.7.2.

= 11.5.5 - 2025.02.24 =

* Added support for using [HTML color names](https://www.w3schools.com/colors/colors_names.asp) in the shortcode, in addition to hex colors, via the new `r34ics_color_name2hex()` function.

= 11.5.4.2 - 2025.02.18 =

* Made calls to `php_uname()` in System Report conditional; some servers may remove support for this function for security reasons. Also replaced call to `phpversion()` with `PHP_VERSION` constant, with a conditional in case the constant is undefined. These changes should resolve issues where the ICS Calendar admin page does not load properly on servers with these security measures in place.
* Updated copyright terms regarding ICS Calendar name and branding assets.

= 11.5.4.1 - 2025.02.10 =

* Refactored `r34ics_date()` to use `wp_date()` after applying its offset and other input standardizations, rather than duplicating the code of `wp_date()`. This also resolves an issue where in some rare cases, the passed-in timezone may not be handled correctly.
* Added missing event timezone inputs to `r34ics_date()` calls in the `R34ICS::event_description_html()` method and `r34ics_multiday_date_label()` function. Without timezones, date ranges for multi-day events could be one day "off" in the event descriptions and labels after the aforementioned refactoring of `r34ics_date()`.
* Fixed incorrect date display issues in `R34ICS::event_description_html()`. _Note: Version 11.5.4 was withdrawn due to this issue, which was discovered a few minutes after its release._
* Modified event sorting for multi-day events starting on the same date. Now, list-style views (list, basic) will show these events sorted by earliest ending date. Table-style views (month, week), will show the events sorted by the _latest_ ending date, which helps to reduce situations where events "break" between days in the layout when using `combinemultiday`.

= 11.5.3.2 - 2025.02.07 =

* Bug fix: Resolved possible fatal error caused if new `r34ics_i18n_locales()` function added in 11.5.3.1 runs on a logged-out front-end page.

= 11.5.3.1 - 2025.02.06 =

* Fixed bug with `reverse` and `pagination` on Basic and List views that would cause the wrong "page" to display on load.
* i18n: Updated translation strings. Added logic to force the plugin's embedded translation files to take precedence over any downloaded community translation files in the `WP_LANG_DIR/plugins` directory.

= 11.5.3 - 2025.02.03 =

* Fixed issue with pagination in list view that would include the next single-day event(s) on a "page" when a multi-day event was the correctly counted "last" item on the page.
* Modified handling of `pagination="1"` in Basic and List views, to literally mean 1 event, rather than being interpreted as a boolean "true" and defaulting to 5 events per page. Setting `pagination="true"` will still default to 5 per page. List view also now omits the month/year headers when displaying one event per page.
* Modified handling of `count` and `pagination` parameters to force positive integer values.

= 11.5.2.1 - 2025.02.03 =

* Added `r34ics_comparison_string()` function to process strings for comparison purposes. Used by features added to `R34ICS::r34ics_display_calendar_exclude_event()` in 11.5.2 to filter events by category, accounting for possible formatting issues with accented letters.
* Modified shortcode logic to force certain parameter values to all-lowercase. This allows the input values to be case-insensitive; previously, non-lowercase values would be treated as invalid. Applies primarily to parameters that have defined arrays of accepted values, e.g. [`columnlabels`](https://icscalendar.com/icsdocs#columnlabels) or [`extendmultiday`](https://icscalendar.com/icsdocs#extendmultiday).

= 11.5.2 - 2025.01.31 =

* Added `category` attribute to allow filtering events by category. Multiple categories may be included, using the pipe character `|` as a delimiter. Category names used must exactly match the category names in the feed (case-insensitive). _Currently this feature simply excludes events that are not in one of the designated categories. A future update will add support for color-coded categories, similar to the current support for multiple feeds in one calendar shortcode._ **Note:** This feature requires that your ICS feed data includes the [`CATEGORIES`](https://icalendar.org/iCalendar-RFC-5545/3-8-1-2-categories.html) property, which is not widely supported by most popular calendar software.

= 11.5.1.3 - 2025.01.22 =

* Modified logic for `maskinfo` that would remove the info hover box on multi-day events with specified start and end times.

= 11.5.1.2 - 2025.01.20 =

* Miscellaneous:
  * Added `r34ics_ajax_bypass_nonce` status to System Report.

= 11.5.1.1 - 2025.01.08 =

* Bug fixes:
  * Added logic to trim extraneous spaces from the beginning and end of all attribute values when parsing the shortcode, and in sanitization logic in `r34ics-ajax.php`.
  * Added `r34ics_color_key_allowed()` function and updated `r34ics_select_allowed()` to merge custom allowed fields with `wp_kses_allowed_html('post')`. This resolves issues with the color key (legend) that were introduced with changes in 11.5.0 and 11.5.1.
  * Changed `r34ics_minify_css()` handling of whitespace to resolve issues when output is fed through `wp_kses_post()`.
  * Fixed duplicate description output that may result with ALTREP handling introduced in 11.5.1.
  * Fixed handling of feed parsing failures that would cause a fatal error unless the `debug` parameter is set in the shortcode.

= 11.5.1 - 2025.01.07 =

* Functional enhancements:
  * Added protected `R34ICS::_event_field_handling()` method to facilitate complex logic (i.e. too much to fit in one line of code) when assigning values in the `$event_item` array in `R34ICS::display_calendar()` and related functions. This includes the new `r34ics_event_field_handling` filter for additional external processing of event data. (If working with the filter, be aware that it is currently only applied to the `eventdesc` value.) This functionality was specifically added to accommodate changes needed for the ALTREP property described below, but it is open-ended to support additional future enhancements.
* iCalendar spec support:
  * Added limited support for Thunderbird's use of the [ALTREP](https://icalendar.org/iCalendar-RFC-5545/3-2-1-alternate-text-representation.html) parameter in event descriptions. Thunderbird does not appear to conform to the spec — the `ALTREP` value is not wrapped in quotation marks. However, since this is our first observation of ALTREP in use, our solution is tailored to the Thunderbird output we have observed. Additional feedback on this feature is welcomed.
* PHP deprecation notices:
 * Modified the `event_description_html()`, `event_label_html()` and `event_sublabel_html()` methods of `R34ICS` to return empty strings rather than null or false values when empty.
 * Added `?: ''` empty string fallback value to all instances of `wp_kses_post()` added in version 11.5.0, to work around "Deprecated: preg_replace(): Passing null to parameter #3 ($subject) of type array|string is deprecated" warnings. This should technically be addressed within the WordPress core `wp_kses_no_null()` function. We have opened a Trac ticket. If the core function is modified to handle null values, the then-superfluous `?: ''` will be removed from these function calls in a future update.

= 11.5.0 - 2025.01.03 =

* i18n:
  * Added `translators:` comments for each translation string containing placeholders.
  * Changed text domain from `r34ics` to `ics-calendar` to conform with [WordPress Plugin Directory requirements](https://developer.wordpress.org/plugins/internationalization/how-to-internationalize-your-plugin/#text-domains). _Translation files included within the plugin have been correspondingly updated, but if you are using third-party translations or a plugin such as [Say What](https://wordpress.org/plugins/say-what/), you may need to update them with the new text domain._
  * Replaced `%s` translation string placeholders with `%1$s`.
  * Replaced uses of unescaped `_e()` and `__()` functions with the corresponding escaped functions `esc_html_e()`, `esc_html__()`, `esc_attr_e()` and `esc_attr__()`, as appropriate.
  * Updated all translation files to reflect the above changes.
* Miscellaneous:
  * Added extra sanitization functionality to handling of form inputs on Settings page and `r34ics-ajax.php`.
  * Added text escaping functions to dynamic plugin output in templates.
  * Added `r34ics_select_allowed()` function.
  * Fixed CSS padding issue with week numbers in month and week views.
  * Replaced uses of certain standard PHP functions such as `json_encode()`, `mt_rand()`, `parse_url()` and `strip_tags()` with their WordPress-specific equivalents (e.g. `wp_json_encode()`, `wp_rand()`, `wp_parse_url()` and `wp_strip_tags()`).
  * Updated handling of server variables in System Report.
* Vendors:
  * Updated embedded ics-parser library to version 3.4.1 (with namespace change to prevent plugin conflicts, and removal of variables from error messages due to [Plugin Check](https://wordpress.org/plugins/plugin-check) reporting them as coding errors).
  
= Full Changelog =

_Changelog truncated here due to WordPress repository requirements._ Please see `changelog.txt` for older logs.