I have a lot of uploaded image files and image sizes. So it would be better to organize media files into folders based on post type. I have just read this tutorial, but as I can see it works with plugins. How to change this to use in a theme? Thanks.

function custom_upload_directory( $args ) {
    $id = $_REQUEST['post_id'];
    $parent = get_post( $id )->post_parent;
    // Check the post-type of the current post
    if( "post-type" == get_post_type( $id ) || "post-type" == get_post_type( $parent ) ) {
        $args['path'] = plugin_dir_path(__FILE__) . "uploads";
        $args['url']  = plugin_dir_url(__FILE__) . "uploads";
        $args['basedir'] = plugin_dir_path(__FILE__) . "uploads";
        $args['baseurl'] = plugin_dir_url(__FILE__) . "uploads";
    return $args;
add_filter( 'upload_dir', 'custom_upload_directory' );
  • This article may be useful for understanding how to place things in theme or plugin. – brasofilo Dec 21 '12 at 17:38

If i understand your question right you want a function within your theme that adds directories for the current post_type? like: uploads/post_type_name. if so here is a function for that:

function wpse_16722_type_upload_dir( $args ) {

    // Get the current post_id
    $id = ( isset( $_REQUEST['post_id'] ) ? $_REQUEST['post_id'] : '' );

    if( $id ) {    
       // Set the new path depends on current post_type
       $newdir = '/' . get_post_type( $id );

       $args['path']    = str_replace( $args['subdir'], '', $args['path'] ); //remove default subdir
       $args['url']     = str_replace( $args['subdir'], '', $args['url'] );      
       $args['subdir']  = $newdir;
       $args['path']   .= $newdir; 
       $args['url']    .= $newdir; 
    return $args;
add_filter( 'upload_dir', 'wpse_16722_type_upload_dir' );
  • Thank you, it works for me. I made a little modification because $_REQUEST['post_id'] cause Undefined index: post_id error. I use this: if(!isset($_REQUEST['post_id'])) return $args; $id = (int)$_REQUEST['post_id']; – user9909 Jan 26 '13 at 14:45
  • 1
    This code works for post type "page" "post", but not for custom post type. I upload the file via "carbon fields" file field. How could I make it work in any other custom post type? – BenB Jun 12 '17 at 15:57

protected by Community May 19 at 11:21

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

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