From 00680f2e89766e4ac9a71c68a8cccd3a141afb34 Mon Sep 17 00:00:00 2001 From: John Blackbourn Date: Tue, 1 Dec 2020 20:47:06 +0000 Subject: [PATCH] REST API: Pass the previous state of the post as a parameter to the `wp_after_insert_post` hook. This enables, for example, the previous post status to be used by this hook without the need to first capture it on an earlier hook. This also fixes the value of the `$fire_after_hooks` parameter in `get_default_post_to_edit()` so the `wp_after_insert_post` action correctly fires just once on the new post screen. Props Collizo4sky, peterwilsoncc, hellofromTonya, TimothyBlynJacobs, SergeyBiryukov Fixes #45114 Built from https://develop.svn.wordpress.org/trunk@49731 git-svn-id: http://core.svn.wordpress.org/trunk@49454 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-admin/includes/post.php | 4 +-- wp-includes/class-wp-customize-manager.php | 2 +- wp-includes/post.php | 25 ++++++++++++------- .../class-wp-rest-attachments-controller.php | 7 +++--- .../class-wp-rest-posts-controller.php | 7 +++--- wp-includes/version.php | 2 +- 6 files changed, 28 insertions(+), 19 deletions(-) diff --git a/wp-admin/includes/post.php b/wp-admin/includes/post.php index cb2cd060dd..fbf11b3ded 100644 --- a/wp-admin/includes/post.php +++ b/wp-admin/includes/post.php @@ -687,13 +687,13 @@ function get_default_post_to_edit( $post_type = 'post', $create_in_db = false ) 'post_status' => 'auto-draft', ), false, - true + false ); $post = get_post( $post_id ); if ( current_theme_supports( 'post-formats' ) && post_type_supports( $post->post_type, 'post-formats' ) && get_option( 'default_post_format' ) ) { set_post_format( $post, get_option( 'default_post_format' ) ); } - wp_after_insert_post( $post, false ); + wp_after_insert_post( $post, false, null ); // Schedule auto-draft cleanup. if ( ! wp_next_scheduled( 'wp_scheduled_auto_draft_delete' ) ) { diff --git a/wp-includes/class-wp-customize-manager.php b/wp-includes/class-wp-customize-manager.php index a46b97fa5a..ff433fe5db 100644 --- a/wp-includes/class-wp-customize-manager.php +++ b/wp-includes/class-wp-customize-manager.php @@ -3105,7 +3105,7 @@ final class WP_Customize_Manager { /** This action is documented in wp-includes/post.php */ do_action( 'wp_insert_post', $post->ID, $post, true ); - wp_after_insert_post( $post, true ); + wp_after_insert_post( get_post( $post_id ), true, $post ); wp_trash_post_comments( $post_id ); diff --git a/wp-includes/post.php b/wp-includes/post.php index 05321e73a7..4f9c3f8086 100644 --- a/wp-includes/post.php +++ b/wp-includes/post.php @@ -3716,6 +3716,7 @@ function wp_insert_post( $postarr, $wp_error = false, $fire_after_hooks = true ) $previous_status = get_post_field( 'post_status', $post_ID ); } else { $previous_status = 'new'; + $post_before = null; } $post_type = empty( $postarr['post_type'] ) ? 'post' : $postarr['post_type']; @@ -4318,7 +4319,7 @@ function wp_insert_post( $postarr, $wp_error = false, $fire_after_hooks = true ) do_action( 'wp_insert_post', $post_ID, $post, $update ); if ( $fire_after_hooks ) { - wp_after_insert_post( $post, $update ); + wp_after_insert_post( $post, $update, $post_before ); } return $post_ID; @@ -4431,6 +4432,8 @@ function wp_publish_post( $post ) { return; } + $post_before = get_post( $post->ID ); + // Ensure at least one term is applied for taxonomies with a default term. foreach ( get_object_taxonomies( $post->post_type, 'object' ) as $taxonomy => $tax_object ) { // Skip taxonomy if no default term is set. @@ -4481,7 +4484,7 @@ function wp_publish_post( $post ) { /** This action is documented in wp-includes/post.php */ do_action( 'wp_insert_post', $post->ID, $post, true ); - wp_after_insert_post( $post, true ); + wp_after_insert_post( $post, true, $post_before ); } /** @@ -4936,10 +4939,12 @@ function wp_transition_post_status( $new_status, $old_status, $post ) { * * @since 5.6.0 * - * @param int|WP_Post $post The post ID or object that has been saved. - * @param bool $update Whether this is an existing post being updated. + * @param int|WP_Post $post The post ID or object that has been saved. + * @param bool $update Whether this is an existing post being updated. + * @param null|WP_Post $post_before Null for new posts, the WP_Post object prior + * to the update for updated posts. */ -function wp_after_insert_post( $post, $update ) { +function wp_after_insert_post( $post, $update, $post_before ) { $post = get_post( $post ); if ( ! $post ) { return; @@ -4952,11 +4957,13 @@ function wp_after_insert_post( $post, $update ) { * * @since 5.6.0 * - * @param int $post_id Post ID. - * @param WP_Post $post Post object. - * @param bool $update Whether this is an existing post being updated. + * @param int $post_id Post ID. + * @param WP_Post $post Post object. + * @param bool $update Whether this is an existing post being updated. + * @param null|WP_Post $post_before Null for new posts, the WP_Post object prior + * to the update for updated posts. */ - do_action( 'wp_after_insert_post', $post_id, $post, $update ); + do_action( 'wp_after_insert_post', $post_id, $post, $update, $post_before ); } // diff --git a/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php b/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php index fcbf70f501..3eb0490960 100644 --- a/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php +++ b/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php @@ -191,7 +191,7 @@ class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller { */ do_action( 'rest_after_insert_attachment', $attachment, $request, true ); - wp_after_insert_post( $attachment, false ); + wp_after_insert_post( $attachment, false, null ); if ( defined( 'REST_REQUEST' ) && REST_REQUEST ) { // Set a custom header with the attachment_id. @@ -321,7 +321,8 @@ class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller { ); } - $response = parent::update_item( $request ); + $attachment_before = get_post( $request['id'] ); + $response = parent::update_item( $request ); if ( is_wp_error( $response ) ) { return $response; @@ -347,7 +348,7 @@ class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller { /** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php */ do_action( 'rest_after_insert_attachment', $attachment, $request, false ); - wp_after_insert_post( $attachment, true ); + wp_after_insert_post( $attachment, true, $attachment_before ); $response = $this->prepare_item_for_response( $attachment, $request ); $response = rest_ensure_response( $response ); diff --git a/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php b/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php index c168d8993c..a052d04964 100644 --- a/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php +++ b/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php @@ -677,7 +677,7 @@ class WP_REST_Posts_Controller extends WP_REST_Controller { */ do_action( "rest_after_insert_{$this->post_type}", $post, $request, true ); - wp_after_insert_post( $post, false ); + wp_after_insert_post( $post, false, null ); $response = $this->prepare_item_for_response( $post, $request ); $response = rest_ensure_response( $response ); @@ -753,7 +753,8 @@ class WP_REST_Posts_Controller extends WP_REST_Controller { return $valid_check; } - $post = $this->prepare_item_for_database( $request ); + $post_before = get_post( $request['id'] ); + $post = $this->prepare_item_for_database( $request ); if ( is_wp_error( $post ) ) { return $post; @@ -830,7 +831,7 @@ class WP_REST_Posts_Controller extends WP_REST_Controller { /** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php */ do_action( "rest_after_insert_{$this->post_type}", $post, $request, false ); - wp_after_insert_post( $post, true ); + wp_after_insert_post( $post, true, $post_before ); $response = $this->prepare_item_for_response( $post, $request ); diff --git a/wp-includes/version.php b/wp-includes/version.php index 0927c5a396..7555681a7e 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -13,7 +13,7 @@ * * @global string $wp_version */ -$wp_version = '5.7-alpha-49726'; +$wp_version = '5.7-alpha-49731'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.