WordPress 4.7 introduces a significant reworking of action and 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. iteration to address bugs that arose from recursive callbacks and from callbacks that changed the hooked callbacks on currently running actions/filters.
What does this mean for you, the 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 or theme developer? In almost all cases, nothing. Everything should continue to run as expected, and this should fix a number of hard-to-trace bugs when different plugins are stepping on each others callbacks.
Who is affected?
If your plugin directly accesses the $wp_filter
global rather than using the public hooks In WordPress theme and development, hooks are functions that can be applied to an action or a Filter in WordPress. Actions are functions performed when a certain event occurs in WordPress. Filters allow you to modify certain functions. Arguments used to hook both filters and actions look the same. API An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways., you might run into compatibility issues.
Case 1: Directly setting callbacks in the $wp_filter
array
$wp_filter['save_post'][10]['my_special_key'] = array( 'function' => 'my_callback_function', 'accepted_args' => 2 );
This will no longer work, and will cause a fatal error. $wp_filter['save_post']
is no longer a simple array. Rather, it is an object that implements the ArrayAccess
interface.
You have two options to work around. The first (and preferred) method is to use the add_filter()
or add_action()
functions.
add_action( 'save_post', 'my_callback_function', 10, 2 );
If, for some reason, you absolutely cannot, you can still work around this.
if ( ! isset( $wp_filter['save_post'] ) ) {
$wp_filter['save_post'] = new WP_Hook();
}
$wp_filter[ 'save_post' ]->callbacks[10]['my_special_key'] = array( 'function' => 'my_callback_function', 'accepted_args' => 2 );
Case 2: Directly unsetting callbacks in the $wp_filter
array
unset( $wp_filter['save_post'][10][ $my_callback_id ] );
This will fail for the same reason as case one. To work around, you can use the standard remove_filter()
/ remove_action()
functions.
remove_action( 'save_post', 'my_callback_function', 10, 2 );
Or, if you absolutely must access the array directly:
if ( isset( $wp_filter[ 'save_post' ] ) ) {
unset( $wp_filter['save_post']->callbacks[10][ $my_callback_id ] );
}
Case 3: Checking if a hook is an array
if ( isset( $wp_filter['save_post'] ) && is_array( $wp_filter['save_post'] ) ) {
// do something
}
This will always return false. $wp_filter['save_post']
is a WP_Hook
object. To check if a hook has callbacks, use has_action()
or has_filter()
.
if ( has_action( 'save_post' ) ) {
// do something
}
Case 4: Moving the $wp_filter
array pointer manually
If you’re calling next()
or prev()
on the $wp_filter
array pointer to manually manage the order that callbacks are called in (or if you’re doing it to work around #17817), you will likely be unsuccessful. Use callback priorities, add_action()
/ add_filter()
, and remove_action()
/ remove_filter()
appropriately and let WordPress manage execution order.
Other Cases
Almost all other cases where you might manipulate the $wp_filter
global directly should continue to function as expected. The WP_Hook
object implements the ArrayAccess
and IteratorAggregate
interfaces so that, while it’s not recommended, you may continue to iterate over callbacks in $wp_filter
or directly retrieve priorities from the callback array.
Props
While there were many contributors of the course of this ticket Created for both bug reports and feature development on the bug tracker., all of whom are listed in the changeset, I’d like to especially thank @jbrinley, for his work in architecting this solution, researching and testing potential compatibility issues, and for authoring the bulk of this post.
What’s Next
We’re confident in how solid the code is for the majority of sites, and for the major edge cases, so now it’s time to add the code to the nightly build, so all y’all can test it against your sites and plugins.
This is being treated as an early commit of a feature project, so the final decision for whether this code will be kept in WordPress 4.7 will be made no later than beta A pre-release of software that is given out to a large group of users to trial under real conditions. Beta versions have gone through alpha testing in-house and are generally fairly close in look, feel and function to the final product; however, design changes often occur as part of the process. 1, which gives us a month and a half to see how it effects usage in the wider world.
The current nightly build contains this update, for your testing enjoyment.
If you have any feedback on the code, please leave a comment on this post. Please post any bugs you find to Core Trac.
#4-7, #dev-notes, #feature-projects, #hooks, #plugins