2438 | | $filename = str_replace( array( "-$number$ext", "$number$ext" ), "-$new_number$ext", $filename ); |
2439 | | $filename2 = str_replace( array( "-$number$ext2", "$number$ext2" ), "-$new_number$ext2", $filename2 ); |
| 2439 | $filename = str_replace( array( "-{$number}{$ext}", "{$number}{$ext}" ), "-{$new_number}{$ext}", $filename ); |
| 2440 | $filename2 = str_replace( array( "-{$number}{$ext2}", "{$number}{$ext2}" ), "-{$new_number}{$ext2}", $filename2 ); |
2443 | | /** |
2444 | | * Filters the result when generating a unique file name. |
2445 | | * |
2446 | | * @since 4.5.0 |
2447 | | * |
2448 | | * @param string $filename Unique file name. |
2449 | | * @param string $ext File extension, eg. ".png". |
2450 | | * @param string $dir Directory path. |
2451 | | * @param callable|null $unique_filename_callback Callback function that generates the unique file name. |
2452 | | */ |
2453 | | return apply_filters( 'wp_unique_filename', $filename2, $ext, $dir, $unique_filename_callback ); |
| 2444 | $filename = $filename2; |
| 2445 | } else { |
| 2446 | while ( file_exists( $dir . "/{$filename}" ) ) { |
| 2447 | $new_number = (int) $number + 1; |
| 2448 | |
| 2449 | if ( '' === "{$number}{$ext}" ) { |
| 2450 | $filename = "{$filename}-{$new_number}"; |
| 2451 | } else { |
| 2452 | $filename = str_replace( array( "-{$number}{$ext}", "{$number}{$ext}" ), "-{$new_number}{$ext}", $filename ); |
| 2453 | } |
| 2454 | |
| 2455 | $number = $new_number; |
| 2456 | } |
2456 | | while ( file_exists( $dir . "/$filename" ) ) { |
2457 | | $new_number = (int) $number + 1; |
2458 | | if ( '' == "$number$ext" ) { |
2459 | | $filename = "$filename-" . $new_number; |
2460 | | } else { |
2461 | | $filename = str_replace( array( "-$number$ext", "$number$ext" ), '-' . $new_number . $ext, $filename ); |
| 2459 | // Prevent collisions with existing file names that contain dimension-like strings |
| 2460 | // (whether they are subsizes or originals uploaded prior to #42437). |
| 2461 | |
| 2462 | // The (resized) image files would have name and extension. |
| 2463 | if ( $name && $ext ) { |
| 2464 | // List of all files and directories contained in $dir (with the "dot" files removed). |
| 2465 | $files = array_diff( scandir( $dir ), array( '.', '..' ) ); |
| 2466 | |
| 2467 | if ( ! empty( $files ) ) { |
| 2468 | while ( _wp_check_existing_file_names( $filename, $files ) ) { |
| 2469 | $new_number = (int) $number + 1; |
| 2470 | $filename = str_replace( array( "-{$number}{$ext}", "{$number}{$ext}" ), "-{$new_number}{$ext}", $filename ); |
| 2471 | $number = $new_number; |
| 2472 | } |
| 2491 | * Helper function to check if a file name could match an existing image sub-size file name. |
| 2492 | * |
| 2493 | * @since 5.3.1 |
| 2494 | * |
| 2495 | * @param string $filename The file name to check. |
| 2496 | * $param array $files An array of existing files in the directory. |
| 2497 | * $return bool True if the tested file name could match an existing file, false otherwise. |
| 2498 | */ |
| 2499 | function _wp_check_existing_file_names( $filename, $files ) { |
| 2500 | $fname = pathinfo( $filename, PATHINFO_FILENAME ); |
| 2501 | $ext = pathinfo( $filename, PATHINFO_EXTENSION ); |
| 2502 | |
| 2503 | // Edge case, file names like `.ext` |
| 2504 | if ( empty( $fname ) ) { |
| 2505 | return false; |
| 2506 | } |
| 2507 | |
| 2508 | if ( $ext ) { |
| 2509 | $ext = ".$ext"; |
| 2510 | } |
| 2511 | |
| 2512 | $regex = '/^' . preg_quote( $fname ) . '-(?:\d+x\d+|scaled|rotated)' . preg_quote( $ext ) . '/'; |
| 2513 | |
| 2514 | foreach ( $files as $file ) { |
| 2515 | if ( preg_match( $regex, $file ) ) { |
| 2516 | return true; |
| 2517 | } |
| 2518 | } |
| 2519 | |
| 2520 | return false; |
| 2521 | } |
| 2522 | |
| 2523 | /** |