Rename files during upload within Wordpress backend

gearsdigital picture gearsdigital · Jul 15, 2010 · Viewed 20.1k times · Source

is there a way to rename files during the upload progress within the Wordpress 3.0 backend? I would like to have a consistent naming of files, especially for images.

I think an 12 (+-) digit hash value of the original filename or something similar would be awesome. Any suggestions?

Regards

Answer

TheDeadMedic picture TheDeadMedic · Jul 16, 2010

But it would really be easier to do that before uploading files.

Not quite sure about that - this seems fairly easy;

/**
 * @link http://stackoverflow.com/a/3261107/247223
 */
function so_3261107_hash_filename( $filename ) {
    $info = pathinfo( $filename );
    $ext  = empty( $info['extension'] ) ? '' : '.' . $info['extension'];
    $name = basename( $filename, $ext );

    return md5( $name ) . $ext;
}

add_filter( 'sanitize_file_name', 'so_3261107_hash_filename', 10 );

This filter creates a 32 character hash of the original filename, preserving the file extension. You could chop it down a little using substr() if you wanted to.

This filter runs once the file has been uploaded to a temporary directory on your server, but before it is resized (if applicable) and saved to your uploads folder.

Note that there is no risk of file overwrite - in the event that a newly hashed file is the same as one that already exists, WordPress will try appending an incrementing digit to the filename until there is no longer a collision.

WordPress Plugin

<?php

/**
 * Plugin Name: Hash Upload Filename
 * Plugin URI:  http://stackoverflow.com/questions/3259696
 * Description: Rename uploaded files as the hash of their original.
 * Version:     0.1
 */

/**
 * Filter {@see sanitize_file_name()} and return an MD5 hash.
 *
 * @param  string $filename
 * @return string
 */
function so_3261107_hash_filename( $filename ) {
    $info = pathinfo( $filename );
    $ext  = empty( $info['extension'] ) ? '' : '.' . $info['extension'];
    $name = basename( $filename, $ext );

    return md5( $name ) . $ext;
}

add_filter( 'sanitize_file_name', 'so_3261107_hash_filename', 10 );