7

As of now my uploaded files are organized by year and month. But I would like to organize them by year, month and day. I mean like this 2012/10/30/image goes here

PS: There is a plugin available to do this. But I don't want to use a plugin for this simple task. Thanks

2
  • 1
    @kaiser Sorry.. Corrected it.. I'm not going to use the code in my theme functions but going to use it in my mu-plugins. Commented Oct 30, 2012 at 12:21
  • I already corrected that for you (it's the other way 'round ;) ) - rolled back.
    – kaiser
    Commented Oct 30, 2012 at 12:26

3 Answers 3

3

Code based in other Answer of mine and this SO Answer.

It uses the post/page/cpt publish date to build the paths.
Note that $the_post->post_date_gmt is also available.

add_filter('wp_handle_upload_prefilter', 'wpse_70946_handle_upload_prefilter');
add_filter('wp_handle_upload', 'wpse_70946_handle_upload');

function wpse_70946_handle_upload_prefilter( $file )
{
    add_filter('upload_dir', 'wpse_70946_custom_upload_dir');
    return $file;
}

function wpse_70946_handle_upload( $fileinfo )
{
    remove_filter('upload_dir', 'wpse_70946_custom_upload_dir');
    return $fileinfo;
}

function wpse_70946_custom_upload_dir($path)
{   
    /*
     * Determines if uploading from inside a post/page/cpt - if not, default Upload folder is used
     */
    $use_default_dir = ( isset($_REQUEST['post_id'] ) && $_REQUEST['post_id'] == 0 ) ? true : false; 
    if( !empty( $path['error'] ) || $use_default_dir )
        return $path; // Error: not uploading from a post/page/cpt 

    $the_post = get_post( $_REQUEST['post_id'] );
    $y = date( 'Y', strtotime( $the_post->post_date ) );
    $m = date( 'm', strtotime( $the_post->post_date ) );
    $d = date( 'd', strtotime( $the_post->post_date ) );

    $customdir = '/' . $y . '/' . $m . '/' . $d;

    $path['path']    = str_replace($path['subdir'], '', $path['path']); //remove default subdir (year/month)
    $path['url']     = str_replace($path['subdir'], '', $path['url']);      
    $path['subdir']  = $customdir;
    $path['path']   .= $customdir; 
    $path['url']    .= $customdir;  

    return $path;
}
8
  • Hi thanks for the code. But its not working in my site. I'm using the magic field plugin for custom fields. This plugin handles my image uploads. It uses wp_upload_dir() function to store the images. Right now my image uploads are organized by year and month. I'm using your code in my mu-plugins folder. But when I upload a file its still not using day folder. Its not at all creating day folder. Am i missing something? Do i have to uncheck "Organize my uploads into month- and year-based folders" in media settings? Commented Oct 31, 2012 at 21:51
  • If the plugin "handles the image uploads", maybe we have a conflict of interests here... Can you post the relevant code it uses for that?
    – brasofilo
    Commented Oct 31, 2012 at 21:59
  • Please Note line number 19,30,31 of this file and line 86,87 of this file. The second one has the main upload function of that plugin. Thanks Commented Nov 1, 2012 at 0:09
  • At a first glance, I don't see a way to surpass those plugin constants... I doubt, but try to give a late priority to the hooks, i.e., add_filter('wp_handle_upload', 'wpse_70946_handle_upload', 9999 );. :::: This code works for me in TwentyEleven without any active plugins and with Media Settings "Organize my uploads..." checked/unchecked. :::: If the code works for you without Magic Fields being active, then I guess you'll need to open a new Question or a support request... :/
    – brasofilo
    Commented Nov 1, 2012 at 0:27
  • Ok Thanks.. I'll give it a try. And one more weird thing. As i said earlier I put your code in my mu-plugins folder. My server time now is 00:44 Nov 1. I see some new folders 1970/01/01 and my existing image links are broken. Any idea? Commented Nov 1, 2012 at 0:51
4

As far as I can tell, the filter 'upload_dir' is only called once in wp-includes\functions.php

I find this solution to be much simpler. It will place all uploads into the year/month/day directory for the date it is uploaded.

function upload_dir_filter($uploads){
    $day = date('d');
    $uploads['path'] .= '/' . $day;
    $uploads['url']  .= '/' . $day;
    return $uploads;
}
add_filter('upload_dir', 'upload_dir_filter');
2
  • Should probably use wp_date instead. Commented May 19, 2020 at 19:35
  • Shouldn't $uploads['subdir'] be set as well? Commented May 19, 2020 at 19:36
0

I have made a new code out of these 2 code. The images will be uploaded to the post date folder not the uploaded date folder:

function upload_dir_filter($uploads){

    $the_post = get_post( $_REQUEST['post_id'] );
    $y = date( 'Y', strtotime( $the_post->post_date ) );
    $m = date( 'm', strtotime( $the_post->post_date ) );
    $day = date( 'd', strtotime( $the_post->post_date ) );
    $uploads['path'] .= '/' . $day;
    $uploads['url']  .= '/' . $day;
    return $uploads;
}
add_filter('upload_dir', 'upload_dir_filter');

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