Make WordPress Core

Changeset 59379


Ignore:
Timestamp:
11/10/2024 09:40:00 PM (3 weeks ago)
Author:
peterwilsoncc
Message:

Media: Remove dimension suffix from full size converted HEIC images.

Removes the dimension suffix, eg -1000x1000 from the file name of full size images automatically converted from HEIC to JPEGs by WordPress. Introduces unit tests for the default conversion of images and customized conversion settings via the image_editor_output_format filter.

Follow up to [58849], [58942], [59317], [59346], [59366]

Props mukesh27, peterwilsoncc, azaozz, apermo, flixos90, ironprogrammer.
Fixes #62359.
See #53645, #62305.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/image.php

    r59366 r59379  
    342342                if ( $scale_down ) {
    343343                    $saved = $editor->save( $editor->generate_filename( 'scaled' ) );
     344                } elseif ( $convert ) {
     345                    /*
     346                     * Generate a new file name for the converted image.
     347                     *
     348                     * As the image file name will be unique due to the changed file extension,
     349                     * it does not need a suffix to be unique. However, the generate_filename method
     350                     * does not allow for an empty suffix, so the "-converted" suffix is required to
     351                     * be added and subsequently removed.
     352                     */
     353                    $converted_file_name = $editor->generate_filename( 'converted' );
     354                    $converted_file_name = preg_replace( '/(-converted\.)([a-z0-9]+)$/i', '.$2', $converted_file_name );
     355                    $saved               = $editor->save( $converted_file_name );
    344356                } else {
    345357                    $saved = $editor->save();
  • trunk/tests/phpunit/tests/functions.php

    r58849 r59379  
    15651565
    15661566        $expected = array(
    1567             50,
    1568             50,
     1567            1180,
     1568            1180,
    15691569            IMAGETYPE_HEIC,
    1570             'width="50" height="50"',
     1570            'width="1180" height="1180"',
    15711571            'mime' => 'image/heic',
    15721572        );
  • trunk/tests/phpunit/tests/media.php

    r59247 r59379  
    64476447
    64486448    /**
     6449     * Ensure an HEIC image is converted to a JPEG.
     6450     *
     6451     * @ticket 62305
     6452     * @ticket 62359
     6453     *
     6454     * @dataProvider data_image_converted_to_other_format_has_correct_filename
     6455     *
     6456     * @param bool $apply_big_image_size_threshold True if filter needs to apply, otherwise false.
     6457     */
     6458    public function test_heic_image_upload_is_converted_to_jpeg( bool $apply_big_image_size_threshold ) {
     6459        $temp_dir      = get_temp_dir();
     6460        $file          = $temp_dir . '/test-image.heic';
     6461        $scaled_suffix = $apply_big_image_size_threshold ? '-scaled' : '';
     6462        copy( DIR_TESTDATA . '/images/test-image.heic', $file );
     6463
     6464        $editor = wp_get_image_editor( $file );
     6465
     6466        // Skip if the editor does not support HEIC.
     6467        if ( is_wp_error( $editor ) || ! $editor->supports_mime_type( 'image/heic' ) ) {
     6468            $this->markTestSkipped( 'HEIC is not supported by the selected image editor.' );
     6469        }
     6470
     6471        $attachment_id = self::factory()->attachment->create_object(
     6472            array(
     6473                'post_mime_type' => 'image/heic',
     6474                'file'           => $file,
     6475            )
     6476        );
     6477
     6478        if ( $apply_big_image_size_threshold ) {
     6479            add_filter( 'big_image_size_threshold', array( $this, 'add_big_image_size_threshold' ) );
     6480        }
     6481
     6482        $image_meta = wp_generate_attachment_metadata( $attachment_id, $file );
     6483
     6484        $this->assertStringEndsNotWith( '.heic', $image_meta['file'], 'The file extension is expected to change.' );
     6485        $this->assertSame( "test-image{$scaled_suffix}.jpg", basename( $image_meta['file'] ), "The file name is expected to be test-image{$scaled_suffix}.jpg" );
     6486        $this->assertSame( 'test-image.heic', $image_meta['original_image'], 'The original image name is expected to be stored in the meta data.' );
     6487        $this->assertSame( 'image/jpeg', wp_get_image_mime( $image_meta['file'] ), 'The image mime type is expected to be image/jpeg.' );
     6488    }
     6489
     6490    /**
     6491     * Ensure a JPEG is converted to WebP when applied via a filter.
     6492     *
     6493     * @ticket 62305
     6494     * @ticket 62359
     6495     *
     6496     * @dataProvider data_image_converted_to_other_format_has_correct_filename
     6497     *
     6498     * @param bool $apply_big_image_size_threshold True if filter needs to apply, otherwise false.
     6499     */
     6500    public function test_jpeg_image_converts_to_webp_when_filtered( bool $apply_big_image_size_threshold ) {
     6501        $temp_dir      = get_temp_dir();
     6502        $file          = $temp_dir . '/33772.jpg';
     6503        $scaled_suffix = $apply_big_image_size_threshold ? '-scaled' : '';
     6504        copy( DIR_TESTDATA . '/images/33772.jpg', $file );
     6505
     6506        $editor = wp_get_image_editor( $file );
     6507
     6508        // Skip if the editor does not support WebP.
     6509        if ( is_wp_error( $editor ) || ! $editor->supports_mime_type( 'image/webp' ) ) {
     6510            $this->markTestSkipped( 'WebP is not supported by the selected image editor.' );
     6511        }
     6512
     6513        $attachment_id = self::factory()->attachment->create_object(
     6514            array(
     6515                'post_mime_type' => 'image/jpeg',
     6516                'file'           => $file,
     6517            )
     6518        );
     6519
     6520        if ( $apply_big_image_size_threshold ) {
     6521            add_filter( 'big_image_size_threshold', array( $this, 'add_big_image_size_threshold' ) );
     6522        }
     6523
     6524        // Generate all sizes as WebP.
     6525        add_filter( 'image_editor_output_format', array( $this, 'image_editor_output_webp' ) );
     6526
     6527        $image_meta = wp_generate_attachment_metadata( $attachment_id, $file );
     6528
     6529        $this->assertStringEndsNotWith( '.jpg', $image_meta['file'], 'The file extension is expected to change.' );
     6530        $this->assertSame( "33772{$scaled_suffix}.webp", basename( $image_meta['file'] ), "The file name is expected to be 33772{$scaled_suffix}.webp." );
     6531        $this->assertSame( '33772.jpg', $image_meta['original_image'], 'The original image name is expected to be stored in the meta data.' );
     6532        $this->assertSame( 'image/webp', wp_get_image_mime( $image_meta['file'] ), 'The image mime type is expected to be image/webp.' );
     6533    }
     6534
     6535    /**
     6536     * Data provider for test_image_converted_to_other_format_has_correct_filename().
     6537     *
     6538     * @return array[]
     6539     */
     6540    public function data_image_converted_to_other_format_has_correct_filename() {
     6541        return array(
     6542            'do not scale image' => array( false ),
     6543            'scale image'        => array( true ),
     6544        );
     6545    }
     6546
     6547    /**
    64496548     * Helper method to keep track of the last context returned by the 'wp_get_attachment_image_context' filter.
    64506549     *
Note: See TracChangeset for help on using the changeset viewer.