do_action( 'save_post', int $post_ID , WP_Post $post , bool $update )
Fires once a post has been saved.
Contents
Description Description
Parameters Parameters
- $post_ID
-
(int) Post ID.
- $post
-
(WP_Post) Post object.
- $update
-
(bool) Whether this is an existing post being updated or not.
Source Source
File: wp-includes/post.php
Changelog Changelog
| Version | Description |
|---|---|
| 1.5.0 | Introduced. |
More Information 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 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // this function makes all posts in the default category privatefunction set_private_categories($post_id) { // If this is a revision, get real post ID if ( $parent_id = wp_is_post_revision( $post_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' ); |
User Contributed Notes 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/
Force a new post of have specific category term,
add_action('save_post','set_post_default_category', 10,3 );functionset_post_default_category($post_id,$post,$update) {// Only want to set if this is a new post!if($update){return;}// Only set for post_type = post!if('post'!==$post->post_type ) {return;}// Get the default term using the slug, its more portable!$term= get_term_by('slug','my-custom-term','category');wp_set_post_terms($post_id,$term->term_id,'category', true );}Expand full source codeCollapse full source code
Below is a basic example that will send an email every time a post or page is updated on your website.
functionmy_project_updated_send_email($post_id) {// If this is just a revision, don't send the email.if( wp_is_post_revision($post_id) ) {return;}$post_title= get_the_title($post_id);$post_url= get_permalink($post_id);$subject='A post has been updated';$message="A post has been updated on your website:\n\n";$message.=$post_title.": ".$post_url;// Send email to admin.wp_mail('admin@example.com',$subject,$message);}add_action('save_post','my_project_updated_send_email');Expand full source codeCollapse full source code