From 43290b2e045b5fa0929f5e6d5acb6615d2184650 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Tue, 30 Nov 2021 01:10:08 +0000 Subject: [PATCH] REST API: Fire `wp_after_insert_post` later in new post object endpoints. In the new menu items, global items and template controllers manually call the function `wp_after_insert_post()` to manually fire the action of the same name after all potential data is updated. This accounts for the use case in which a theme or plugin developer has modified the endpoints use of either taxonomy or meta data. The new parameter `$fire_after_hooks` is added to `wp_update_nav_menu_item()` to control whether the `wp_after_insert_post` action is fired when it in turn calls `wp_insert_post()`. Props spacedmonkey, peterwilsoncc, zieladam. Fixes #54536. Built from https://develop.svn.wordpress.org/trunk@52276 git-svn-id: http://core.svn.wordpress.org/trunk@51868 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/nav-menu.php | 6 ++++-- .../class-wp-rest-global-styles-controller.php | 15 ++++++++------- .../class-wp-rest-menu-items-controller.php | 14 ++++++++++---- .../class-wp-rest-templates-controller.php | 13 +++++++++++-- wp-includes/version.php | 2 +- 5 files changed, 34 insertions(+), 16 deletions(-) diff --git a/wp-includes/nav-menu.php b/wp-includes/nav-menu.php index c289c2c916..613d2ead92 100644 --- a/wp-includes/nav-menu.php +++ b/wp-includes/nav-menu.php @@ -410,13 +410,15 @@ function wp_update_nav_menu_object( $menu_id = 0, $menu_data = array() ) { * to be pre-slashed since they are passed directly to APIs that expect slashed data. * * @since 3.0.0 + * @since 5.9.0 Added the `$fire_after_hooks` parameter. * * @param int $menu_id The ID of the menu. Required. If "0", makes the menu item a draft orphan. * @param int $menu_item_db_id The ID of the menu item. If "0", creates a new menu item. * @param array $menu_item_data The menu item's data. + * @param bool $fire_after_hooks Whether to fire the after insert hooks. Default true. * @return int|WP_Error The menu item's database ID or WP_Error object on failure. */ -function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item_data = array() ) { +function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item_data = array(), $fire_after_hooks = true ) { $menu_id = (int) $menu_id; $menu_item_db_id = (int) $menu_item_db_id; @@ -526,7 +528,7 @@ function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item if ( ! $update ) { $post['ID'] = 0; $post['post_status'] = 'publish' === $args['menu-item-status'] ? 'publish' : 'draft'; - $menu_item_db_id = wp_insert_post( $post, true ); + $menu_item_db_id = wp_insert_post( $post, true, $fire_after_hooks ); if ( ! $menu_item_db_id || is_wp_error( $menu_item_db_id ) ) { return $menu_item_db_id; } diff --git a/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-controller.php b/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-controller.php index 0bbc54169e..46d5a8a831 100644 --- a/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-controller.php +++ b/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-controller.php @@ -146,13 +146,13 @@ class WP_REST_Global_Styles_Controller extends WP_REST_Controller { * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. */ public function update_item( $request ) { - $post = get_post( $request['id'] ); - if ( ! $post || 'wp_global_styles' !== $post->post_type ) { + $post_before = get_post( $request['id'] ); + if ( ! $post_before || 'wp_global_styles' !== $post_before->post_type ) { return new WP_Error( 'rest_global_styles_not_found', __( 'No global styles config exist with that id.' ), array( 'status' => 404 ) ); } $changes = $this->prepare_item_for_database( $request ); - $result = wp_update_post( wp_slash( (array) $changes ), true ); + $result = wp_update_post( wp_slash( (array) $changes ), true, false ); if ( is_wp_error( $result ) ) { return $result; } @@ -163,10 +163,11 @@ class WP_REST_Global_Styles_Controller extends WP_REST_Controller { return $fields_update; } - return $this->prepare_item_for_response( - get_post( $request['id'] ), - $request - ); + wp_after_insert_post( $post, true, $post_before ); + + $response = $this->prepare_item_for_response( $post, $request ); + + return rest_ensure_response( $response ); } /** diff --git a/wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php b/wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php index 7a96e0a425..57ddc38078 100644 --- a/wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php +++ b/wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php @@ -122,7 +122,7 @@ class WP_REST_Menu_Items_Controller extends WP_REST_Posts_Controller { } $prepared_nav_item = (array) $prepared_nav_item; - $nav_menu_item_id = wp_update_nav_menu_item( $prepared_nav_item['menu-id'], $prepared_nav_item['menu-item-db-id'], wp_slash( $prepared_nav_item ) ); + $nav_menu_item_id = wp_update_nav_menu_item( $prepared_nav_item['menu-id'], $prepared_nav_item['menu-item-db-id'], wp_slash( $prepared_nav_item ), false ); if ( is_wp_error( $nav_menu_item_id ) ) { if ( 'db_insert_error' === $nav_menu_item_id->get_error_code() ) { $nav_menu_item_id->add_data( array( 'status' => 500 ) ); @@ -181,7 +181,10 @@ class WP_REST_Menu_Items_Controller extends WP_REST_Posts_Controller { */ do_action( 'rest_after_insert_nav_menu_item', $nav_menu_item, $request, true ); - $response = $this->prepare_item_for_response( get_post( $nav_menu_item_id ), $request ); + $post = get_post( $nav_menu_item_id ); + wp_after_insert_post( $post, false, null ); + + $response = $this->prepare_item_for_response( $post, $request ); $response = rest_ensure_response( $response ); $response->set_status( 201 ); @@ -204,7 +207,7 @@ class WP_REST_Menu_Items_Controller extends WP_REST_Posts_Controller { if ( is_wp_error( $valid_check ) ) { return $valid_check; } - + $post_before = get_post( $request['id'] ); $prepared_nav_item = $this->prepare_item_for_database( $request ); if ( is_wp_error( $prepared_nav_item ) ) { @@ -213,7 +216,7 @@ class WP_REST_Menu_Items_Controller extends WP_REST_Posts_Controller { $prepared_nav_item = (array) $prepared_nav_item; - $nav_menu_item_id = wp_update_nav_menu_item( $prepared_nav_item['menu-id'], $prepared_nav_item['menu-item-db-id'], wp_slash( $prepared_nav_item ) ); + $nav_menu_item_id = wp_update_nav_menu_item( $prepared_nav_item['menu-id'], $prepared_nav_item['menu-item-db-id'], wp_slash( $prepared_nav_item ), false ); if ( is_wp_error( $nav_menu_item_id ) ) { if ( 'db_update_error' === $nav_menu_item_id->get_error_code() ) { @@ -245,6 +248,7 @@ class WP_REST_Menu_Items_Controller extends WP_REST_Posts_Controller { } } + $post = get_post( $nav_menu_item_id ); $nav_menu_item = $this->get_nav_menu_item( $nav_menu_item_id ); $fields_update = $this->update_additional_fields_for_object( $nav_menu_item, $request ); @@ -257,6 +261,8 @@ class WP_REST_Menu_Items_Controller extends WP_REST_Posts_Controller { /** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php */ do_action( 'rest_after_insert_nav_menu_item', $nav_menu_item, $request, false ); + wp_after_insert_post( $post, true, $post_before ); + $response = $this->prepare_item_for_response( get_post( $nav_menu_item_id ), $request ); return rest_ensure_response( $response ); diff --git a/wp-includes/rest-api/endpoints/class-wp-rest-templates-controller.php b/wp-includes/rest-api/endpoints/class-wp-rest-templates-controller.php index 0c149bab93..c3df07e7f5 100644 --- a/wp-includes/rest-api/endpoints/class-wp-rest-templates-controller.php +++ b/wp-includes/rest-api/endpoints/class-wp-rest-templates-controller.php @@ -266,6 +266,8 @@ class WP_REST_Templates_Controller extends WP_REST_Controller { return new WP_Error( 'rest_template_not_found', __( 'No templates exist with that id.' ), array( 'status' => 404 ) ); } + $post_before = get_post( $template->wp_id ); + if ( isset( $request['source'] ) && 'theme' === $request['source'] ) { wp_delete_post( $template->wp_id, true ); $request->set_param( 'context', 'edit' ); @@ -283,9 +285,12 @@ class WP_REST_Templates_Controller extends WP_REST_Controller { } if ( 'custom' === $template->source ) { - $result = wp_update_post( wp_slash( (array) $changes ), true ); + $update = true; + $result = wp_update_post( wp_slash( (array) $changes ), false ); } else { - $result = wp_insert_post( wp_slash( (array) $changes ), true ); + $update = false; + $post_before = null; + $result = wp_insert_post( wp_slash( (array) $changes ), false ); } if ( is_wp_error( $result ) ) { @@ -309,6 +314,8 @@ class WP_REST_Templates_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, $update, $post_before ); + $response = $this->prepare_item_for_response( $template, $request ); return rest_ensure_response( $response ); @@ -367,6 +374,8 @@ class WP_REST_Templates_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, true ); + wp_after_insert_post( $post, false, null ); + $response = $this->prepare_item_for_response( $template, $request ); $response = rest_ensure_response( $response ); diff --git a/wp-includes/version.php b/wp-includes/version.php index efd207d6e9..d34f6bd959 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -16,7 +16,7 @@ * * @global string $wp_version */ -$wp_version = '5.9-alpha-52275'; +$wp_version = '5.9-alpha-52276'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.