LiveWhale CMS 1.7.1

We’re excited to share a few great new features plus a ton of performance improvements and bug-fixes in our release of LiveWhale 1.7.1!

Whether you’re a daily publisher or a super-admin, new features like online events, SEO-friendly event URLs, image cropping, and a revamped approach to widget templates mean there’s something for everyone.


  • What to Check Before Upgrading

    Once LiveWhale 1.7.1 is on your dev site (get in touch if you’re not sure), we encourage you to test all front-end and back-end functionality, especially any customizations or special widgets that you use on your site.

    Additionally, there are a few special changes in LiveWhale 1.7.1 that might require updates to your theming:

    Online Events

    LiveWhale 1.7.1 adds new native support for online events to the back-end. Chances are, your calendar theme might need some updates in order to display/filter online events on the front-end. Instructions for how to add front-end support for online events are here, or get in touch if you’d like our help adding them to your theme.

    Image Format

    The basic HTML markup LiveWhale uses for images has been updated to use the newer <picture> syntax, but it might have implications for your front-end image styling. Please make sure to test front-end images on your site before upgrading! More details about the syntax changes and suggestions for updating your theme are here.


  • Pages

    • The page history screen now indicates when the page was first created and by whom.
    • Under-the-hood improvements to how LiveWhale tracks and reports on page revisions.

  • Events

    • Native support for online events. This new taxonomy supports the latest Google JSON-LD changes, as well as making it easier for LiveWhale users to publish and site visitors to find online events. [docs]
    • New SEO-friendly event URLs. The old syntax /view/event/event_id/1234 will continue to work, but will forward to the new canonical url structure /event/1234-my-event-title
    • Note: This new URL structure only works for hashless calendars. If you are still seeing #! on your calendar, get in touch about migrating to the newer hashless setup.
    • It is now possible to set a default group image which will be used as the default image for any events in that group that otherwise haven’t been assigned one.
    • Accessibility: Added screen reader text to mini-cal header and “and x more” events link in month view. Added skip links to calendar location and group filters. Fixed a bug with mini-cal keyboard navigation when viewing multiple dates.
    • Event URLs with “Any logged-in user” or “Anyone in this group” privacy settings will now redirect to the LiveWhale login page.
    • The calendar now supports direct linking to archived events. So, even if they don’t appear on your front-end calendar, you can still link to an archived event directly.
    • Added the calendar option search_all_groups. A true value instructs the calendar to return events from all groups when searching, regardless of what group calendar you’re currently on.
    • iCal updates
      • Linked iCal calendars now support the prefix X-LIVEWHALE-CUSTOM- for setting custom variables on imported/synced events. [docs]
      • You can now use X-LIVEWHALE-VISIBILITY in iCal feeds to set the visibility of newly imported events. [docs]
      • Add DTSTAMP to our exported iCal feeds; some parsers didn’t like that we weren’t including it, so now we do!
    • Add support for custom event fields to RSVP notifications. [docs]
    • Back-end: You can now search and filter linked calendars by group.

  • News

    • Stories lacking a story body will no longer link to a details view in widgets by default. This is similar to how events already worked – it only links out if there is more information “beneath the fold.”
    • This allows us to support “short stories” with just a title, image, and summary. Some schools use these in widgets the same way you would a social media post – to share updates that might just include a photo and a few sentences. 
    • Beta-testing: Stories now feature categories and can be utilized in the same manner as event types for events. (This feature is currently being tested, let us know if you’d like to try enabling it for your own story organization.)

  • Profiles

    • It is now possible to export profiles from all groups when exporting as an admin from a global type.


  • Forms

    • Improved accessibility of LiveWhale forms that have required fields, including instruction message and aria-required attribute. The new .lw_forms_required class can be used to style required field labels. Fixed an additional bug involving labels on certain hidden fields.
    • Form confirmation emails will no longer list non-required fields for which no value was entered.

  • Images

    • You can now permanently crop images in LiveWhale, either at upload time (recommended) or from the image library. The image cropper used here and for selecting thumbnails has now been made fully keyboard-accessible. [docs]

    • You can also now customize the aspect ratios available in the copper. [docs]

    • LiveWhale’s image optimizer now automatically provides support for lazy-loading images as well as serving up webp alternatives when available. [docs]
    • LiveWhale now validates uploaded images against their file extension, if supplied.
    • When editing an event/story/profile, we’ve replaced the the bulk image uploader with an easier single-image upload. (Bulk uploads can still be done from the image manager or gallery tool.)
    • Added support for “default_max” to the galleries widget, so you can set a default max results in public.config.php.
    • You can now choose to randomize images in an inline gallery from the widget editor.
    • Added support for redirects on /live/image requests.
    • Added support for the metatag og:image:alt.

  • Public Submissions


  • Copying/Sharing

    • Non-publishing editors no longer receive email notifications about content suggested to their group(s).
    • Content now only has a source specified if entered manually. Source is no longer set when copying content from another group.
    • Your editors can enter a source when linking to an external URL, like Source = “My Local Newspaper.” Previously, LiveWhale would overwrite that when sharing the content across groups (source = “Originating Group”) and we’ve changed that in 1.7.1 so “My Local Newspaper” remains the source, in this example.
    • When copying content across groups, tag assignments are now preserved for tags which are globally shared.
    • Often when receiving suggested content, you don’t want all the tags from the original group to be created in yours. We’ve added an exception for Global Tags, so if you apply a Global Tag to an event and share it to another group, the Global Tag will also be applied to their copy.

  • Users and Groups

    • You can now filter by user in the activity manager.
    • Limited group editors can now access the group editor for their own group rather than only a manager list of users.
    • Sometimes recent projects have involved adding custom fields to the group editor, and with this change, users with “Allow management of users for own group(s)?” checked off can see those pages too.
    • Added a column to the users CSV import/export for core_groups_limited, which corresponds to the “Allow management of users for own group(s)?” setting.
    • The user CSV import feature now requires switch groups to be a vertical bar-separated list.
    • This allows you to set switch_groups as text, like “Biology|Music|Dance” rather than needing to look up their group IDs.

  • Widgets

    • Widget editor now allows individual overriding of settings when using widget templates. This makes widget templates a far more flexible and powerful solution for creating a library of widgets. Learn more about using widget templates.
    • Accessibility improvements: We’ve updated the widget pagination screen reader labels to make them more descriptive (“Show next 5 [widget header]” or “Show next 5 [widget type]” rather than simply “Show next 5 items”)
    • When using Advanced Conditional Formatting, you can now use has_tag_academics, etc. to check for the presence of a tag on a piece of content in widget results, just as you can do to check for a tag at the page level.
    • New and updated formatting variables
      • The use of “link” is being deprecated in events/news/profiles widgets. Instead, links to content should use “title” or “headline” plus the optional “source” variable.
      • Events, blurbs, galleries, and news story widgets now permit the use of a “source” format variable in widgets for items that are externally linked.
      • Added a “link” variable to Twitter widget that contains the URL of the source tweet.
      • The Instagram “link” variable now links to the post rather than the image.
      • Added “image_alt” format var to supported widgets for alt text-formatted captions.
    • Changes to File widgets
      • Added support for file widget extracts that exclude the wrapping container. [docs]
      • File widgets now automatically remove class=editable from any included HTML.
    • XPHP casts can now be applied to widgets. [docs]
    • Added support for exclude_styles to external widget embeds. [docs]
    • Added a new option to the “hide_repeats” widget setting for non-starred events. This way, your widget you can only show one instance of each repeating event, unless the repeat is starred, and then it will show up. [docs]
    • The widget editor now previews the syntax used by an inline gallery template just like it previously did for applied widget templates.

  • API

    • Events JSON now returns separate lists of event types, audiences, and campuses (previously all were combined into one list).
    • All LiveWhale users now have permission to create content in the Public group when using the REST API to save new content. [docs]
    • Token-authenticated requests to the /live/json/events endpoint now contain information about the submission if the content was publicly submitted.
    • Previously saved widgets could only be requested in HTML (default) and JSON format (via @JSON). They can now be requested in RSS and ICAL as well.
    • Allow importing of event images from RSS feeds that use the “enclosure” syntax.

  • Other

    • The calendar option use_modular_templates is now true by default. If you notice your calendar looking significantly different after upgrading, check to see if you still need to migrate your calendar theme to use modular components.
    • When using hashless calendars, .htaccess files are now automatically configured rather than requiring manual setup.
    • Added support for Recaptcha v3. New API keys can be obtained and entered as PUBLIC_KEY_V3 and PRIVATE_KEY_V3 in your Recaptcha config.
    • Switched to OpenWeatherMap for weather API integration. WOEID still works for backwards compatibility, however please see the newer WEATHER_ID setting in livewhale/client/sample.global.config.php. (This likely only affects new installations, unless you’re working with custom weather code!)
    • Upgraded phpCAS to 1.3.8 for security fixes.
    • Upgraded phpSAML to 3.4.1 and xmlseclibs 3.0.4.
    • Added support for MySQL 8.0.

  • Bug Fixes

    • Add space to time selector to fit 12:00 PM.
    • Added a Google instruction to prevent indexing of htmlencoded content.
    • Added missing date variable to list of format vars for blurb widgets.
    • Added missing page title when viewing images with No Collection.
    • Added workaround for an issue with async calls affected by a bug in some versions of Apache 2.4.
    • Address XSS vulnerability in calendar search form.
    • Adjust simple core gallery to work with updated jQuery version.
    • Allow CALENDAR_GROUP_CATEGORY config to accept event types with apostrophes.
    • Change widget contains filter to search for comma-separated values.
    • Clarify warning that deleting a user can be done.
    • Deprecate Yahoo Calendar link.
    • Disable autocomplete for weather_id field on group editor.
    • Email templates now only add line breaks to message body, not entire email.
    • Fix bug preventing copying and pasting images within wysiwyg fields.
    • Fix bug where password field was visible on Edit User page when using single-sign-on.
    • Fix case where removing event_image_keywords field breaks public submission form.
    • Fix custom checkboxes in public submission forms.
    • Fix duplicate ID in core calendar template.
    • Fix issue with accordions inserted into calendar events.
    • Fix line breaks in iCal feeds to match specifications.
    • Fix preview link formatting in Files manager.
    • Fix scroll-to-top for logged-in users when changing views in calendar.
    • Fix timepicker placement by restoring lw_page positioning.
    • Fixed a Tidy-related issue where certain content could be stripped from a file include if the include began with an HTML comment as its first element.
    • Fixed a bug where trashed items very large in size failed to restore properly.
    • Fixed a case where email line limits could sometimes split an HTML tag.
    • Fixed a compatibility issue between LD+JSON metadata and Facebook Pixel.
    • Fixed a display issue when editing content last modified by a user that no longer exists.
    • Fixed a formatting issue with custom header/footer code.
    • Fixed a formatting issue with summary in blog widgets.
    • Fixed a rare bug where certain malformed urls could trip up saving page edits.
    • Fixed an edge case issue where linked content would not always refresh on the public web site when the original pieces of content were edited.
    • Fixed an editor display issue with some linked calendar event descriptions.
    • Fixed an issue on load balanced servers where move-to-group for images or files could sometimes not sync properly.
    • Fixed an issue preventing certain users from having read access to bulletins.
    • Fixed an issue that broke SASS support in galleries.
    • Fixed an issue that caused incorrect wording when customizing item-accepted notifications.
    • Fixed an issue that could cause some linked calendars to refresh after a delay.
    • Fixed an issue that could cause unnecessary spacing in widget formattng.
    • Fixed an issue that produced too many results when performing a library search for images.
    • Fixed an issue where “Edit this item” failed to appear when viewing a blog post.
    • Fixed an issue where Google Calendar could lose HTML links when description content is enabled in the /live/ical endpoint.
    • Fixed an issue where LESS/SCSS compilation errors could fail to log to the file system under certain server configurations.
    • Fixed an issue where PDFs uploaded with a capitalized extension sent the wrong MIME type on download.
    • Fixed an issue where XPHP conditions checking for group_navigation would return true for an empty nav.
    • Fixed an issue where a default group event type could be wrongly applied to a switch group.
    • Fixed an issue where a line break was removed when the first option in a LiveWhale form field was the number zero.
    • Fixed an issue where activity could be logged twice when auto-accepting a shared event as live.
    • Fixed an issue where adding new wildcard redirects would not immediately expire relevant page cache entries as it would for a non-wildcard pattern.
    • Fixed an issue where backend manager pagination and searching might not play well together.
    • Fixed an issue where backend searches for hidden pages would fail to return results.
    • Fixed an issue where breadcrumbs could go missing under certain circumstances when using use_current_path.
    • Fixed an issue where captions for images uploaded directly to dynamic content did not properly preserve HTML links.
    • Fixed an issue where certain SVG elements could cause a duplicate title tag in an HTML document.
    • Fixed an issue where certain custom checkbox or radio button configurations failed to work properly.
    • Fixed an issue where certain custom variables could cause calendar results to return empty.
    • Fixed an issue where certain templates would not link the group title in a group breadcrumb.
    • Fixed an issue where certain users could switch to the Public group but not back again.
    • Fixed an issue where config-defined custom fields would not appear in profile widgets.
    • Fixed an issue where content would not yet be indexed immediately after accepting a shared copy.
    • Fixed an issue where copied images or files could sometimes not sync properly across all web nodes.
    • Fixed an issue where custom fields assigned to blog posts would not display on details templates.
    • Fixed an issue where custom form responses did not support fields of the type checkbox or radio.
    • Fixed an issue where custom profile fields with the value of 0 could fail to display.
    • Fixed an issue where duplicate events could display if one was a link copy of an imported calendar event in a different group.
    • Fixed an issue where event cost type could be unintentially altered by bulk manager actions.
    • Fixed an issue where figure tags could erroneously self-close.
    • Fixed an issue where file includes by url could sometimes not produce correct widget content when using group vars.
    • Fixed an issue where file widgets requesting content over HTTP with GET vars could sometimes return the wrong response.
    • Fixed an issue where filter args that utilize regular expressions could be negatively impacted by whitespace in widget formatting.
    • Fixed an issue where group directory/calendar urls might use HTTP when HTTPS is available.
    • Fixed an issue where images in a profile CSV upload were not prevalidated.
    • Fixed an issue where imported calendars using RSS failed to delete the last event removed in an empty feed.
    • Fixed an issue where it was not possible to save an optional editable page element containing only a blank header.
    • Fixed an issue where link copies could sometimes link to the wrong place if the owner group’s calendar has been renamed.
    • Fixed an issue where navigations would not update right away if an individual page’s visibility was changed.
    • Fixed an issue where no_results widgets could sometimes lose widget formatting vars.
    • Fixed an issue where page editing could become disabled when using the back/forward browser buttons.
    • Fixed an issue where pagination on backend managers could lose track of sidebar filter states.
    • Fixed an issue where private events in the calendar would not load properly under certain circumstances.
    • Fixed an issue where public submission form would save missing or empty cost values as Other, causing validation issues when trying to save.
    • Fixed an issue where related content could vanish from the editor under certain conditions.
    • Fixed an issue where some ICAL items with encoding=quoted-printable were incorrectly formatted.
    • Fixed an issue where some form CSV exports could contain extra whitespace around values after importing to Excel.
    • Fixed an issue where some multi-day events could skip days in calendar day view.
    • Fixed an issue where stories linking to hidden stories recently resaved as live had a delay before acknowleding their external link as repaired.
    • Fixed an issue where submitting an emoji in a form response could corrupt the form submission data.
    • Fixed an issue where the /live/places endpoint could return incorrect results if custom fields have been added to locations.
    • Fixed an issue where the data sync dropdown might not appear for custom profile fields.
    • Fixed an issue where the frontend calendar would not set an og:image tag for an event possessing only one image that is marked as thumbnail only.
    • Fixed an issue where the navigation editor could exclude items under certain circumstances.
    • Fixed an issue where the profile type dropdown could take a minute to refresh after a group switch.
    • Fixed an issue where the sharing section of an editor improperly displayed controls that should be hidden for link copies.
    • Fixed an issue where the tags widget did not properly display clickable format vars in the widget editor.
    • Fixed an issue where uppercase search terms could result in extra unwanted calendar results.
    • Fixed an issue with blank custom profile fields being imported via CSV.
    • Fixed an issue with caching of nested inline forms.
    • Fixed an issue with creating shortcuts for filtered manager views.
    • Fixed an issue with custom sort order fields that sort by a custom field.
    • Fixed an issue with events starting at 11:59pm in calendar day view.
    • Fixed an issue with exclude_duplicates when using widgets in the format_widget arg.
    • Fixed an issue with field tags containing content blocks inside format args when using custom profile vars.
    • Fixed an issue with invalid event cancelation links.
    • Fixed an issue with support for multiple wildcards in redirects.
    • Fixed an issue with the contains filter action.
    • Fixed an issue with the date display of certain multi-day events.
    • Fixed an issue with the indexing of content with trailing numbers.
    • Fixed an issue with the places widget when markers contained certain types of widget content.
    • Fixed an issue with user CSV importing.
    • Fixed filtering by collection ID when an image lives in multiple collections.
    • Fixed ical link when emailing all RSVP registrants.
    • Fixed issue where RSVP notifications excluded event time.
    • Fixed issue where SMTP emails sent to multiple recipients would drop message variables.
    • Fixed issue where custom fields might not appear for blog posts.
    • Fixed issue with formatting of content on a map when zooming.
    • Fixed issue with group title display on details templates.
    • Fixed issue with setting default privacy for linked calendar events.
    • Fixed memory limit error that could occur when viewing all past events for all groups in the events manager.
    • Fixed the Edit this item link when viewing a blurb details page as a logged-in user.
    • Fixed the is_remote arg when used to apply a CSS background-image.
    • Fixes issue where custom login attribute cookies would expire after one hour.
    • Forms and widgets now have linked resources such as tags and custom fields copied when duplicated, matching the behavior of other content types.
    • Hide WYSIWYG style formats that don’t apply to the current element.
    • Improved exact phrase matching in searches where the phrase includes an ampersand.
    • Improved the method by which files submitted to a form are synced across web nodes.
    • Non-publishing users no longer see sharing suggestions.
    • Only include saved locations in calendar location filter.
    • Prevent unintentional scrolling of Google Maps on page scroll.
    • Re-enable support for home_view_combine_today_upcoming calendar setting.
    • Relaxed the requirements for og:image meta tags in accordance with Facebook recommendations.
    • Remove duplicate WYSIWYG format dropdown.
    • Remove event hero image from event slideshow
    • Remove trailing space from form radio, select, and checkbox fields.
    • Removed divider line, header, and paragraph type fields from form submission display and CSV exports.
    • Repair widget links in LWC sites still using #! URLs
    • Restore start and end day of week to event details view.
    • The page error total in the backend navigation now more accurately reflects the number of pages with errors in your current group.
    • Updated Instagram widget to support new API changes.
    • Urls in CMS-generated email notifications are now automatically made absolute if the user did not format them that way.
    • Use browser right-click menu in all WYSIWYG fields except when editing a table.
    • Use canonical URL for og:url metatag.
    • Use group_title instead of group_fullname in calendar’s subscrition modal
    • Use variable name for CSV header when exporting form submissions with a hidden field.
    • Using end or before_date in XPHP no longer displays the content inclusive to the precise second indicated by the date/time provided.
    • When creating a new page, the owner of the page now defaults to the group owner according to path if possible, instead of the group of the user creating the page.