Set custom upload path for custom post type only?

You can add a filter to upload_dir. Here is a simple class I wrote to do this for a project. Use the protected $filter_path variable to define the alternate uploads directory (*will be relative to wp-content/uploads)

class UGC_Attachment {
    protected $upload_dir;
    protected $upload_url;
    protected $filter_path="/relative_path_from_wp-content/uploads";

    function __construct() {
        $dir = wp_upload_dir();
        $this->upload_dir = $dir['basedir'] . $this->filter_path;
        $this->upload_url = $dir['baseurl'] . $this->filter_path;
    }

    function upload_dir_filter( $upload ) {
        $target_path = $this->upload_dir;
        $target_url  = $this->upload_url;
        wp_mkdir_p( $target_path );
        $upload['path'] = $target_path;
        $upload['url']  = $target_url;

       return $upload;
    }
}

Usage:

function prefix_upload_dir_filter( $post ) {
    if ( 'clients' != get_post_type( $post )
        return;
    $filter = new UGC_Attachment();
    return add_filter( 'upload_dir', array( &$filter, 'upload_dir_filter' );
}

The prefix_upload_dir_filter function would need to be attached to an action or filter with the $post object available or the $post ID. You will need to do some more research to figure this part out or maybe someone else can chime in. My usage was a complete custom image upload solution from the front end where I needed the publicly uploded images placed in a temp directory that could be cleaned out nightly via a cron job.

Leave a Comment