do_action( 'save_post', int $post_id , WP_Post $post , bool $update )
Fires once a post has been saved.
Contents
Parameters
-
$post_id
int -
Post ID.
-
$post
WP_Post -
Post object.
-
$update
bool -
Whether this is an existing post being updated.
More Information
save_post
is an action triggered whenever a post or page is created or updated, which could be from an import, post/page edit form, xmlrpc, or post by email. The data for the post is stored in $_POST
, $_GET
or the global $post_data
, depending on how the post was edited. For example, quick edits use $_POST
.
Since this action is triggered right after the post has been saved, you can easily access this post object by using get_post($post_id);
.
NOTE: As of WP 3.7, an alternative action has been introduced, which is called for specific post types: save_post_{post_type}
. Hooking to this action prevents your callback to be unnecessarily triggered.
Avoiding infinite loops
If you are calling a function such as wp_update_post
that includes the save_post
hook, your hooked function will create an infinite loop. To avoid this, unhook your function before calling the function you need, then re-hook it afterward.
/**
* Makes all posts in the default category private.
*
* @see 'save_post'
*
* @param int $post_id The post being saved.
*/
function set_private_categories( $post_id ) {
// If this is a revision, get real post ID.
$parent_id = wp_is_post_revision( $post_id );
if ( false !== $parent_id ) {
$post_id = $parent_id;
}
// Get default category ID from options.
$defaultcat = get_option( 'default_category' );
// Check if this post is in default category.
if ( in_category( $defaultcat, $post_id ) ) {
// unhook this function so it doesn't loop infinitely
remove_action( 'save_post', 'set_private_categories' );
// update the post, which calls save_post again.
wp_update_post( array( 'ID' => $post_id, 'post_status' => 'private' ) );
// re-hook this function.
add_action( 'save_post', 'set_private_categories' );
}
}
add_action( 'save_post', 'set_private_categories' );
Source
File: wp-includes/post.php
.
View all references
do_action( 'save_post', $post_id, $post, $update );
Changelog
Version | Description |
---|---|
1.5.0 | Introduced. |
User Contributed Notes
You must log in before being able to contribute a note or feedback.
When using WordPress 3.7 or later, it’s a good idea to use the save_post_{$post->post_type} hook when it makes sense to in order to reduce code and fire less hooks overall when posts are created and updated.
Documentation can be found here: https://developer.wordpress.org/reference/hooks/save_post_post-post_type/
Top ↑
Feedback
Note that save_post_{$post->post_type} fires before save_post. Many popular plugins hook into save_post and therefore save_post_{$post->post_type} may not be appropriate. — By Joseph D’Souza —
Force a new post of have specific category term,
Below is a basic example that will send an email every time a post or page is updated on your website.
The save_post_{post_type} hook fires BEFORE the general save_post hook, meaning that save_post will override any meta updates made with save_post_{post_type}. Many plugins like ACF and Pods use the save post action hook, so if you are trying to update a meta field and you are using one of these plugins, you must use the save_post hook instead.
To trigger for specific post type, assume we have a post type name ‘book’
The
$post_ID
passed to the action is the ID of the revision while updating a post. To find the ID of the parent post, usewp_get_post_parent_id
.