How to Hook a Function to an Action in WordPress
The function add_action
hooks a function to an action in WordPress.
Background
WordPress actions allow the injection of code into a subject to perform custom tasks. An action consists of a name and a set of callbacks. The function add_action
adds a new callback to the set of callbacks of an action.
When an action is triggered, WordPress executes all callbacks hooked to the action. The execution is sequential according to the priority of each callback.
Syntax
add_action($tag, $function, $priority, $accepted_args)
adds the function $function
to the set of callbacks of the $tag
action. $priority
is the priority of $function
within the set of callbacks. $accepted_args
is the number of arguments that $function
accepts.
$priority
and $accepted_args
are optional. By default, $priority
is 10 and $accepted_args
is 1. Lower $priority
values mean earlier execution. Functions with the same priority are executed in the order in which they were added to the action.
If $tag
is 'all'
, WordPress executes $function
for all actions.
Example
The following procedure is adaptable to any situation. For this case, suppose you need to develop a solution that sends a notification email to the website administrator each time a post is updated.
Step 1: Identify if WordPress has an action that can solve your problem.
WordPress triggers the 'post_updated'
action each time a post is updated.
Step 2: Find where the action is triggered in the codebase.
The function do_action
triggers an action in WordPress. Open the search feature of the IDE and find occurrences of the text do_action( 'post_updated'
in the codebase. You will find that this action is triggered only once and it is documented using PHPDoc comments. The call is in the file post.php.
Note that the search criterion has a whitespace after do_action(
.
/**
* Fires once an existing post has been updated.
*
* @since 3.0.0
*
* @param int $post_ID Post ID.
* @param WP_Post $post_after Post object following the update.
* @param WP_Post $post_before Post object before the update.
*/
do_action( 'post_updated', $post_ID, $post_after, $post_before);
Step 3: Develop a compatible function according to your needs or find an existing one.
The 'post_updated'
action is triggered passing three arguments: the post ID, the post object after the update, and the post object before the update. Therefore, any function hooked to this action can take up to three parameters.
We will send a custom message to the website administrator, so we need to develop a new function. Since we do not need to compare values before and after the update, the function only uses the second argument passed in the call to do_action
.
/*
* Sends an email to the website administrator notifying that a post has been updated.
*/
function ns_notify_post_updated($post_ID){
$to = get_bloginfo('admin_email');
$subject = __('Post Updated', 'ns');
$message = __('Hello Admin! The following post has been updated: ', 'ns') . get_permalink($post_ID);
wp_mail($to, $subject, $message);
}
Step 4: Hook the function to the action.
Use add_action
to add the function ns_notify_post_updated
to the set of callbacks of the 'post_updated'
action.
add_action('post_updated', 'ns_notify_post_updated', 10, 1);
Step 5: Test.
Update various posts and check the inbox of the administrative email address. Note that your server must be properly configured to send emails.
Further reading
I recommend the other tutorials in this series to learn more about actions in WordPress.
Exercise
Develop a solution that sends a notification email to the website administrator each time an attachment is added.
Source code
The source code developed in this tutorial, including a possible answer to the exercise, is available here.
Comments