On the heels of adding TinyMCE rich editing to the Text widget and the media widgets in 4.8, there are another round of improvements coming to the Text widget A WordPress Widget is a small block that performs a specific function. You can add these widgets in sidebars also known as widget-ready areas on your web page. WordPress widgets were originally created to provide a simple and easy-to-use way of giving design and structure control of the WordPress theme to the user. and Video widget in 4.9, among other improvements to widgets.
Shortcodes in Text Widget
One very longstanding request—for over 8 years—has been to support shortcodes in the Text widget (#10457). This is finally implemented in WordPress 4.9. It is no longer required to have plugins and themes do
add_filter( 'widget_text', 'do_shortcode' ). Core Core is the set of software required to run WordPress. The Core Development Team builds WordPress. now will
do_shortcode() at the
widget_text_content filter Filters are one of the two types of Hooks https://codex.wordpress.org/Plugin_API/Hooks. They provide a way for functions to modify data of other functions. They are the counterpart to Actions. Unlike Actions, filters are meant to work in an isolated manner, and should never have side effects such as affecting global variables and output. (added in 4.8) in the same way it is applied in
the_content at priority 11, after
shortcode_unautop(). If a plugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party has added
widget_text then this filter will be suspended while the widget runs to prevent shortcodes from being applied twice. If a Text widget is in legacy mode then it will manually
do_shortcode() as well.
One reason for the long delay with adding shortcode A shortcode is a placeholder used within a WordPress post, page, or widget to insert a form or function generated by a plugin in a specific location on your site. support in Text widgets was due to many shortcodes looking for a global
$post when they run. Since the global
$post varies depending on whatever the main query is, the shortcodes in a Text widget could render wildly different on different templates of a site. The solution worked out was to temporarily nullify the global
$post before doing the shortcodes so that they will consistently have the same global state, with this global
$post then restored after the shortcodes are done. So if you have shortcodes that depend on a global
get_post()—then you should make sure that they short-circuit when
null in order for them to behave properly if used in the Text widget.
Media in Text Widget
One reason why shortcode support in the Text widget was needed in this release is because 4.9 also allows media to be embedded in the Text widget (#40854). There is now the same “Add Media” button in the rich Text widget as on the post editor, allowing you to add images, galleries, videos, audio, and other media. To support these, core also needed to support shortcodes like
gallery. Note there are also dedicated widgets (Image, Audio, Video, and Gallery) for these media types as well.
Having separate media-specific widgets helps with discovery and allows us to provide streamlined interfaces for each media type. For example, the Image widget now has a field specifically for supplying the link URL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org (see #41274), and the Video widget now provides more guidance to users when supplying external URLs (#42039). The media-specific widgets are closely aligned with blocks in Gutenberg The Gutenberg project is the new Editor Interface for WordPress. The editor improves the process and experience of creating new content, making writing rich content much simpler. It uses ‘blocks’ to add richness rather than shortcodes, custom HTML etc. https://wordpress.org/gutenberg/; the existence of media inside the Text widget will align with eventual nested blocks in Gutenberg, and would be treated as Classic Text blocks in any future migration Moving the code, database and media files for a website site from one server to another. Most typically done when changing hosting companies. from widgets to blocks.
Embeds in Text Widget and Video Widget
One shortcode not mentioned above is
embed. This one was more difficult to support because oEmbeds have not been supported anywhere other than post content. This was because there were dependencies on having a post as context for the sake of caching, as the responses to oEmbed requests get stored in postmeta. However, as of #34115 if there is no post as context the oEmbeds will now get cached in an
oembed_cache custom post type WordPress can hold and display many different types of content. A single item of such a content is generally called a post, although post is also a specific post type. Custom Post Types gives your site the ability to have templated posts, to simplify the concept. instead. Since a Text widget will explicitly nullify the global
$post while shortcodes are processed, this means oEmbeds will get cached in this custom post type. Similarly to how
do_shortcode() now applies in the
widget_text_content filter like it applies on
the_content, so too now
WP_Embed::run_shortcode() both also now run on
In WordPress 4.8 the Video widget was introduced with support for displaying an uploaded video file, a YouTube video, or a video from Vimeo. Each of these were displayed using MediaElement.js. Just as oEmbeds are now able to be displayed in the Text widget, so too now the Video widget has been expanded to support any oEmbed provider for video. See #42039.
Theme Styling Changes
As with the previously-introduced media widgets (#32417) and the new Gallery widget (#41914), some themes will need to be updated to ensure the proper styling is applied to media and embeds that appear in the widget area context, since previously they would only appear in post content. Please follow #42203 and #41969 for style changes that are made to the core bundled themes, as you may need to make similar changes to your themes.
Improved Theme Switching
A longstanding difficulty with widgets has been where they end up when switching from one theme to another. With #39693 this experience is improved in 4.9 by having logic that is able to better map widgets between the themes’ widget areas. As noted by @obenland in , there are three levels of mapping:
- If both themes have only one sidebar, they gets mapped.
- If both themes have sidebars with the same slug (e.g.
sidebar-1), they get mapped.
- Sidebars that (even partially) match slugs from a similar kind of sidebar will get mapped. For example, if one theme as a widget area called “Primary” and another theme has “Main” then the widgets will be mapped between these widget areas. Similarly, widgets would get mapped from “Bottom” to “Footer”.
The names for the widget areas used for the mapping groups were obtained by gathering statistics from all the themes on WordPress.org The community site where WordPress code is created and shared by the users. This is where you can download the source code for WordPress core, plugins and themes as well as the central location for community conversations and organization. https://wordpress.org/.
Widget Saved State on Admin (and super admin) Screen
With #23120 there is now an indication for whether or not changes to a given widget has been saved on the widgets admin screen. (Widgets in the Customizer Tool built into WordPress core that hooks into most modern themes. You can use it to preview and modify many of your site’s appearance settings. already had a saved state by virtue of being registered as regular settings.) When first opening a widget, the button will say “Saved” and appear disabled. Once a change is made to the widget (e.g. a
change event triggered), then the button will become enabled and say “Save”. If you try leaving the admin screen at this point, an “Are you sure?” message will appear alerting that if you leave your changes will be lost. If you cancel, then the first widget with unsaved changes will be scrolled into view, expanded, and focused. Upon hitting “Save” the spinner will appear and then upon a successful save it will switch to “Saved” and become disabled. The “Close” link has been changed to “Done” and it only appears when the changes have been saved. Note that the HTML5
change events whenever changes are written into any hidden inputs; this was already a requirement for widgets in the Customizer.
- #10457: Parse shortcodes in text widgets by default
- #23120: There should be indication that widget settings have been saved
- #34115: oEmbed not working on author page without posts
- #38017: Add widget instance to remaining widget argument filters
- #39693: Fix missing assignment of widgets on theme switch
- #40442: Widgets: Rename “Custom Menu” widget to “Menu”
- #40854: Allow media to be embedded in Text widget
- #41274: Improve discoverability of link URL in Image widget.
- #41610: Widgets: Change “close” to “done?”
- #41914: Widgets: Add gallery widget
- #41969: Ensure Gallery widget is styled properly across widget areas in bundled themes
- #42039: Widgets: Enable oEmbed support for Video widget
- #42203: Ensure media & embeds in Text widget are styled properly across widget areas in bundled themes
See full list of tickets in the Widgets component with the 4.9 milestone.