WordPress.org

Make WordPress Core

Ticket #47987: 47987.diff

File 47987.diff, 7.9 KB (added by TimothyBlynJacobs, 7 weeks ago)
  • src/wp-admin/includes/file.php

    diff --git a/src/wp-admin/includes/file.php b/src/wp-admin/includes/file.php
    index 11977a8662..d0e8cfccfa 100644
    a b function wp_handle_sideload( &$file, $overrides = false, $time = null ) { 
    989989 *
    990990 * @param string $upload_ref    The upload reference sent by the client.
    991991 * @param int    $attachment_id Attachment post ID.
    992  * @return bool Whether the transient was set.
     992 * @return true|WP_Error Whether the transient was set.
    993993 */
    994994function _wp_set_upload_ref( $upload_ref, $attachment_id ) {
    995995        $upload_ref = preg_replace( '/[^a-zA-Z0-9_]/', '', $upload_ref );
    996996
    997         if ( ! empty( $upload_ref ) ) {
    998                 return set_transient( '_wp_temp_image_ref:' . $upload_ref, $attachment_id, HOUR_IN_SECONDS );
     997        if ( ! $upload_ref ) {
     998                return new WP_Error( 'invalid_upload_ref', __( 'The upload reference may only contain alpha numeric characters.' ) );
    999999        }
    10001000
    1001         return false;
     1001        $set = set_transient( '_wp_temp_image_ref:' . $upload_ref, $attachment_id, HOUR_IN_SECONDS );
     1002
     1003        if ( ! $set ) {
     1004                return new WP_Error( 'db_update_error', __( 'Failed to save upload reference.' ) );
     1005        }
     1006
     1007        return true;
    10021008}
    10031009
    10041010/**
  • src/wp-admin/includes/media.php

    diff --git a/src/wp-admin/includes/media.php b/src/wp-admin/includes/media.php
    index 745a1ec314..33e5a230d0 100644
    a b function media_handle_upload( $file_id, $post_id, $post_data = array(), $overrid 
    420420
    421421                // At this point the image is uploaded successfully even if there were specific errors or some sub-sizes were not created.
    422422                // The transient is not needed any more.
    423                 if ( $_ref ) {
     423                if ( true === $_ref ) {
    424424                        _wp_clear_upload_ref( $_POST['_wp_temp_upload_ref'] );
    425425                }
    426426        }
  • src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php
    index c1be06a2a0..6ae7ecd5ff 100644
    a b class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller { 
    100100                        return new WP_Error( 'rest_invalid_param', __( 'Invalid parent type.' ), array( 'status' => 400 ) );
    101101                }
    102102
     103                $retry_ref = $request->get_header( 'X-WP-RetryUploadRef' );
     104
     105                if ( $retry_ref ) {
     106                        // Include upload ref functions.
     107                        require_once ABSPATH . 'wp-admin/includes/file.php';
     108                        $id = _wp_get_upload_ref_attachment_id( $retry_ref );
     109
     110                        if ( ! $id ) {
     111                                return new WP_Error( 'upload_reference_not_found', __( 'Upload failed. Please try again.' ), array( 'status' => 500 ) );
     112                        }
     113
     114                        $is_retry = true;
     115                } else {
     116                        $id_and_file = $this->insert_attachment( $request );
     117
     118                        if ( is_wp_error( $id_and_file ) ) {
     119                                return $id_and_file;
     120                        }
     121
     122                        list( $id, $file ) = $id_and_file;
     123                        $is_retry          = false;
     124                }
     125
     126                if ( is_wp_error( $id ) ) {
     127                        return $id;
     128                }
     129
     130                $attachment = get_post( $id );
     131
     132                /**
     133                 * Fires after a single attachment is created or updated via the REST API.
     134                 *
     135                 * @since 4.7.0
     136                 *
     137                 * @param WP_Post         $attachment Inserted or updated attachment
     138                 *                                    object.
     139                 * @param WP_REST_Request $request    The request sent to the API.
     140                 * @param bool            $creating   True when creating an attachment, false when updating.
     141                 */
     142                do_action( 'rest_insert_attachment', $attachment, $request, true );
     143
     144                // Include admin function to get access to wp_generate_attachment_metadata().
     145                require_once ABSPATH . 'wp-admin/includes/media.php';
     146
     147                if ( $is_retry ) {
     148                        wp_update_image_subsizes( $id );
     149                        _wp_clear_upload_ref( $retry_ref );
     150                } else {
     151                        wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) );
     152
     153                        if ( $request->get_header( 'X-WP-UploadRef' ) ) {
     154                                // Include upload ref functions.
     155                                require_once ABSPATH . 'wp-admin/includes/file.php';
     156                                _wp_clear_upload_ref( $request->get_header( 'X-WP-UploadRef' ) );
     157                        }
     158                }
     159
     160                if ( isset( $request['alt_text'] ) ) {
     161                        update_post_meta( $id, '_wp_attachment_image_alt', sanitize_text_field( $request['alt_text'] ) );
     162                }
     163
     164                $fields_update = $this->update_additional_fields_for_object( $attachment, $request );
     165
     166                if ( is_wp_error( $fields_update ) ) {
     167                        return $fields_update;
     168                }
     169
     170                $request->set_param( 'context', 'edit' );
     171
     172                /**
     173                 * Fires after a single attachment is completely created or updated via the REST API.
     174                 *
     175                 * @since 5.0.0
     176                 *
     177                 * @param WP_Post         $attachment Inserted or updated attachment object.
     178                 * @param WP_REST_Request $request    Request object.
     179                 * @param bool            $creating   True when creating an attachment, false when updating.
     180                 */
     181                do_action( 'rest_after_insert_attachment', $attachment, $request, true );
     182
     183                $response = $this->prepare_item_for_response( $attachment, $request );
     184                $response = rest_ensure_response( $response );
     185                $response->set_status( 201 );
     186                $response->header( 'Location', rest_url( sprintf( '%s/%s/%d', $this->namespace, $this->rest_base, $id ) ) );
     187
     188                return $response;
     189        }
     190
     191        /**
     192         * Inserts the attachment in the database.
     193         *
     194         * @since 5.3.0
     195         *
     196         * @param WP_REST_Request $request
     197         *
     198         * @return array|WP_Error
     199         */
     200        protected function insert_attachment( $request ) {
    103201                // Get the file via $_FILES or raw data.
    104202                $files   = $request->get_file_params();
    105203                $headers = $request->get_headers();
    class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller { 
    158256                        return $id;
    159257                }
    160258
    161                 $attachment = get_post( $id );
    162 
    163                 /**
    164                  * Fires after a single attachment is created or updated via the REST API.
    165                  *
    166                  * @since 4.7.0
    167                  *
    168                  * @param WP_Post         $attachment Inserted or updated attachment
    169                  *                                    object.
    170                  * @param WP_REST_Request $request    The request sent to the API.
    171                  * @param bool            $creating   True when creating an attachment, false when updating.
    172                  */
    173                 do_action( 'rest_insert_attachment', $attachment, $request, true );
    174 
    175                 // Include admin function to get access to wp_generate_attachment_metadata().
    176                 require_once ABSPATH . 'wp-admin/includes/media.php';
    177 
    178                 wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) );
    179 
    180                 if ( isset( $request['alt_text'] ) ) {
    181                         update_post_meta( $id, '_wp_attachment_image_alt', sanitize_text_field( $request['alt_text'] ) );
    182                 }
     259                if ( $request->get_header( 'X-WP-UploadRef' ) ) {
     260                        if ( ! wp_attachment_is_image( $id ) ) {
     261                                return new WP_Error( 'invalid_upload_ref', __( 'Upload references can only be used for image attachments.' ), array( 'status' => 400 ) );
     262                        }
    183263
    184                 $fields_update = $this->update_additional_fields_for_object( $attachment, $request );
     264                        // Include upload ref functions.
     265                        require_once ABSPATH . 'wp-admin/includes/file.php';
     266                        $set_ref = _wp_set_upload_ref( $request->get_header( 'X-WP-UploadRef' ), $id );
    185267
    186                 if ( is_wp_error( $fields_update ) ) {
    187                         return $fields_update;
     268                        if ( is_wp_error( $set_ref ) ) {
     269                                // TODO: cleanup attachment data.
     270                                return $set_ref;
     271                        }
    188272                }
    189273
    190                 $request->set_param( 'context', 'edit' );
    191 
    192                 /**
    193                  * Fires after a single attachment is completely created or updated via the REST API.
    194                  *
    195                  * @since 5.0.0
    196                  *
    197                  * @param WP_Post         $attachment Inserted or updated attachment object.
    198                  * @param WP_REST_Request $request    Request object.
    199                  * @param bool            $creating   True when creating an attachment, false when updating.
    200                  */
    201                 do_action( 'rest_after_insert_attachment', $attachment, $request, true );
    202 
    203                 $response = $this->prepare_item_for_response( $attachment, $request );
    204                 $response = rest_ensure_response( $response );
    205                 $response->set_status( 201 );
    206                 $response->header( 'Location', rest_url( sprintf( '%s/%s/%d', $this->namespace, $this->rest_base, $id ) ) );
    207 
    208                 return $response;
     274                return array( $id, $file );
    209275        }
    210276
    211277        /**