Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

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' );
share|improve this question
This article may be useful for understanding how to place things in theme or plugin. –  brasofilo Dec 21 '12 at 17:38

2 Answers 2

up vote 4 down vote accepted

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' );
share|improve this answer
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

Pontus, can this be limited to a specific post type using if( "post-type" == get_post_type( $id ) || "post-type" == get_post_type( $parent ) ) { ? I tried this at the start of the function but the uploads seem to be blank after.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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