WordPress.org

Make WordPress Core

Ticket #16434: 16434.14.diff

File 16434.14.diff, 8.2 KB (added by obenland, 21 months ago)
  • src/wp-admin/includes/class-wp-site-icon.php

     
    7878                $hook = add_submenu_page( null, __( 'Site Icon' ), __( 'Site Icon' ), 'manage_options', 'site-icon', array( $this, 'upload_site_icon_page' ) ); 
    7979 
    8080                add_action( "load-$hook", array( $this, 'add_upload_settings' ) ); 
     81                add_action( "load-$hook", array( $this, 'maybe_skip_cropping' ) ); 
    8182                add_action( "admin_print_scripts-$hook", array( $this, 'enqueue_scripts' ) ); 
    8283        } 
    8384 
     
    190191        } 
    191192 
    192193        /** 
    193          * Crop a the image admin view. 
     194         * Check if the image needs cropping. 
     195         * 
     196         * If it doesn't need cropping, proceed to set the icon. 
    194197         * 
    195198         * @since 4.3.0 
    196199         */ 
    197         public function crop_page() { 
     200        public function maybe_skip_cropping() { 
     201                if ( empty( $_REQUEST['action'] ) || 'crop_site_icon' !== $_REQUEST['action'] ) { 
     202                        return; 
     203                } 
     204 
    198205                check_admin_referer( 'crop-site-icon' ); 
    199206 
    200                 if ( isset( $_GET['file'] ) ) { 
    201                         $attachment_id = absint( $_GET['file'] ); 
    202                         $file          = get_attached_file( $attachment_id, true ); 
    203                         $url           = wp_get_attachment_image_src( $attachment_id, 'full' ); 
    204                         $url           = $url[0]; 
    205                 } else { 
    206                         $upload        = $this->handle_upload(); 
    207                         $attachment_id = $upload['attachment_id']; 
    208                         $file          = $upload['file']; 
    209                         $url           = $upload['url']; 
     207                list( $attachment_id, $url, $image_size ) = $this->get_upload_data(); 
     208 
     209                if ( $image_size[0] == $image_size[1] && $image_size[0] == $this->min_size ) { 
     210                        // No cropping required. 
     211 
     212                        $url = add_query_arg( array( 
     213                                'attachment_id'         => $attachment_id, 
     214                                'skip-cropping'         => true, 
     215                                'action'                => 'set_site_icon', 
     216                        ), wp_nonce_url( admin_url( 'options-general.php' ), 'set-site-icon' ) ); 
     217 
     218                        wp_safe_redirect( $url ); 
     219                        die(); 
    210220                } 
     221        } 
    211222 
    212                 $image_size = getimagesize( $file ); 
     223        /** 
     224         * Crop a the image admin view. 
     225         * 
     226         * @since 4.3.0 
     227         */ 
     228        public function crop_page() { 
     229                check_admin_referer( 'crop-site-icon' ); 
     230 
     231                list( $attachment_id, $url, $image_size ) = $this->get_upload_data(); 
    213232 
    214233                if ( $image_size[0] < $this->min_size ) { 
    215234                        add_settings_error( 'site-icon', 'too-small', sprintf( __( 'The selected image is smaller than %upx in width.' ), $this->min_size ) ); 
     
    318337        public function set_site_icon() { 
    319338                check_admin_referer( 'set-site-icon' ); 
    320339 
    321                 // Delete any existing site icon images. 
    322                 $this->delete_site_icon(); 
     340                $attachment_id          = absint( $_REQUEST['attachment_id'] ); 
     341                $create_new_attachement = ! empty( $_REQUEST['create-new-attachment'] ); 
    323342 
    324                 $attachment_id = absint( $_POST['attachment_id'] ); 
     343                /* 
     344                 * If the current attachment as been set as site icon don't delete it. 
     345                 */ 
     346                if ( get_option( 'site_icon' ) == $attachment_id ) { 
     347                        // Get the file path. 
     348                        $image_url = get_attached_file( $attachment_id ); 
     349 
     350                        // Update meta data and possibly regenerate intermediate sizes. 
     351                        add_filter( 'intermediate_image_sizes_advanced', array( $this, 'additional_sizes' ) ); 
     352                        $this->update_attachment_metadata( $attachment_id, $image_url ); 
     353                        remove_filter( 'intermediate_image_sizes_advanced', array( $this, 'additional_sizes' ) ); 
    325354 
    326                 // TODO 
    327                 if ( empty( $_POST['skip-cropping'] ) ) { 
    328                         $crop_ratio = (float) $_POST['crop_ratio']; 
    329                         $crop_data = $this->convert_coordinates_from_resized_to_full( $_POST['crop-x'], $_POST['crop-y'], $_POST['crop-w'], $_POST['crop-h'], $crop_ratio ); 
    330                         $cropped = wp_crop_image( $attachment_id, $crop_data['crop_x'], $crop_data['crop_y'], $crop_data['crop_width'], $crop_data['crop_height'], $this->min_size, $this->min_size ); 
    331                 } elseif ( ! empty( $_POST['create-new-attachment'] ) ) { 
    332                         $cropped = _copy_image_file( $attachment_id ); 
    333355                } else { 
    334                         $cropped = get_attached_file( $attachment_id ); 
    335                 } 
     356                        // Delete any existing site icon images. 
     357                        $this->delete_site_icon(); 
    336358 
    337                 if ( ! $cropped || is_wp_error( $cropped ) ) { 
    338                         wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) ); 
    339                 } 
     359                        if ( empty( $_REQUEST['skip-cropping'] ) ) { 
     360                                $crop_data = $this->convert_coordinates_from_resized_to_full( $_REQUEST['crop-x'], $_REQUEST['crop-y'], $_REQUEST['crop-w'], $_REQUEST['crop-h'], (float) $_REQUEST['crop_ratio'] ); 
     361                                $cropped   = wp_crop_image( $attachment_id, $crop_data['crop_x'], $crop_data['crop_y'], $crop_data['crop_width'], $crop_data['crop_height'], $this->min_size, $this->min_size ); 
    340362 
    341                 $object = $this->create_attachment_object( $cropped, $attachment_id ); 
     363                        } elseif ( $create_new_attachement ) { 
     364                                $cropped = _copy_image_file( $attachment_id ); 
    342365 
    343                 if ( ! empty( $_POST['create-new-attachment'] ) ) { 
    344                         unset( $object['ID'] ); 
    345                 } 
     366                        } else { 
     367                                $cropped = get_attached_file( $attachment_id ); 
     368                        } 
     369 
     370                        if ( ! $cropped || is_wp_error( $cropped ) ) { 
     371                                wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) ); 
     372                        } 
     373 
     374                        $object = $this->create_attachment_object( $cropped, $attachment_id ); 
    346375 
    347                 // Update the attachment 
    348                 add_filter( 'intermediate_image_sizes_advanced', array( $this, 'additional_sizes' ) ); 
    349                 $attachment_id = $this->insert_attachment( $object, $cropped ); 
    350                 remove_filter( 'intermediate_image_sizes_advanced', array( $this, 'additional_sizes' ) ); 
     376                        if ( $create_new_attachement ) { 
     377                                unset( $object['ID'] ); 
     378                        } 
    351379 
    352                 // Save the site_icon data into option 
    353                 update_option( 'site_icon', $attachment_id ); 
     380                        // Update the attachment. 
     381                        add_filter( 'intermediate_image_sizes_advanced', array( $this, 'additional_sizes' ) ); 
     382                        $attachment_id = $this->insert_attachment( $object, $cropped ); 
     383                        remove_filter( 'intermediate_image_sizes_advanced', array( $this, 'additional_sizes' ) ); 
     384 
     385                        // Save the site_icon data into option 
     386                        update_option( 'site_icon', $attachment_id ); 
     387                } 
    354388 
    355389                add_settings_error( 'site-icon', 'icon-updated', __( 'Site Icon updated.' ), 'updated' ); 
    356390        } 
     
    487521        } 
    488522 
    489523        /** 
    490          * Insert an attachment and its metadata. 
     524         * Insert an attachment. 
    491525         * 
    492526         * @since 4.3.0 
    493527         * 
    494          * @param array  $object  Attachment object. 
    495          * @param string $cropped Cropped image URL. 
    496          * @return int Attachment ID. 
     528         * @param array  $object Attachment object. 
     529         * @param string $file   Filepath of the attached image. 
     530         * @return int           Attachment ID 
    497531         */ 
    498         public function insert_attachment( $object, $cropped ) { 
    499                 $attachment_id = wp_insert_attachment( $object, $cropped ); 
    500                 $metadata      = wp_generate_attachment_metadata( $attachment_id, $cropped ); 
     532        public function insert_attachment( $object, $file ) { 
     533                $attachment_id = wp_insert_attachment( $object, $file ); 
     534                $this->update_attachment_metadata( $attachment_id, $file ); 
     535 
     536                return $attachment_id; 
     537        } 
     538 
     539        /** 
     540         * Update the metadata of an attachment 
     541         * 
     542         * @since 4.3.0 
     543         * 
     544         * @param int    $attachment_id Attachment ID 
     545         * @param string $file          Filepath of the Attached image. 
     546         */ 
     547        public function update_attachment_metadata( $attachment_id, $file ) { 
     548                $metadata = wp_generate_attachment_metadata( $attachment_id, $file ); 
    501549 
    502550                /** 
    503551                 * Filter the site icon attachment metadata. 
     
    510558                 */ 
    511559                $metadata = apply_filters( 'site_icon_attachment_metadata', $metadata ); 
    512560                wp_update_attachment_metadata( $attachment_id, $metadata ); 
    513  
    514                 return $attachment_id; 
    515561        } 
    516562 
    517563        /** 
     
    629675 
    630676                return $value; 
    631677        } 
     678 
     679        /** 
     680         * Get the data required to work with the uploaded image 
     681         * 
     682         * @since 4.3.0 
     683         * 
     684         * @return array containing the collected data 
     685         */ 
     686        private function get_upload_data() { 
     687                if ( isset( $_GET['file'] ) ) { 
     688                        $attachment_id = absint( $_GET['file'] ); 
     689                        $file          = get_attached_file( $attachment_id, true ); 
     690                        $url           = wp_get_attachment_image_src( $attachment_id, 'full' ); 
     691                        $url           = $url[0]; 
     692                } else { 
     693                        $upload        = $this->handle_upload(); 
     694                        $attachment_id = $upload['attachment_id']; 
     695                        $file          = $upload['file']; 
     696                        $url           = $upload['url']; 
     697                } 
     698 
     699                $image_size = getimagesize( $file ); 
     700 
     701                return array( $attachment_id, $url, $image_size ); 
     702        } 
    632703} 
    633704 
    634705/**