Search code examples
wordpresspluginsfile-rename

Rename files during upload within Wordpress backend


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


Solution

  • 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 );