WordPress.org

Make WordPress Core

Opened 22 months ago

Last modified 2 months ago

#40370 new enhancement

add_image_sizes does not create the "crop position" versions of the image

Reported by: piejesus Owned by:
Milestone: Future Release Priority: normal
Severity: normal Version: 2.9
Component: Media Keywords: needs-unit-tests good-first-bug has-patch
Focuses: Cc:

Description (last modified by joemcgill)

I wanted to introduce 3 different version of post thumbnails - each with different cropping position (top, center, left) , so i added them like this:

add_image_size( 'newscentered', 400, 400, array( 'center', 'center') );
add_image_size( 'newstop', 400, 400, array( 'center', 'top' ) );
add_image_size( 'newsbottom', 400, 400, array( 'center', 'bottom' ) );

Now, whenever i use the the_post_thumbnail() with the name of my custom image size i always get the same image, cropped to the default WordPress crop position of ('center', 'center') .

Why is that happening? I did 'refresh' the thumbnails and tried also uploading fresh image files and still i can't get 3 differently cropped versions of the image.

I noticed that when i set the cropping defaults using the following function and set the cropping there, then it works:

set_post_thumbnail_size( 400, 400, array('center', 'bottom'));

... but it affects the cropping of all of my thumbnails, so i can only get one "crop position" for all my images.

Guys, is this some kind of bug or do i configure something in a wrong way?

I'm using the newest official WordPress version

Attachments (1)

40370.diff (4.7 KB) - added by themattroyal 2 months ago.

Download all attachments as: .zip

Change History (9)

#1 follow-up: @sebastian.pisula
22 months ago

  • Keywords dev-feedback added

I think that this is bug in this because each file will be name for example "filename-400x400.jpg" but should be "filename-400x400-center-center.jpg", "filename-400x400-center-top.jpg", "filename-400x400-center-bottom.jpg"

Last registered size will be overwrite file

#2 in reply to: ↑ 1 @piejesus
22 months ago

Ay, yes, this is exactly what's happening, just checked it by changing the sizes by 1 pixel. Thanks you!

Replying to sebastian.pisula:

I think that this is bug in this because each file will be name for example "filename-400x400.jpg" but should be "filename-400x400-center-center.jpg", "filename-400x400-center-top.jpg", "filename-400x400-center-bottom.jpg"

Last registered size will be overwrite file

#3 @swissspidy
22 months ago

  • Focuses administration removed
  • Type changed from defect (bug) to enhancement
  • Version changed from 4.7.3 to 2.9

Introduced in [12342] and extended in #27472.

As @sebastian.pisula mentioned, WordPress stores the files with the dimensions only, nothing in addition to that. I wouldn't consider this a bug though, but expected behaviour.

#4 @alexvorn2
22 months ago

I can advice a plugin, maybe it will help - https://wordpress.org/plugins/resize-post-thumbnails/

#5 in reply to: ↑ description @enochfung
14 months ago

Replying to piejesus:

I wanted to introduce 3 different version of post thumbnails - each with different cropping position (top, center, left) , so i added them like this:

add_image_size( 'newscentered', 400, 400, array( 'center', 'center') );
add_image_size( 'newstop', 400, 400, array( 'center', 'top' ) );
add_image_size( 'newsbottom', 400, 400, array( 'center', 'bottom' ) );

Now, whenever i use the the_post_thumbnail() with the name of my custom image size i always get the same image, cropped to the default Wordpress crop position of ('center', 'center') .

Why is that happening? I did 'refresh' the thumbnails and tried also uploading fresh image files and still i can't get 3 differently cropped versions of the image.

I noticed that when i set the cropping defaults using the following function and set the cropping there, then it works:

set_post_thumbnail_size( 400, 400, array('center', 'bottom'));

... but it affects the cropping of all of my thumbnails, so i can only get one "crop position" for all my images.

Guys, is this some kind of bug or do i configure something in a wrong way?

I'm using the newest official Wordpress version

Hello, I'm using version 4.9 now (2017) and the same thing is still happening. Was wondering if it had been "enhanced" in previous versions?

#6 @peterwilsoncc
3 months ago

  • Description modified (diff)

I've hit this recently too, the problem occurs during the upload process.

Using the crop names in the original report, the three images result in the same file name. During resize newscentered is saved, it's then replaced by the newstop crop which is in turn replaced by the newsbottom crop.

While site owners don't get the crops they expect, a side-effect is the srcset for an image may contain different crop orientations.

I suggest files be saved with an eight character hash of the crop information returned by image_resize_dimensions() to ensure neither of these problems occur. The file name could be uploaded-name-c{$hash}.ext.

image_resize_dimensions()'s return array is:

<?php

$dims = [
  0 => 0 
  1 => 0 
  2 => // Crop start X axis
  3 => // Crop start Y axis
  4 => // New width
  5 => // New height
  6 => // Crop width on source image
  7 => // Crop height on source image
];

The crop hash could be generated from $source_w,$source_h,$dims[2],$dims[3],$dims[6],$dims[7]. This will ensure images from the same source with the same aspect ratio and crop will end up with the same hash.

If the final two values are the same as the source image then no hash is required.

When generating the srcset in wp_calculate_image_srcset() the crop hash can be checked in the same way as that the edit suffix is checked.

In terms of backward compatibility I don't think there are implications as previously uploaded images will not have a crop hash.

cc @joemcgill as we've discussed this previously.

Last edited 3 months ago by peterwilsoncc (previous) (diff)

#7 @joemcgill
3 months ago

  • Description modified (diff)
  • Keywords needs-patch needs-unit-tests good-first-bug added; dev-feedback removed
  • Milestone changed from Awaiting Review to Future Release

This is indeed an oversight in the way file naming occurs. I'd be +1 for a patch that adds a hash to the end of the filename whenever a crop position is included in the image size. So something like: filename-{width}x{height}-{hash}.ext.

@themattroyal
2 months ago

#8 @themattroyal
2 months ago

  • Keywords has-patch added; needs-patch removed

@joemcgill @peterwilsoncc - I have implemented this based on my understanding of the requirements set out in your comments.

https://core.trac.wordpress.org/attachment/ticket/40370/40370.diff

Note: See TracTickets for help on using tickets.