WordPress.org

Make WordPress Core

Ticket #16434: 16434.13.diff

File 16434.13.diff, 10.0 KB (added by jipmoors, 3 years ago)

saving settings page doesn't delete site_icon anymore

  • 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' ) );
     67                add_action( 'admin_action_set_site_icon',    array( $this, 'set_site_icon'       ) );
     68                add_action( 'admin_action_remove_site_icon', array( $this, 'remove_site_icon'    ) );
     69                add_action( 'admin_action_site_icon_set',    array( $this, 'site_icon_set'       ) );
    6770
    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 );
     
    181184                </p>
    182185                <form class="hide-if-js" action="<?php echo esc_url( admin_url( 'options-general.php?page=site-icon' ) ); ?>" method="post" enctype="multipart/form-data">
    183186                        <input name="action" value="crop_site_icon" type="hidden" />
    184                         <input name="site-icon" type="file" />
     187                        <input name="new-site-icon" type="file" />
    185188                        <input name="submit" value="<?php esc_attr_e( 'Upload Image' ); ?>" type="submit" class="button button-primary" />
    186189                        <p class="description">
    187190                                <?php printf( __( 'The image is recommended to be a square image of at least %spx in both width and height.' ), "<strong>$this->min_size</strong>" ); ?>
     
    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 );
     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();
     389
     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                        }
     413
     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                        }
     417
     418                        $object = $this->create_attachment_object( $cropped, $attachment_id );
     419
     420                        if ( $create_new_attachement ) {
     421                                unset( $object['ID'] );
     422                        }
     423
     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' ) );
     428
     429                        // Save the site_icon data into option
     430                        update_option( 'site_icon', $attachment_id );
     431
    335432                } else {
    336                         $cropped = get_attached_file( $attachment_id );
    337                 }
    338433
    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                 }
     434                        // Get the file path
     435                        $image_url = get_attached_file( $attachment_id );
    342436
    343                 $object = $this->create_attachment_object( $cropped, $attachment_id );
    344 
    345                 if ( ! empty( $_POST['create-new-attachment'] ) ) {
    346                         unset( $object['ID'] );
     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' ) );
    347441                }
    348442
    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' ) );
     443                // redirect to settings page
     444                wp_redirect(
     445                        add_query_arg(
     446                                array('action' => 'site_icon_set'),
     447                                admin_url( 'options-general.php' )
     448                        )
     449                );
     450                die();
    353451
    354                 // Save the site_icon data into option
    355                 update_option( 'site_icon', $attachment_id );
     452        }
    356453
     454        public function site_icon_set() {
    357455                add_settings_error( 'site-icon', 'icon-updated', __( 'Site Icon updated.' ), 'updated' );
    358456        }
    359457
     
    489587        }
    490588
    491589        /**
    492          * Insert an attachment and its metadata.
     590         * Insert an attachment
    493591         *
    494592         * @since 4.3.0
    495593         *
    496594         * @param array  $object  Attachment object.
    497          * @param string $cropped Cropped image URL.
     595         * @param string $image_url Cropped image URL.
    498596         * @return int Attachment ID.
    499597         */
    500         public function insert_attachment( $object, $cropped ) {
    501                 $attachment_id = wp_insert_attachment( $object, $cropped );
    502                 $metadata      = wp_generate_attachment_metadata( $attachment_id, $cropped );
     598        public function insert_attachment( $object, $image_url ) {
     599                $attachment_id = wp_insert_attachment( $object, $image_url );
    503600
     601                $updated = $this->update_attachment_metadata( $attachment_id, $image_url );
     602                if ( false !== $updated ) {
     603                        return $attachment_id;
     604                }
     605
     606                return false;
     607        }
     608
     609        /**
     610         * Update the metadata of an attachment
     611         *
     612         * @since 4.3.0
     613         *
     614         * @param int $attachment_id Attachment ID
     615         * @param string $image_url Cropped image URL.
     616         *
     617         * @return bool|int
     618         */
     619        public function update_attachment_metadata( $attachment_id, $image_url ) {
     620                $metadata = wp_generate_attachment_metadata( $attachment_id, $image_url );
     621
    504622                /**
    505623                 * Filter the site icon attachment metadata.
    506624                 *
     
    511629                 * @param array $metadata Attachment metadata.
    512630                 */
    513631                $metadata = apply_filters( 'site_icon_attachment_metadata', $metadata );
    514                 wp_update_attachment_metadata( $attachment_id, $metadata );
     632                $updated = wp_update_attachment_metadata( $attachment_id, $metadata );
    515633
    516                 return $attachment_id;
     634                return $updated;
    517635        }
    518636
    519637        /**
  • src/wp-admin/options-general.php

     
    142142                        'action' => 'remove_site_icon',
    143143                ), wp_nonce_url( admin_url( 'options-general.php' ), 'remove-site-icon' ) );
    144144        ?>
    145 
     145        <input type="hidden" name="site_icon" value="<?php echo esc_attr(get_option('site_icon')) ?>" />
    146146        <img class="avatar avatar-150" src="<?php site_icon_url( null, 150 ); ?>" height="150" width="150" />
    147147        <p class="hide-if-no-js">
    148148                <label class="screen-reader-text" for="choose-from-library-link"><?php _e( 'Choose an image from your media library:' ); ?></label>