@@ -225,6 +225,7 @@ protected function _resize( $max_w, $max_h, $crop = false ) {
225225 * each new image is created.
226226 *
227227 * @since 3.5.0
228+ * @since 6.1.0 Added the `$unique` parameter.
228229 *
229230 * @param array $sizes {
230231 * An array of image size data arrays.
@@ -241,13 +242,14 @@ protected function _resize( $max_w, $max_h, $crop = false ) {
241242 * @type bool $crop Optional. Whether to crop the image. Default false.
242243 * }
243244 * }
245+ * @param bool $unique Whether to generate unique file names for the sub-sizes.
244246 * @return array An array of resized images' metadata by size.
245247 */
246- public function multi_resize ( $ sizes ) {
248+ public function multi_resize ( $ sizes, $ unique = false ) {
247249 $ metadata = array ();
248250
249251 foreach ( $ sizes as $ size => $ size_data ) {
250- $ meta = $ this ->make_subsize ( $ size_data );
252+ $ meta = $ this ->make_subsize ( $ size_data, $ unique );
251253
252254 if ( ! is_wp_error ( $ meta ) ) {
253255 $ metadata [ $ size ] = $ meta ;
@@ -261,6 +263,7 @@ public function multi_resize( $sizes ) {
261263 * Create an image sub-size and return the image meta data value for it.
262264 *
263265 * @since 5.3.0
266+ * @since 6.1.0 Added the `$unique` parameter.
264267 *
265268 * @param array $size_data {
266269 * Array of size data.
@@ -269,10 +272,11 @@ public function multi_resize( $sizes ) {
269272 * @type int $height The maximum height in pixels.
270273 * @type bool $crop Whether to crop the image to exact dimensions.
271274 * }
275+ * @param bool $unique Whether to generate unique file names. Default false.
272276 * @return array|WP_Error The image data array for inclusion in the `sizes` array in the image meta,
273277 * WP_Error object on error.
274278 */
275- public function make_subsize ( $ size_data ) {
279+ public function make_subsize ( $ size_data, $ unique = false ) {
276280 if ( ! isset ( $ size_data ['width ' ] ) && ! isset ( $ size_data ['height ' ] ) ) {
277281 return new WP_Error ( 'image_subsize_create_error ' , __ ( 'Cannot resize the image. Both width and height are not set. ' ) );
278282 }
@@ -296,7 +300,7 @@ public function make_subsize( $size_data ) {
296300 if ( is_wp_error ( $ resized ) ) {
297301 $ saved = $ resized ;
298302 } else {
299- $ saved = $ this ->_save ( $ resized );
303+ $ saved = $ this ->_save ( $ resized, null , null , $ unique );
300304 imagedestroy ( $ resized );
301305 }
302306
@@ -426,9 +430,11 @@ public function flip( $horz, $vert ) {
426430 * @since 5.9.0 Renamed `$filename` to `$destfilename` to match parent class
427431 * for PHP 8 named parameter support.
428432 * @since 6.0.0 The `$filesize` value was added to the returned array.
433+ * @since 6.1.0 The `$unique` parameter was added.
429434 *
430435 * @param string|null $destfilename Optional. Destination filename. Default null.
431436 * @param string|null $mime_type Optional. The mime-type. Default null.
437+ * @param bool $unique Whether the filename should be unique. Default false.
432438 * @return array|WP_Error {
433439 * Array on success or WP_Error if the file failed to save.
434440 *
@@ -440,8 +446,8 @@ public function flip( $horz, $vert ) {
440446 * @type int $filesize File size of the image.
441447 * }
442448 */
443- public function save ( $ destfilename = null , $ mime_type = null ) {
444- $ saved = $ this ->_save ( $ this ->image , $ destfilename , $ mime_type );
449+ public function save ( $ destfilename = null , $ mime_type = null , $ unique = false ) {
450+ $ saved = $ this ->_save ( $ this ->image , $ destfilename , $ mime_type, $ unique );
445451
446452 if ( ! is_wp_error ( $ saved ) ) {
447453 $ this ->file = $ saved ['path ' ];
@@ -454,10 +460,12 @@ public function save( $destfilename = null, $mime_type = null ) {
454460 /**
455461 * @since 3.5.0
456462 * @since 6.0.0 The `$filesize` value was added to the returned array.
463+ * @since 6.1.0 The `$unique` parameter was added.
457464 *
458465 * @param resource|GdImage $image
459466 * @param string|null $filename
460467 * @param string|null $mime_type
468+ * @param bool $unique Whether the filename should be unique. Default false.
461469 * @return array|WP_Error {
462470 * Array on success or WP_Error if the file failed to save.
463471 *
@@ -469,11 +477,15 @@ public function save( $destfilename = null, $mime_type = null ) {
469477 * @type int $filesize File size of the image.
470478 * }
471479 */
472- protected function _save ( $ image , $ filename = null , $ mime_type = null ) {
480+ protected function _save ( $ image , $ filename = null , $ mime_type = null , $ unique = false ) {
473481 list ( $ filename , $ extension , $ mime_type ) = $ this ->get_output_format ( $ filename , $ mime_type );
474482
475483 if ( ! $ filename ) {
476484 $ filename = $ this ->generate_filename ( null , null , $ extension );
485+ // Only generate a unique name when needed. Without this check, a '-#' suffix is added to all sub sizes.
486+ if ( $ unique && file_exists ( $ filename ) ) {
487+ $ filename = $ this ->generate_filename ( null , null , $ extension , true );
488+ }
477489 }
478490
479491 if ( 'image/gif ' === $ mime_type ) {
@@ -505,6 +517,7 @@ protected function _save( $image, $filename = null, $mime_type = null ) {
505517 $ stat = stat ( dirname ( $ filename ) );
506518 $ perms = $ stat ['mode ' ] & 0000666 ; // Same permissions as parent folder, strip off the executable bits.
507519 chmod ( $ filename , $ perms );
520+ error_log ( 'filename 2 --- ' . json_encode ( $ filename , JSON_PRETTY_PRINT ));
508521
509522 return array (
510523 'path ' => $ filename ,
0 commit comments