WordPress.org

Make WordPress Core

Changeset 39348


Ignore:
Timestamp:
11/23/16 15:32:25 (4 months ago)
Author:
rachelbaker
Message:

REST API: Always fire the rest_insert_* actions after the related object is updated or inserted.

Brings consistency to the rest_insert_* actions. Also includes some shuffling and clean-up as well including:

  • Ensure we are passing the most current $post and $user objects to the update_additional_fields_for_object() callbacks.
  • Changes the function signature of handle_status_param() in the Comments controller to accept just the comment_id as the 2nd parameter, instead of a full WP_Comment object. Only the comment_id is needed in the method, this avoids having to include another get_comment() call.
  • Renames a variable in the create_item() method of the Posts controller from $post -> $prepared_post to be more explicit.
  • Minor fixes/clarifications to the rest_insert_* hook docs

Props rachelbaker, joehoyle
Fixes #38905.

Location:
trunk/src/wp-includes/rest-api/endpoints
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php

    r39342 r39348  
    156156        $attachment = get_post( $id ); 
    157157 
     158        /** 
     159         * Fires after a single attachment is created or updated via the REST API. 
     160         * 
     161         * @since 4.7.0 
     162         * 
     163         * @param WP_Post         $attachment Inserted or updated attachment 
     164         *                                    object. 
     165         * @param WP_REST_Request $request    The request sent to the API. 
     166         * @param bool            $creating   True when creating an attachment, false when updating. 
     167         */ 
     168        do_action( 'rest_insert_attachment', $attachment, $request, true ); 
     169 
    158170        // Include admin functions to get access to wp_generate_attachment_metadata(). 
    159171        require_once ABSPATH . 'wp-admin/includes/admin.php'; 
     
    177189        $response->header( 'Location', rest_url( sprintf( '%s/%s/%d', $this->namespace, $this->rest_base, $id ) ) ); 
    178190 
    179         /** 
    180          * Fires after a single attachment is created or updated via the REST API. 
    181          * 
    182          * @since 4.7.0 
    183          * 
    184          * @param object          $attachment Inserted attachment. 
    185          * @param WP_REST_Request $request    The request sent to the API. 
    186          * @param bool            $creating   True when creating an attachment, false when updating. 
    187          */ 
    188         do_action( 'rest_insert_attachment', $attachment, $request, true ); 
    189  
    190191        return $response; 
    191192    } 
     
    220221        $attachment = get_post( $request['id'] ); 
    221222 
     223        /* This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php */ 
     224        do_action( 'rest_insert_attachment', $data, $request, false ); 
     225 
    222226        $fields_update = $this->update_additional_fields_for_object( $attachment, $request ); 
    223227 
     
    229233        $response = $this->prepare_item_for_response( $attachment, $request ); 
    230234        $response = rest_ensure_response( $response ); 
    231  
    232         /* This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php */ 
    233         do_action( 'rest_insert_attachment', $data, $request, false ); 
    234235 
    235236        return $response; 
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php

    r39342 r39348  
    568568 
    569569        if ( isset( $request['status'] ) ) { 
    570             $comment = get_comment( $comment_id ); 
    571  
    572             $this->handle_status_param( $request['status'], $comment ); 
    573         } 
     570            $this->handle_status_param( $request['status'], $comment_id ); 
     571        } 
     572 
     573        $comment = get_comment( $comment_id ); 
     574 
     575        /** 
     576         * Fires after a comment is created or updated via the REST API. 
     577         * 
     578         * @since 4.7.0 
     579         * 
     580         * @param WP_Comment      $comment  Inserted or updated comment object. 
     581         * @param WP_REST_Request $request  Request object. 
     582         * @param bool            $creating True when creating a comment, false 
     583         *                                  when updating. 
     584         */ 
     585        do_action( 'rest_insert_comment', $comment, $request, true ); 
    574586 
    575587        $schema = $this->get_item_schema(); 
     
    583595        } 
    584596 
    585         $comment = get_comment( $comment_id ); 
    586  
    587597        $fields_update = $this->update_additional_fields_for_object( $comment, $request ); 
    588598 
     
    601611        $response->header( 'Location', rest_url( sprintf( '%s/%s/%d', $this->namespace, $this->rest_base, $comment_id ) ) ); 
    602612 
    603         /** 
    604          * Fires after a comment is created or updated via the REST API. 
    605          * 
    606          * @since 4.7.0 
    607          * 
    608          * @param array           $comment  Comment as it exists in the database. 
    609          * @param WP_REST_Request $request  The request sent to the API. 
    610          * @param bool            $creating True when creating a comment, false when updating. 
    611          */ 
    612         do_action( 'rest_insert_comment', $comment, $request, true ); 
    613613 
    614614        return $response; 
     
    667667        if ( empty( $prepared_args ) && isset( $request['status'] ) ) { 
    668668            // Only the comment status is being changed. 
    669             $change = $this->handle_status_param( $request['status'], $comment ); 
     669            $change = $this->handle_status_param( $request['status'], $id ); 
    670670 
    671671            if ( ! $change ) { 
     
    696696 
    697697            if ( isset( $request['status'] ) ) { 
    698                 $this->handle_status_param( $request['status'], $comment ); 
    699             } 
    700         } 
     698                $this->handle_status_param( $request['status'], $id ); 
     699            } 
     700        } 
     701 
     702        $comment = get_comment( $id ); 
     703 
     704        /* This action is documented in lib/endpoints/class-wp-rest-comments-controller.php */ 
     705        do_action( 'rest_insert_comment', $comment, $request, false ); 
    701706 
    702707        $schema = $this->get_item_schema(); 
     
    710715        } 
    711716 
    712         $comment = get_comment( $id ); 
    713  
    714717        $fields_update = $this->update_additional_fields_for_object( $comment, $request ); 
    715718 
     
    721724 
    722725        $response = $this->prepare_item_for_response( $comment, $request ); 
    723  
    724         /* This action is documented in lib/endpoints/class-wp-rest-comments-controller.php */ 
    725         do_action( 'rest_insert_comment', $comment, $request, false ); 
    726726 
    727727        return rest_ensure_response( $response ); 
     
    14341434     * 
    14351435     * @param string|int $new_status New comment status. 
    1436      * @param WP_Comment $comment    Comment data. 
     1436     * @param int        $comment_id Comment ID. 
    14371437     * @return bool Whether the status was changed. 
    14381438     */ 
    1439     protected function handle_status_param( $new_status, $comment ) { 
    1440         $old_status = wp_get_comment_status( $comment->comment_ID ); 
     1439    protected function handle_status_param( $new_status, $comment_id ) { 
     1440        $old_status = wp_get_comment_status( $comment_id ); 
    14411441 
    14421442        if ( $new_status === $old_status ) { 
     
    14481448            case 'approve': 
    14491449            case '1': 
    1450                 $changed = wp_set_comment_status( $comment->comment_ID, 'approve' ); 
     1450                $changed = wp_set_comment_status( $comment_id, 'approve' ); 
    14511451                break; 
    14521452            case 'hold': 
    14531453            case '0': 
    1454                 $changed = wp_set_comment_status( $comment->comment_ID, 'hold' ); 
     1454                $changed = wp_set_comment_status( $comment_id, 'hold' ); 
    14551455                break; 
    14561456            case 'spam' : 
    1457                 $changed = wp_spam_comment( $comment->comment_ID ); 
     1457                $changed = wp_spam_comment( $comment_id ); 
    14581458                break; 
    14591459            case 'unspam' : 
    1460                 $changed = wp_unspam_comment( $comment->comment_ID ); 
     1460                $changed = wp_unspam_comment( $comment_id ); 
    14611461                break; 
    14621462            case 'trash' : 
    1463                 $changed = wp_trash_comment( $comment->comment_ID ); 
     1463                $changed = wp_trash_comment( $comment_id ); 
    14641464                break; 
    14651465            case 'untrash' : 
    1466                 $changed = wp_untrash_comment( $comment->comment_ID ); 
     1466                $changed = wp_untrash_comment( $comment_id ); 
    14671467                break; 
    14681468            default : 
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

    r39343 r39348  
    483483        } 
    484484 
    485         $post = $this->prepare_item_for_database( $request ); 
    486  
    487         if ( is_wp_error( $post ) ) { 
    488             return $post; 
    489         } 
    490  
    491         $post->post_type = $this->post_type; 
    492         $post_id         = wp_insert_post( wp_slash( (array) $post ), true ); 
     485        $prepared_post = $this->prepare_item_for_database( $request ); 
     486 
     487        if ( is_wp_error( $prepared_post ) ) { 
     488            return $prepared_post; 
     489        } 
     490 
     491        $prepared_post->post_type = $this->post_type; 
     492 
     493        $post_id = wp_insert_post( wp_slash( (array) $prepared_post ), true ); 
    493494 
    494495        if ( is_wp_error( $post_id ) ) { 
     
    503504        } 
    504505 
    505         $post->ID = $post_id; 
     506        $post = get_post( $post_id ); 
     507 
     508        /** 
     509         * Fires after a single post is created or updated via the REST API. 
     510         * 
     511         * The dynamic portion of the hook name, `$this->post_type`, refers to the post type slug. 
     512         * 
     513         * @since 4.7.0 
     514         * 
     515         * @param WP_Post         $post     Inserted or updated post object. 
     516         * @param WP_REST_Request $request  Request object. 
     517         * @param bool            $creating True when creating a post, false when updating. 
     518         */ 
     519        do_action( "rest_insert_{$this->post_type}", $post, $request, true ); 
    506520 
    507521        $schema = $this->get_item_schema(); 
     
    516530 
    517531        if ( ! empty( $schema['properties']['featured_media'] ) && isset( $request['featured_media'] ) ) { 
    518             $this->handle_featured_media( $request['featured_media'], $post->ID ); 
     532            $this->handle_featured_media( $request['featured_media'], $post_id ); 
    519533        } 
    520534 
     
    524538 
    525539        if ( ! empty( $schema['properties']['template'] ) && isset( $request['template'] ) ) { 
    526             $this->handle_template( $request['template'], $post->ID ); 
    527         } 
    528  
    529         $terms_update = $this->handle_terms( $post->ID, $request ); 
     540            $this->handle_template( $request['template'], $post_id ); 
     541        } 
     542 
     543        $terms_update = $this->handle_terms( $post_id, $request ); 
    530544 
    531545        if ( is_wp_error( $terms_update ) ) { 
     
    533547        } 
    534548 
    535         $post = get_post( $post_id ); 
    536  
    537549        if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) { 
    538             $meta_update = $this->meta->update_value( $request['meta'], (int) $request['id'] ); 
     550            $meta_update = $this->meta->update_value( $request['meta'], $post_id ); 
    539551 
    540552            if ( is_wp_error( $meta_update ) ) { 
     
    543555        } 
    544556 
     557        $post = get_post( $post_id ); 
    545558        $fields_update = $this->update_additional_fields_for_object( $post, $request ); 
    546559 
     
    548561            return $fields_update; 
    549562        } 
    550  
    551         /** 
    552          * Fires after a single post is created or updated via the REST API. 
    553          * 
    554          * The dynamic portion of the hook name, `$this->post_type`, refers to the post type slug. 
    555          * 
    556          * @since 4.7.0 
    557          * 
    558          * @param object          $post     Inserted Post object (not a WP_Post object). 
    559          * @param WP_REST_Request $request  Request object. 
    560          * @param bool            $creating True when creating post, false when updating. 
    561          */ 
    562         do_action( "rest_insert_{$this->post_type}", $post, $request, true ); 
    563563 
    564564        $request->set_param( 'context', 'edit' ); 
     
    641641        } 
    642642 
     643        $post = get_post( $post_id ); 
     644 
     645        /* This action is documented in lib/endpoints/class-wp-rest-controller.php */ 
     646        do_action( "rest_insert_{$this->post_type}", $post, $request, false ); 
     647 
    643648        $schema = $this->get_item_schema(); 
    644649 
     
    669674        } 
    670675 
    671         $post = get_post( $post_id ); 
    672  
    673676        if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) { 
    674677            $meta_update = $this->meta->update_value( $request['meta'], $post->ID ); 
     
    679682        } 
    680683 
     684        $post = get_post( $post_id ); 
    681685        $fields_update = $this->update_additional_fields_for_object( $post, $request ); 
    682686 
     
    684688            return $fields_update; 
    685689        } 
    686  
    687         /* This action is documented in lib/endpoints/class-wp-rest-controller.php */ 
    688         do_action( "rest_insert_{$this->post_type}", $post, $request, false ); 
    689690 
    690691        $request->set_param( 'context', 'edit' ); 
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php

    r39342 r39348  
    404404         * @since 4.7.0 
    405405         * 
    406          * @param WP_Term         $term     Inserted Term object. 
     406         * @param WP_Term         $term     Inserted or updated term object. 
    407407         * @param WP_REST_Request $request  Request object. 
    408          * @param bool            $creating True when creating term, false when updating. 
     408         * @param bool            $creating True when creating a term, false when updating. 
    409409         */ 
    410410        do_action( "rest_insert_{$this->taxonomy}", $term, $request, true ); 
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php

    r39342 r39348  
    462462        $user = get_user_by( 'id', $user_id ); 
    463463 
    464         if ( ! empty( $request['roles'] ) && ! empty( $schema['properties']['roles'] ) ) { 
    465             array_map( array( $user, 'add_role' ), $request['roles'] ); 
    466         } 
    467  
    468         if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) { 
    469             $meta_update = $this->meta->update_value( $request['meta'], $user_id ); 
    470  
    471             if ( is_wp_error( $meta_update ) ) { 
    472                 return $meta_update; 
    473             } 
    474         } 
    475  
    476         $fields_update = $this->update_additional_fields_for_object( $user, $request ); 
    477  
    478         if ( is_wp_error( $fields_update ) ) { 
    479             return $fields_update; 
    480         } 
    481  
    482464        /** 
    483465         * Fires immediately after a user is created or updated via the REST API. 
     
    485467         * @since 4.7.0 
    486468         * 
    487          * @param WP_User         $user     Data used to create the user. 
     469         * @param WP_User         $user     Inserted or updated user object. 
    488470         * @param WP_REST_Request $request  Request object. 
    489          * @param bool            $creating True when creating user, false when updating user. 
     471         * @param bool            $creating True when creating a user, false when updating. 
    490472         */ 
    491473        do_action( 'rest_insert_user', $user, $request, true ); 
     474 
     475        if ( ! empty( $request['roles'] ) && ! empty( $schema['properties']['roles'] ) ) { 
     476            array_map( array( $user, 'add_role' ), $request['roles'] ); 
     477        } 
     478 
     479        if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) { 
     480            $meta_update = $this->meta->update_value( $request['meta'], $user_id ); 
     481 
     482            if ( is_wp_error( $meta_update ) ) { 
     483                return $meta_update; 
     484            } 
     485        } 
     486 
     487        $user = get_user_by( 'id', $user_id ); 
     488        $fields_update = $this->update_additional_fields_for_object( $user, $request ); 
     489 
     490        if ( is_wp_error( $fields_update ) ) { 
     491            return $fields_update; 
     492        } 
    492493 
    493494        $request->set_param( 'context', 'edit' ); 
     
    574575        } 
    575576 
    576         $user = get_user_by( 'id', $id ); 
     577        $user = get_user_by( 'id', $user_id ); 
     578 
     579        /* This action is documented in lib/endpoints/class-wp-rest-users-controller.php */ 
     580        do_action( 'rest_insert_user', $user, $request, false ); 
    577581 
    578582        if ( is_multisite() && ! is_user_member_of_blog( $id ) ) { 
     
    594598        } 
    595599 
     600        $user = get_user_by( 'id', $user_id ); 
    596601        $fields_update = $this->update_additional_fields_for_object( $user, $request ); 
    597602 
     
    599604            return $fields_update; 
    600605        } 
    601  
    602         /* This action is documented in lib/endpoints/class-wp-rest-users-controller.php */ 
    603         do_action( 'rest_insert_user', $user, $request, false ); 
    604606 
    605607        $request->set_param( 'context', 'edit' ); 
Note: See TracChangeset for help on using the changeset viewer.