WordPress.org

Make WordPress Core

Ticket #45114: 45114.diff

File 45114.diff, 7.6 KB (added by peterwilsoncc, 3 years ago)
  • src/wp-includes/post.php

    diff --git src/wp-includes/post.php src/wp-includes/post.php
    index c9d1edbe67..a3ff5a6992 100644
    function wp_insert_post( $postarr, $wp_error = false ) { 
    32233223                'guid' => '',
    32243224                'import_id' => 0,
    32253225                'context' => '',
     3226                'args' => array(
     3227                        'bypass_after_insert_hooks' => false,
     3228                ),
    32263229        );
    32273230
    3228         $postarr = wp_parse_args($postarr, $defaults);
     3231        $postarr = wp_parse_args( $postarr, $defaults );
     3232        $args    = wp_parse_args( $postarr[ 'args' ], $defaults['args'] );
    32293233
    3230         unset( $postarr[ 'filter' ] );
     3234        unset( $postarr[ 'filter' ], $postarr['args'] );
    32313235
    32323236        $postarr = sanitize_post($postarr, 'db');
    32333237
    function wp_insert_post( $postarr, $wp_error = false ) { 
    32533257                $previous_status = get_post_field('post_status', $post_ID );
    32543258        } else {
    32553259                $previous_status = 'new';
     3260                $post_before = array();
    32563261        }
    32573262
    32583263        $post_type = empty( $postarr['post_type'] ) ? 'post' : $postarr['post_type'];
    function wp_insert_post( $postarr, $wp_error = false ) { 
    36583663                }
    36593664        }
    36603665
    3661         if ( 'attachment' !== $postarr['post_type'] ) {
    3662                 wp_transition_post_status( $data['post_status'], $previous_status, $post );
     3666        /*
     3667         * Bypass hooks fired after
     3668         */
     3669        if ( true === $args[ 'bypass_after_insert_hooks' ] ) {
     3670                return $post_ID;
     3671        }
     3672
     3673        _wp_fire_after_insert_post_hooks( array(
     3674                'post_id'       => $post_ID,
     3675                'post_before'   => $post_before,
     3676                'status_after'  => $data[ 'post_status' ],
     3677                'status_before' => $previous_status,
     3678        ) );
     3679
     3680        return $post_ID;
     3681}
     3682
     3683/**
     3684 * Fire save hooks after a post is inserted or updated.
     3685 *
     3686 * @access private
     3687 *
     3688 * @since 5.0.0
     3689 *
     3690 * @param $args array Arguments required for firing hooks after saving post.
     3691 * @return int The post ID.
     3692 */
     3693function _wp_fire_after_insert_post_hooks( $args ) {
     3694        if ( empty( $args['post_id'] ) ) {
     3695                return 0;
     3696        }
     3697
     3698        $defaults = array(
     3699                'status_before' => 'new',
     3700                'status_after' => 'draft',
     3701                'post_before' => array(),
     3702        );
     3703
     3704        $args = wp_parse_args( $args, $defaults );
     3705
     3706        $new_status      = $args[ 'status_after' ];
     3707        $previous_status = $args[ 'status_before' ];
     3708        $post_ID         = $args[ 'post_id' ];
     3709        $post_before     = $args[ 'post_before' ];
     3710        $update          = $previous_status === 'new' ? false : true;
     3711        $post            = get_post( $post_ID );
     3712
     3713        if ( ! $post ) {
     3714                return 0;
     3715        }
     3716
     3717        if ( 'attachment' !== $post->post_type ) {
     3718                wp_transition_post_status( $new_status, $previous_status, $post );
    36633719        } else {
    36643720                if ( $update ) {
    36653721                        /**
  • src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php

    diff --git src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php
    index 31cb070b94..fb02d5ce44 100644
    class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller { 
    146146                        $attachment->post_title = preg_replace( '/\.[^.]+$/', '', basename( $file ) );
    147147                }
    148148
     149                // convert the post object to an array, otherwise wp_update_post will expect non-escaped input.
     150                $attachment = wp_slash( (array) $attachment );
     151
     152                /*
     153                 * Bypass after insert hooks in `wp_insert_post()` as they are fired
     154                 * after terms and meta data have been updated below.
     155                 */
     156                $attachment['args']['bypass_after_insert_hooks'] = true;
     157
    149158                // $post_parent is inherited from $attachment['post_parent'].
    150                 $id = wp_insert_attachment( wp_slash( (array) $attachment ), $file, 0, true );
     159                $id = wp_insert_attachment( $attachment, $file, 0, true );
    151160
    152161                if ( is_wp_error( $id ) ) {
    153162                        if ( 'db_update_error' === $id->get_error_code() ) {
    class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller { 
    190199
    191200                $request->set_param( 'context', 'edit' );
    192201
     202                _wp_fire_after_insert_post_hooks( array(
     203                        'post_id'       => $id,
     204                        'status_before' => 'new',
     205                        'status_after'  => $attachment->post_status,
     206                        'post_before'   => array(),
     207                ) );
     208
    193209                /**
    194210                 * Fires after a single attachment is completely created or updated via the REST API.
    195211                 *
    class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller { 
    222238                        return new WP_Error( 'rest_invalid_param', __( 'Invalid parent type.' ), array( 'status' => 400 ) );
    223239                }
    224240
     241                $attachment_before = get_post( $request['id'] );
     242                $status_before     = $attachment_before->post_status;
     243
    225244                $response = parent::update_item( $request );
    226245
    227246                if ( is_wp_error( $response ) ) {
    class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller { 
    245264
    246265                $request->set_param( 'context', 'edit' );
    247266
     267                _wp_fire_after_insert_post_hooks( array(
     268                        'post_id'       => $attachment->ID,
     269                        'status_before' => $status_before,
     270                        'status_after'  => $attachment->post_status,
     271                        'post_before'   => $attachment_before,
     272                ) );
     273
    248274                /** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php */
    249275                do_action( 'rest_after_insert_attachment', $attachment, $request, false );
    250276
  • src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

    diff --git src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
    index 1316771274..77a596560d 100644
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    527527
    528528                $prepared_post->post_type = $this->post_type;
    529529
    530                 $post_id = wp_insert_post( wp_slash( (array) $prepared_post ), true );
     530                // convert the post object to an array, otherwise wp_update_post will expect non-escaped input.
     531                $postarr = wp_slash( (array) $prepared_post );
     532
     533                /*
     534                 * Bypass after insert hooks in `wp_insert_post()` as they are fired
     535                 * after terms and meta data have been updated below.
     536                 */
     537                $postarr['args']['bypass_after_insert_hooks'] = true;
     538
     539                $post_id = wp_insert_post( $postarr, true );
    531540
    532541                if ( is_wp_error( $post_id ) ) {
    533542
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    600609
    601610                $request->set_param( 'context', 'edit' );
    602611
     612                _wp_fire_after_insert_post_hooks( array(
     613                        'post_id'       => $post_id,
     614                        'status_before' => 'new',
     615                        'status_after'  => $post->post_status,
     616                        'post_before'   => array(),
     617                ) );
     618
    603619                /**
    604620                 * Fires after a single post is completely created or updated via the REST API.
    605621                 *
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    677693                        return $post;
    678694                }
    679695
     696                $post_before   = get_post( $request['id'] );
     697                $status_before = $post_before->post_status;
     698
    680699                // convert the post object to an array, otherwise wp_update_post will expect non-escaped input.
    681                 $post_id = wp_update_post( wp_slash( (array) $post ), true );
     700                $postarr = wp_slash( (array) $post );
     701
     702                /*
     703                 * Bypass after insert hooks in `wp_insert_post()` as they are fired
     704                 * after terms and meta data have been updated below.
     705                 */
     706                $postarr['args']['bypass_after_insert_hooks'] = true;
     707
     708                $post_id = wp_update_post( $postarr, true );
    682709
    683710                if ( is_wp_error( $post_id ) ) {
    684711                        if ( 'db_update_error' === $post_id->get_error_code() ) {
    class WP_REST_Posts_Controller extends WP_REST_Controller { 
    745772                        return rest_ensure_response( $response );
    746773                }
    747774
     775                _wp_fire_after_insert_post_hooks( array(
     776                        'post_id'       => $post_id,
     777                        'status_before' => $status_before,
     778                        'status_after'  => $post->post_status,
     779                        'post_before'   => $post_before,
     780                ) );
     781
    748782                /** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php */
    749783                do_action( "rest_after_insert_{$this->post_type}", $post, $request, false );
    750784