How to Trigger a Filter in WordPress

The function apply_filters triggers a filter in WordPress.

Background

WordPress filters are a mechanism to allow the replacement of values produced by the code being run. A filter consists of a name and a set of callbacks.

Triggering a filter means executing all callbacks hooked to the filter. The execution is sequential according to the priority of each callback.

Syntax

apply_filters($tag, $value, $var1, …) executes all callbacks hooked to the $tag filter and returns a filtered version of $value. Parameters after $value, if any, are to provide context.

Each callback receives the result produced by the previous one, or $value if it is the first callback, and returns an output. The result is the output of the last callback in the queue. If no callbacks were hooked to the filter, the result is equal to $value.

WordPress also has the function apply_filters_ref_array($tag, $args) to trigger filters. The difference is that in this case arguments are supplied as elements of the $args array.

A call to apply_filters or apply_filters_ref_array creates an extension point. Anyone can hook functions to the filter to inject custom code that replaces the data being filtered.

Examples

The WordPress Core triggers filters extensively. To check it, open the search feature of the IDE and find occurrences of apply_filters or apply_filters_ref_array in the codebase.

For example, the 'wp_revisions_to_keep' filter is triggered in the file revisions.php to allow replacing the number of revisions that WordPress keeps for a post

/**
 * Filters the number of revisions to save for the given post.
 *
 * Overrides the value of WP_POST_REVISIONS.
 *
 * @since 3.6.0
 *
 * @param int     $num  Number of revisions to store.
 * @param WP_Post $post Post object.
 */
return (int) apply_filters( 'wp_revisions_to_keep', $num, $post );

and the 'post_link' filter is triggered in the file link-template.php to allow specifying a new permalink for a post.

/**
 * Filters the permalink for a post.
 *
 * Only applies to posts with post_type of 'post'.
 *
 * @since 1.5.0
 *
 * @param string  $permalink The post's permalink.
 * @param WP_Post $post      The post in question.
 * @param bool    $leavename Whether to keep the post name.
 */
return apply_filters( 'post_link', $permalink, $post, $leavename );

Further reading

I recommend the other tutorials in this series to learn more about filters in WordPress.

Exercise

Suppose a solution where posts can be locked or unlocked. Develop a function that returns the lock status of a post. The function should allow plugins and themes to customize the output.

Source code

The source code developed in this tutorial, including a possible answer to the exercise, is available here.