3

I am attempting to change the name format that WordPress uses to rename uploaded files. For example, when I upload an image with filename cat-picture.jpg WordPress will create scaled versions and rename the filename to variations of cat-picture-{WIDTHxHEIGHT}.jpg. Is there a way I am able to move this width & height attribute to the beginning of the filename so instead I get variations of {WIDTHxHEIGHT}-cat-picture.jpg? So, in the context of this example, I'd like the filename to be renamed to 600x400-cat-picture.jpg. Thoughts?

I've looked at this post and this post, but I am unable to come up with a working solution. Here's my code:

add_filter( 'wp_handle_upload_prefilter', 'modify_uploaded_file_names', 20);
function modify_uploaded_file_names( $image ) {
    // Get default name of uploaded file and set to variable
    $imagename = $image['name'];
    // Case switch for multiple file extensions
    switch ( $image['type'] ) {
        case 'image/jpeg' :
            $suffix = 'jpg';
            break;
        case 'image/png' :
            $suffix = 'png';
            break;
        case 'image/gif' :
            $suffix = 'gif';
            break;
    }
    // Get size of uploaded image and assign to variable
    $imagesize = getimagesize($image);
    // Re-structure uploaded image name
    $image['name'] = "{$imagesize[0]}x{$imagesize[1]}-{$imagename}.{$suffix}";

    return $image;
}
1
  • 2
    I'm not quite sure I can answer your question, but please make sure that you include what you're actually trying to do. it's possible that people can suggest a different solution to the initial problem you're trying to solve. (This is sometimes called the XY problem)
    – mrwweb
    Jan 18, 2013 at 18:57

1 Answer 1

3

I've managed to do it with the filter image_make_intermediate_size.

Probably all the path/filename.extension dismembering and remaking could be optimized or made in a single stroke fashion, but alas, I'll let that to the reader:

// The filter runs when resizing an image to make a thumbnail or intermediate size.
add_filter( 'image_make_intermediate_size', 'rename_intermediates_wpse_82193' );

function rename_intermediates_wpse_82193( $image ) 
{
    // Split the $image path into directory/extension/name
    $info = pathinfo($image);
    $dir = $info['dirname'] . '/';
    $ext = '.' . $info['extension'];
    $name = wp_basename( $image, "$ext" );

    // Build our new image name
    $name_prefix = substr( $name, 0, strrpos( $name, '-' ) );
    $size_extension = substr( $name, strrpos( $name, '-' ) + 1 );
    $new_name = $dir . $size_extension . '-' . $name_prefix . $ext;

    // Rename the intermediate size
    $did_it = rename( $image, $new_name );

    // Renaming successful, return new name
    if( $did_it )
        return $new_name;

    return $image;
}
5
  • PS: I did only basic tests of uploading in a post and inserting intermediates in content, so far so good...
    – brasofilo
    Jan 18, 2013 at 21:23
  • Thank you so much for your response!! So just to clarify, this function will run every time a file is uploaded, correct? Trying to fully understand, but this function will rename every intermediate file created on upload? Also, I'm curious if there would be a way to instead format the renamed file so that instead, only the width would be in the filename. ie like: "600-cat-picture.jpg" instead of "600x400-cat-picture.jpg". This format would work better with my responsive image script. Any thoughts/help you could share? Thank you.
    – kaffolder
    Jan 23, 2013 at 7:20
  • 1
    @kaffolder, I've added comments to the code, so it's clear what each part is doing. Yes, it's possible to use only the width, you need to do this to the $size_extension string ;)
    – brasofilo
    Jan 23, 2013 at 13:20
  • Thanks so much @brasofilo! Spot on!! This will help immensely with the responsive foresight.js image plugin I'm working on. Cheers!
    – kaffolder
    Jan 23, 2013 at 16:21
  • Glad to know, @kaffolder! Ping us the link to the plugin here when it's finished ;)
    – brasofilo
    Jan 23, 2013 at 16:25

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.