WordPress.org

Make WordPress Core

Ticket #16434: 16434.12.diff

File 16434.12.diff, 8.3 KB (added by jipmoors, 3 years ago)

selecting an image with minimal accepted dimensions skips crop dialog and sets image instantly

  • src/wp-admin/includes/class-wp-site-icon.php

     
    6262
    6363                add_action( 'admin_menu', array( $this, 'admin_menu_upload_site_icon' ) );
    6464
    65                 add_action( 'admin_action_set_site_icon',    array( $this, 'set_site_icon'    ) );
    66                 add_action( 'admin_action_remove_site_icon', array( $this, 'remove_site_icon' ) );
     65                // Because of the media upload the 'admin_action_crop_site_icon' is not called
     66                add_action( 'load-settings_page_site-icon',  array( $this, 'maybe_skip_cropping' ) );
    6767
     68                add_action( 'admin_action_set_site_icon',    array( $this, 'set_site_icon'        ) );
     69                add_action( 'admin_action_remove_site_icon', array( $this, 'remove_site_icon'     ) );
     70
    6871                add_action( 'delete_attachment', array( $this, 'delete_attachment_data' ), 10, 1 );
    6972                add_filter( 'get_post_metadata', array( $this, 'get_post_metadata' ), 10, 4 );
    7073        }
     
    192195        }
    193196
    194197        /**
    195          * Crop a the image admin view.
     198         * Check if the image needs cropping
     199         * If it doesn't need cropping, proceed to set the icon
    196200         *
    197201         * @since 4.3.0
    198202         */
    199         public function crop_page() {
     203        public function maybe_skip_cropping() {
     204                if ( ! isset( $_REQUEST['action'] ) || $_REQUEST['action'] != 'crop_site_icon' ) {
     205                        return;
     206                }
     207
    200208                check_admin_referer( 'crop-site-icon' );
    201209
     210                $upload_data = $this->get_upload_data();
     211                $image_size = $upload_data['image_size'];
     212
     213                if ( $image_size[0] == $image_size[1] && $image_size[0] == $this->min_size ) {
     214                        // no cropping is required
     215
     216                        $url = add_query_arg(
     217                                array(
     218                                        'attachment_id' => $upload_data['attachment_id'],
     219                                        'skip-cropping' => true,
     220                                        'create-new-attachment' => true,
     221                                        'action' => 'set_site_icon'
     222                                ),
     223                                wp_nonce_url( admin_url( 'options-general.php' ), 'set-site-icon' )
     224                        );
     225
     226                        wp_redirect( $url );
     227                        die();
     228                }
     229        }
     230
     231        /**
     232         * Get the data required to work with the uploaded image
     233         *
     234         * @since 4.3.0
     235         *
     236         * @return array containing the collected data
     237         */
     238        public function get_upload_data() {
    202239                if ( isset( $_GET['file'] ) ) {
    203240                        $attachment_id = absint( $_GET['file'] );
    204241                        $file          = get_attached_file( $attachment_id, true );
     
    213250
    214251                $image_size = getimagesize( $file );
    215252
     253                return compact('attachment_id', 'url', 'image_size');
     254        }
     255
     256        /**
     257         * Crop a the image admin view.
     258         *
     259         * @since 4.3.0
     260         */
     261        public function crop_page() {
     262                check_admin_referer( 'crop-site-icon' );
     263
     264                $upload_data = $this->get_upload_data();
     265
     266                $image_size = $upload_data['image_size'];
     267                $attachment_id = $upload_data['attachment_id'];
     268                $url = $upload_data['url'];
     269
    216270                if ( $image_size[0] < $this->min_size ) {
    217271                        add_settings_error( 'site-icon', 'too-small', sprintf( __( 'The selected image is smaller than %upx in width.' ), $this->min_size ) );
    218272
     
    320374        public function set_site_icon() {
    321375                check_admin_referer( 'set-site-icon' );
    322376
    323                 // Delete any existing site icon images.
    324                 $this->delete_site_icon();
     377                $attachment_id = absint( $_REQUEST['attachment_id'] );
     378                $current_site_icon_id = get_option( 'site_icon' );
    325379
    326                 $attachment_id = absint( $_POST['attachment_id'] );
     380                $create_new_attachement = isset( $_REQUEST['create-new-attachment'] ) && $_REQUEST['create-new-attachment'];
     381                $skip_cropping = ! isset( $_REQUEST['skip-cropping'] ) && ! $_REQUEST['skip-cropping'];
    327382
    328                 // TODO
    329                 if ( empty( $_POST['skip-cropping'] ) ) {
    330                         $crop_ratio = (float) $_POST['crop_ratio'];
    331                         $crop_data = $this->convert_coordinates_from_resized_to_full( $_POST['crop-x'], $_POST['crop-y'], $_POST['crop-w'], $_POST['crop-h'], $crop_ratio );
    332                         $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 );
    333                 } elseif ( ! empty( $_POST['create-new-attachment'] ) ) {
    334                         $cropped = _copy_image_file( $attachment_id );
    335                 } else {
    336                         $cropped = get_attached_file( $attachment_id );
    337                 }
     383                /*
     384                 * If the current attachment as been set as site icon don't delete it.
     385                 */
     386                if ( $current_site_icon_id != $attachment_id ) {
     387                        // Delete any existing site icon images.
     388                        $this->delete_site_icon();
    338389
    339                 if ( ! $cropped || is_wp_error( $cropped ) ) {
    340                         wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) );
    341                 }
     390                        if ( false === $skip_cropping ) {
     391                                $crop_ratio = (float) $_REQUEST['crop_ratio'];
     392                                $crop_data  = $this->convert_coordinates_from_resized_to_full(
     393                                        $_POST['crop-x'],
     394                                        $_POST['crop-y'],
     395                                        $_POST['crop-w'],
     396                                        $_POST['crop-h'],
     397                                        $crop_ratio
     398                                );
     399                                $cropped = wp_crop_image(
     400                                        $attachment_id,
     401                                        $crop_data['crop_x'],
     402                                        $crop_data['crop_y'],
     403                                        $crop_data['crop_width'],
     404                                        $crop_data['crop_height'],
     405                                        $this->min_size,
     406                                        $this->min_size
     407                                );
     408                        } elseif ( $create_new_attachement ) {
     409                                $cropped = _copy_image_file( $attachment_id );
     410                        } else {
     411                                $cropped = get_attached_file( $attachment_id );
     412                        }
    342413
    343                 $object = $this->create_attachment_object( $cropped, $attachment_id );
     414                        if ( ! $cropped || is_wp_error( $cropped ) ) {
     415                                wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) );
     416                        }
    344417
    345                 if ( ! empty( $_POST['create-new-attachment'] ) ) {
    346                         unset( $object['ID'] );
    347                 }
     418                        $object = $this->create_attachment_object( $cropped, $attachment_id );
    348419
    349                 // Update the attachment
    350                 add_filter( 'intermediate_image_sizes_advanced', array( $this, 'additional_sizes' ) );
    351                 $attachment_id = $this->insert_attachment( $object, $cropped );
    352                 remove_filter( 'intermediate_image_sizes_advanced', array( $this, 'additional_sizes' ) );
     420                        if ( $create_new_attachement ) {
     421                                unset( $object['ID'] );
     422                        }
    353423
    354                 // Save the site_icon data into option
    355                 update_option( 'site_icon', $attachment_id );
     424                        // Update the attachment
     425                        add_filter( 'intermediate_image_sizes_advanced', array( $this, 'additional_sizes' ) );
     426                        $attachment_id = $this->insert_attachment( $object, $cropped );
     427                        remove_filter( 'intermediate_image_sizes_advanced', array( $this, 'additional_sizes' ) );
    356428
     429                        // Save the site_icon data into option
     430                        update_option( 'site_icon', $attachment_id );
     431
     432                } else {
     433
     434                        // Get the file path
     435                        $image_url = get_attached_file( $attachment_id );
     436
     437                        // Update meta-data and possibly regenerate intermediate sizes
     438                        add_filter( 'intermediate_image_sizes_advanced', array( $this, 'additional_sizes' ) );
     439                        $this->update_attachment_metadata( $attachment_id, $image_url );
     440                        remove_filter( 'intermediate_image_sizes_advanced', array( $this, 'additional_sizes' ) );
     441                }
     442
    357443                add_settings_error( 'site-icon', 'icon-updated', __( 'Site Icon updated.' ), 'updated' );
    358444        }
    359445
     
    489575        }
    490576
    491577        /**
    492          * Insert an attachment and its metadata.
     578         * Insert an attachment
    493579         *
    494580         * @since 4.3.0
    495581         *
    496582         * @param array  $object  Attachment object.
    497          * @param string $cropped Cropped image URL.
     583         * @param string $image_url Cropped image URL.
    498584         * @return int Attachment ID.
    499585         */
    500         public function insert_attachment( $object, $cropped ) {
    501                 $attachment_id = wp_insert_attachment( $object, $cropped );
    502                 $metadata      = wp_generate_attachment_metadata( $attachment_id, $cropped );
     586        public function insert_attachment( $object, $image_url ) {
     587                $attachment_id = wp_insert_attachment( $object, $image_url );
    503588
     589                $updated = $this->update_attachment_metadata( $attachment_id, $image_url );
     590                if ( false !== $updated ) {
     591                        return $attachment_id;
     592                }
     593
     594                return false;
     595        }
     596
     597        /**
     598         * Update the metadata of an attachment
     599         *
     600         * @since 4.3.0
     601         *
     602         * @param int $attachment_id Attachment ID
     603         * @param string $image_url Cropped image URL.
     604         *
     605         * @return bool|int
     606         */
     607        public function update_attachment_metadata( $attachment_id, $image_url ) {
     608                $metadata = wp_generate_attachment_metadata( $attachment_id, $image_url );
     609
    504610                /**
    505611                 * Filter the site icon attachment metadata.
    506612                 *
     
    511617                 * @param array $metadata Attachment metadata.
    512618                 */
    513619                $metadata = apply_filters( 'site_icon_attachment_metadata', $metadata );
    514                 wp_update_attachment_metadata( $attachment_id, $metadata );
     620                $updated = wp_update_attachment_metadata( $attachment_id, $metadata );
    515621
    516                 return $attachment_id;
     622                return $updated;
    517623        }
    518624
    519625        /**