LiveWhale CMS

Content management for storytellers

LiveWhale 1.6

The Complete Changelog


LiveWhale 1.6 represents over a year and a half of improvements, further refinements to overall design, and many new opportunities for developers and designers.

Highlights include:

  • New content visibility settings.
  • Better management of blurb & profile types.
  • Powerful and sophisticated new widget options.
  • File attachment collection in forms.
  • New payment features.
  • Resizable PNGs & automatic retina image support.
  • Automatic session timeout protection.
  • Improved accessibility testing.
  • Numerous extensions to XPHP.

And tons of other great new features (that we have you to thank for!)

The full 1.6 changelog and recommended upgrade steps are as follows:

UI Improvements


Significant updates to look and feel, throughout the CMS.


TinyMCE Support


- Upgraded to TinyMCE v4.

- The anchor button is now enabled by default (previously it could only be added via config setting). Customer Request


Backend 2.0


- A massive amount of effort has gone into virtually rewriting most of LiveWhale’s under-the-hood code for managing content in the backend, to modernize the underlying CMS architecture after its inception over eight years ago. This work has also given birth to new API functionality, numerous small bug fixes and inconsistencies, and opened the door for planned features on the horizon.

- Rewritten file upload code for more streamlined functionality and improved security.

- Faster and more efficient delivery of page resources across the board.

- Improved minifying: LiveWhale now uses uglifyjs and cleancss (via node) for its minifying of scripts and stylesheets if they are available on your system (recommended). If they are unavailable, it will continue to fall back on the methods previously used.

- Improved support/performance when using newer versions of Tidy.

- Moved to a new integrated help system.

- You can now set visibility of stories, events, galleries, forms, blurbs, and profiles. This controls who can view the story/event/etc. on the public web site (everyone, just users in the group that owns it, all logged-in LiveWhale Users). Customer Request

- All PHP sessions for LiveWhale are now database-based by default, rather than configurable for files vs. database.

- LiveWhale now optionally supports multi-language for events and stories, and page editing with some additional configuration. Additional languages can be enabled via an opt-in config setting. Customer Request

- LiveWhale can now be configured to send all email through a remote SMTP server. New settings have been added to the master config.php for this feature. Customer Request

- Improvements to the bulk uploading interfaces.

- Email notifications now utilize a customizable HTML email template.

- LiveWhale One has been absorbed by LiveWhale, as we have now shifted to a tiered approach for LiveWhale licenses. Group and user creation now respects any restrictions involved in your LiveWhale license. For more information about which license you currently possess, or for complete details about which pricing tiers are available, please contact




- It is now possible to move profile and blurb types between groups. All items contained within will be moved also. Customer Request

- It is now possible to move more global content types between global and non-global statesCustomer Request

- By default, all external links within LiveWhale widgets now open in a new window/tab. This behavior can be disabled by adding a config setting to your public config file: $_LW->CONFIG[‘DISABLE_WIDGET_LINK_TARGETS’]=true; Customer Request

- In LiveWhale-managed navigations, external links now always include target=”_blank” to open in a new tab/window. Customer Request

- You can now reset any widget arg inherited from a saved widget by adding an empty arg. Ex: <widget id=”1”><arg id=”group”></arg></widget> Customer Request

- It is now possible to use conditions in widget format args. Examples: {!cost:summary} = if there is no cost, display summary. {cost:summary} = if there is a cost, display summary. Customer Request

- Related content now appears more consistently as a format variable available in widget output. Customer Request

- In LiveWhale 1.5.x, it was possible to refer to a parent format var from within a nested child widget. It is now possible to use the parent format vars in args on the nested child widget as well. Customer Request

- Two new args are available on list style widgets: clean_markup and format_widget. When the clean_markup arg is set to true, the standard widget structure (div->ul->li) is skipped, and the widget output is simply back-to-back results as formatted in the format arg. The format_widget arg can be used to prepend, append, or wrap the entire widget output with custom markup. Customer Request

- A {date_ago} format variable has been added to the following widgets: feeds, facebook, twitter, and instagram. This is an alternate display of the item’s date in the format “# days/minutes/seconds ago”. The elapsed time displayed is updated every 60 seconds while users remain on a web page. Customer Request

- Users can now open widgets for editing in a new tab when double clicking global or owned widgets in a WYSIWYG field.

- Related content is no longer a default element of the blurbs widget format arg.

- It is now possible to (safely) use certain kinds of SQL clauses in widget filters. For example: <arg id=”filter” name=”date_created” action=”greater_than”>NOW() - INTERVAL 1 DAY</arg> Customer Request

- LiveWhale once again supports the original previous/next style pagination in widgets. Widgets can be toggled into this mode using a new paginate_mode arg. Customer Request

- It is now possible to add XPHP to certain fields on the widget editor using new WYSIWYG options for common XPHP tags.

- Most widgets now support a “fallback” arg, which allows you to add/remove/modify any number of args applied to a widget if the default set of args ends up with no results. Multiple levels of fallback args can be applied, allowing a widget to go through successive tiers of args until results are found. The existing “no_results” arg may still be used as final, arbitrary fallback content if all else fails.




- The transition to LESS is complete in LiveWhale 1.6, with the core CMS using LESS when available on your system (recommended). If you support LESS, stylesheets with the .less extension now take precidence over any .css counterparts. NOTE: If you are using stylesheet.css and stylesheet.less side-by-side on your server, but have let the .less versions become outdated, please either update them or archive them prior to the 1.6 upgrade.

- LiveWhale-powered pages now make use of more robust meta tags, including inclusion of OpenGraph (og:) meta tags, and a new API function to dynamically add meta tags at runtime: $_LW->appendMetaTag($attributes). Customer Request

- The page notes manager now allows seeking further back in time, with pagination. Customer Request

- The page editor details tab now notes which group owns the page being viewed and which theme is being used.

- Your Pages now lists the template associated with each page.

- Page notes now expire after 1 year.

- Previously page source editing only warned users when changing a template’s source to match another template. It now notifies users under the following additional conditions that would result from a save: child pages losing a parent template, child pages gaining a parent template, child pages switching parent templates. In these 3 cases, users can either approve the change or resume editing the source.

- Pages migrated between hosts now transfer their customized page titles with them.

- LiveWhale now automatically redirects from /foo/index.php to /foo.php and from /foo.php to /foo/index.php when requesting one and only the alternate exists.

- Your Pages now supports manager filters.

- Pages with invalid XHTML errors now have a more useful “Why?” link, which more accurately reveals the errors that should be resolved. Customer Request

- When inserting a link via the WYSIWYG interface, LiveWhale now remembers which type your last link was, and defaults to that.

- A new template variable page_tags works just like news_tags on a news details template but lists the tags applied to the page.

- On pages that are tagged, each tag applied to that page (Foo, etc.) generates an XPHP var like <xphp var=”has_tag_foo”/>, enabling your template to include certain content according to the presence of a tag. -- When used on a details template, the tags also correspond to the tags on the item being viewed, so a news details template can show certain content only for stories tagged a certain way.

- The templates manager now displays a visual preview of each template.

- Pages with the extension .test.php or found within underscore directories (/_assets/, etc.) will now present a notice about being used for testing purposes, and will automatically be excluded from search engines via meta tag.

- Users, such as student editors, can now be configured with the ability to publish draft versions of pages only, without the ability to take those changes live. Customer Request




- The events manager now lists categories applied to events. Customer Request

- It is now possible to attach an additional LiveWhale form to event RSVPs. The additional data collected is paired with the RSVP submission and included with RSVP CSV exports. Customer Request

- RSVP email responses can now include HTML. Customer Request

- It is now possible to override the synced description for an imported calendar event with a customized description of your own.

- It is now possible to bulk email registrants for an RSVP-enabled event. Canceling an event now reminds you to email registrants to alert them about the event’s cancelation. Customer Request

- ICAL import/export now supports alternate HTML descriptions.

- Imported calendars now consider per-event category assignments in ICAL feed data. If the categories exist in LiveWhale, the category will be assigned to the event when it is created for the first time. Categories specified for the imported calendar will still be assigned, but in addition to those assigned by the feed. Customer Request


Social Media & Feeds


- The Twitter widget now supports the “require_lang” arg which allows filtering out all tweets except ones in the desired language (such as “en” for English).

- It is now possible to customize the date and time format of feeds widgets at the global and per-widget levels. Customer Request




- It is now possible to replace a file upload with a file of a different typeCustomer Request

- You can now upload new files from the related content section of editor screens. Customer Request




- Inline forms no longer specify an “item#” ID on the individual form elements. Instead, the element IDs now match the “name” attribute on the same element.

- You can now add a form attachment element to forms. File attachments as part of form submissions can now be obtained via the existing form submissions interface. Customer Request




- It is now possible to duplicate blurbs using the checked items menu on the blurb manager. Customer Request




- When using {profiles_1}, etc. as custom fields in format args, you can now also use {profiles_1_title} to display the title of the custom field. Customer Request




- A new payments widget is now available. It can be used to add customizable payment processing to any content, provided your group has been configured for payments.

- Improved integration with Stripe and RSVPs: comments for organizer and custom fields are now recorded in Stripe as well as locally within LiveWhale.

- Improved email receipts for order confirmations.

- Added the option to “bill me” later.


Galleries & Images


- PNG and GIF images are now treated the same as JPEG: they can be dynamically resized (preserving transparency), previewed in the image manager, attached to news stories and other content types, and so forth. (If you are using any animated GIFs, note that only the full sized copy will display with animation.) Customer Request

- Retina image support is now automatically enabled throughout LiveWhale. Any LiveWhale-hosted images will automatically gain a srcset definition when they support 2x or 3x at the intended size. Be sure to upload high res images, rather than exact sizes, as this is a requirement for retina support. Customer Request

- LiveWhale now supports start_date and end_date on gallery widgets. Customer Request

- You can now use the format arg on inline gallery widgets to customize the format of thumbnails. Customer Request

- Improved garbage collection of unused derivative image sizes, reclaims disk space much faster than previously.

- There is a new UI element on the media embed dialog that allows users to choose their video’s aspect ratio. The default is 16:9. Customer Request

- Details templates can now use a variable *_thumbnail_href (i.e. news_thumbnail_href, etc.) to indicate the href to the thumbnail image, if there is one. Customer Request

- RSS and ICAL feeds now respect the new $_LW->IMAGE_THUMB_WIDTH_FEED and $_LW->IMAGE_THUMB_HEIGHT_FEED settings, rather than $_LW->IMAGE_THUMB_WIDTH/$_LW->IMAGE_THUMB_HEIGHT. Using these settings you can adjust thumbnail sizes for feeds independently from widgets. Customer Request


Login & Users


- On non-SSO configurations, LiveWhale now warns logged-in users if they are approaching or have reached the login inactivity limit, giving them an opportunity to log back in and resume where they left off with no risk of losing any work. Customer Request

- When logged into LiveWhale, users will now be warned if they switched groups in another tab, so they have the option of switching back in the current tab without losing their work. Customer Request

- The user export CSV now includes last login date.


- Added a new superpower “QuickAccess” which allows admins to curate sitewide QuickAccess results (for example, for use on your site’s global search box). (Thanks Menlo!) Customer Request

- You can now perform a backend search by ID and find news, events, etc. with the corresponding ID. Customer Request

 - Added additional sort options to the backend search. Customer Request


- LiveWhale now incorporates a handful of small automatic SEO and accessibility improvements on frontend pages. Customer Request

- Complete revamp of the accessibility checking in LiveWhale. It is now based on the AChecker web accessibility evaluation tool and provides a more robust assessment of accessibility in your web pages, using accessibility guidelines such as WCAG and Section 508. Guidelines used to check your content are further customizable. Customer Request




- LiveWhale 1.6 brings a suite of new functionality to XPHP, across the board. The first time XPHP has been significantly updated in a long time! These improvements include:

- Easier nesting: It is no longer necessary to use inner=”true” when nesting XPHP variables. XPHP now supports infinite nesting of XPHP elements.

- Better security: XPHP now supports additional “encoded”, “decoded”, “text”, and “urlencoded” values for the “cast” attribute. This allows you to safely output raw input directly into your web page with all HTML entities encoded or decoded, without having to first encode that data. As of LiveWhale 1.6, GET variables automatically imply “encoded” but can be decoded with the “decoded” cast. The “text” cast strips all HTML tags before encoding. Customer Request

- Output length: Two new attributes are now available on XPHP tags, which allow you to limit the output length. The “words” attribute limits the output to the specified number of words, and the “length” attribute allows you to limit the output to the specified number of characters. In both cases, any HTML markup in the output is preserved and does not count against the length limit. Customer Request

- Sophisticated conditionals: The if tag previously only let you check if a variable was non-empty or if it matched a particular value. It now supports a variety of conditionals for more sophisticated if statements. New conditions now supported (which are based on the existing widget filter naming conventions) include: equals, not_equals, contains, matches, not_matches, before, less_than, after, greater_than, range, regexp, not_regexp. The before/after/less_than/greater_than/range conditions support both numeric and date values. Customer Request

- Additionally, the conditional “has_element” is supported. This can be used to output content if a specific tag, optionally with an id and/or class, is found in the page (Examples: div, div#foo,, This can be used to output certain content only when it requires other types of content that may or may not end up in the page. 

- Even more sophisticated conditionals: You can now reference other XPHP variables when performing comparisons with if statements. For example: <if var=”page_title” equals=”{group_title}”/>. Customer Request

- Date formatting: XPHP vars containing date/time information can now be dynamically reformatted for display. Use the new “date_format” attribute to set a valid PHP date format string to output the variable with. If the data being formatted is not in the default system timezone, you can specify the timezone of the input string thusly with the new "date_timezone" attribute. The output string is always in the local system timezone. Customer Request

- timelyContent: LiveWhale has incorporated timelyContent for XPHP from Menlo School. The native implementation does not interfere with existing timelyContent setups. To schedule XPHP content to appear in a page, use the attribute “before_date” or “after_date” (or both together) on your XPHP tag or widget. The value of these attributes can be any valid PHP date string (including relative dates). (Thanks Menlo!) Customer Request

- More standard page variables: The following XPHP variables are now available on every frontend page — server_host, server_path, server_file, server_filename, server_basename, server_extension, server_dirname, server_request_uri, server_query_string, server_date_month, server_date_month_short, server_date_day, server_date_day_short, server_date_date, server_date_year, server_date_full, server_time_full_12, server_time_full_24, server_time_hour_12, server_time_hour_24, server_time_minute, server_time_ampm, server_time_timezone, page_is_details_template, page_details_type, page_details_id. These can be used in XPHP conditionals, for example, for conditional content based on the filename/path/url. Customer Request

- It is now possible to generate random integers with XPHP, by using the following syntax to specify a range: <xphp random=”1,8”/>




- LiveWhale now supports create() and update() developer API methods. It’s now possible (and easy!) to programmatically generate CMS content, whereas previously this could only be done via the manager/editor interfaces, or writing your own custom database code.

- A new developer handler has been added to LiveWhale, onCopyLinkedResources(), which allows you to sync custom linked content when copying content with the CMS sharing functionality.

- Two new developer handlers have been added to LiveWhale, onBeforePublicSubmission() and onValidatePublicSubmission(), which allow intercepting and adding additional validation to public submissions.

- A new developer handler onWidgetApplyArgs() has been added, to handle custom args on any widget.

- A new developer handler onGetFeedData() has been added, to pre-process the input of any feeds being imported into LiveWhale.

- A new developer handler, onWidgetPreviewOutput($buffer), to update the source of the widget preview panel (such as adding custom JS or CSS).

- A new developer handler, onWidgetDetails($type, $id), as an official way to intercept a details request.

- LiveWhale now supports table partitioning on the widget cache and trash tables for increased performance on compatible systems.

- The LWQuery database API has two new API functions:

  • The asField() function allows you to assign the result of an LWQuery to a parent LWQuery result.
  • The exists() function can be used on a select query to return a boolean (existence of any result) rather than a result set.

- You can now add urls to $_LW->REGISTERED_WYSIWYG_CSS to add stylesheets to WYSIWYG contexts.

- Upgraded to Recaptcha 2.0.

NOTE: If you are using 1.0-based Recaptcha keys, please upgrade them along with LiveWhale 1.6!

- The page source of managers and editors now contain many placeholder comments that make it easier to inject new or customize content with your own PHP code. These comments are intended to be permanent, and travel with elements through redesigns. If you are using regular expressions to inject custom content, we strongly recommend switching to a process of prepending/appending content to these comments as a more reliable long term approach.

- LiveWhale now includes its own built-in uptime monitor script. (/live/uptime)


Bug Fixes / Optimizations


- Fixed an issue where link copies did not receive ongoing updates to their details after the parent had been updated. (Far and away the #1 bug fix request!)

- Fixed an issue where the stream widget would fail to list some widgets to add to the stream if they were duplicates by title.

- Fixed an issue where duplicate success/failure messages on the backend could be displayed.

- Fixed an issue where redirects with raw url encoded characters were not saved properly.

- Fixed an issue where a blurb or profile widget stored in a master group (or moved to another group) could not access blurb/profile types in a group other than the one that currently owns the widget.

 - Fixed an issue where the manager sidebar tag filter did not take into account whether you were on the archive view or not, for news and blurbs.

- Fixed an issue where the display of timezone was not restored upon restoring an earlier event revision with a different timezone.

- Fixed an issue where an embedded link copy of a form would collect submissions in the link copier’s group rather than the parent’s group.

- Fixed an issue where using only_today on an events widget would exclude past events from earlier today even if you set start_date = today in order to include them.

- Fixed an issue where the trash would needlessly hold every copy of a repeating event, rather than saving a single record and expanding it upon restore. This may drastically reduce the number of rows in the trash table for some heavy linked calendar users with external repeating events.

- Improved the loading of frontend pages while logged into LiveWhale by moving certain JSON content to the end of the document.


Upgrade Steps


We recommend taking the following steps to prepare your system for LiveWhale 1.6:

  • Upgrade to Recapcha 2.0.
  • If not available on your system, install uglifyjs and cleancss (via node) for optimal resource management.
  • Ensure that you're using the latest version of your npm packages, especially LESS (i.e. sudo npm update -g)
  • Ensure that you are uploading high res images whenever possible, so that they can be utilized for retina support.
  • If you are using stylesheet.css and stylesheet.less side-by-side on your server, but have let the .less versions become outdated, please either update them or archive them prior to the 1.6 upgrade.
  • Have a dev server? Don’t forget to contact us to schedule its upgrade to 1.6 so you can begin testing and preparing!