You could certainly change the upload folder structure using an upload_dir
filter hook, but I think a more direct solution might be to append some other text to the end of the file name. I think an easy unique string could just be the current timestamp, and encoding it in hexadecimal would make it a little more compact.
I’m not too familiar with WordPress’s media APIs, but it looks to me that the wp_handle_upload_prefilter
and/or wp_handle_sideload_prefilter
filter (depending on how you are performing the upload) would be reasonable place to implement this functionality:
function wpse408625_media_upload_append_ts( $file ) {
$ext = substr( $file['name'], strrpos( $file['name'], '.' ) );
$filename = substr( $file['name'], 0, strlen( $file['name'] ) - strlen( $ext ) );
$file[ 'name' ] = $filename . '-' . dechex( time() ) . $ext;
return $file;
}
add_filter( 'wp_handle_upload_prefilter', 'wpse408625_media_upload_append_ts' );
add_filter( 'wp_handle_sideload_prefilter', 'wpse408625_media_upload_append_ts' );
The above should transform a filename such as pic.jpeg
into one like pic-62faeadd.jpeg
. As long as you don’t manage to upload an image, delete it, then upload another with the same filename all within the span of one second, this should prevent future collisions!