WP笔记

如何动态设置WordPress上传目录

WordPress默认的上传文件的目录是/wp-content/uploads,而且文件是以年月的形式组织的,虽然我们可以去掉按照年月组织的选项,或者更改存储路径,但这个设置会应用到全局,不能按照特定条件选择特定目录存储文件。

WordPress上传默认设置

有时候将不同类型的文件分门别类存储,似乎比年月目录更有意义。例如幻灯片应该存储在slides目录下,下载文件应该存储在downloads文件夹下。就说幻灯片slideshow,我比较喜欢用自定义文章类型(Custom Post Type)实现,有些幻灯片脚本比较个性,不支持绝对路径,必须用相对路径,然后用base参数设置相对于哪个文件夹,这样幻灯片必须存储在某个特定的文件夹中,年月形式显然不满足要求。所以,我们需要条件化的设置上传目录。

为Custom Post Type设置上传目录

假设我要将所有在幻灯片类型的文章中上传的文件存储到/wp-content/uploads/slides文件夹中,将下面的代码放到主题的functions.php中即可

function custom_upload_directory( $uploads ) {
	$id = $_REQUEST['post_id'];
        $parent = get_post( $id )->post_parent;

	if( "post-type" == get_post_type( $id ) || "post-type" == get_post_type( $parent ) ) {
		$subdir = 'slides';
		$uploads['subdir'] = $subdir;
		$uploads['path'] = $uploads['basedir'].DIRECTORY_SEPARATOR.$subdir;
		$uploads['url'] = $uploads['baseurl'].'/'.$subdir;
	}
	return $uploads;
}
add_filter( 'upload_dir', 'custom_upload_directory' );

将post-type替换成自己的自定义文章类型名称,将你要创建的子目录赋值给$subdir。

将文件保存到插件目录

下面的代码要用在插件中,文件会保存到插件目录下的uploads文件夹下。

/**
 * Change Upload Directory for Custom Post-Type
 *
 * This will change the upload directory for a custom post-type. Attachments will
 * now be uploaded to an "uploads" directory within the folder of your plugin. Make
 * sure you swap out "post-type" in the if-statement with the appropriate value...
 */
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' );

如果要以年月形式保存,修改一下代码即可

$args['path'] = plugin_dir_path(__FILE__) . "uploads" . $args['subdir'];
$args['url']  = plugin_dir_url(__FILE__) . "uploads" . $args['subdir'];

这段代码来自 http://wordpress.stackexchange.com/questions/35657/how-to-add-more-upload-directories/

为后台管理页面设定upload_dir

用wp_editor在后台管理页面(比如用add_menu_page创建的页面)创建一个媒体上传功能,希望所有从该页面上传的文件都保存到wp-content/uploads/myfolder目录下。

由 于ajax上传是直接调用wp-admin/async_upload.php文件,只能通过post_id获取post信息,而后台管理页面并非 post,所以判断什么时候应该更改upload_dir有些麻烦。此时,可以用采用判断页面referer的方法,用wp_get_referer() 函数获取引荐url,如果正好与我们的option page url想等,就更该目录。

function custom_upload_directory( $uploads ) {

   if( wp_get_referer() == 'http://domain.com/wp-admin/admin.php?page=myoptionpage'){
        $subdir = 'myfolder';
        $uploads['subdir'] = $subdir;
        $uploads['path'] = $uploads['basedir'].DIRECTORY_SEPARATOR.$subdir;
        $uploads['url'] = $uploads['baseurl'].'/'.$subdir;
   }
   return $uploads;
}
add_filter( 'upload_dir', 'custom_upload_directory' );

参考信息

filter:upload_dir是在wp_upload_dir()函数中调用的

$upload_dir = wp_upload_dir();

$upload_dir now contains something like the following (if successful)
Array (
    [path] => C:\path\to\wordpress\wp-content\uploads\2010\05
    [url] => http://example.com/wp-content/uploads/2010/05
    [subdir] => /2010/05
    [basedir] => C:\path\to\wordpress\wp-content\uploads
    [baseurl] => http://example.com/wp-content/uploads
    [error] =>
)

13条评论

  1. 博主你好,请教个问题,我想让上传的图片自动按日期分目录存储,比如10月上传的文件就保存在 /wp-content/uploads/201510/ 这样该如何实现呢?

    1. 你是指上传到wordpress media library中的图片吗?默认不是按照年月保存的吗?那你的站点目前用什么目录结构存储?

      1. 啊?我从来没改过什么,从开始图片默认存放位置都是/wp-content/uploads/ 所有上传的图片都是在这一个文件夹下的,时间长了图片变好多,应该怎么改呢?

      2. 知道了弄好了,开启多站点后在网络管理-所有站点-选择站点编辑-设置 里面有个【Uploads Use Yearmonth Folders】选项,设置成Y 就可以了

  2. 看得我云里雾里的,不知道能不能实现这样的一个功能呢,比如说,我发一篇文章,默认的图片都存放在upload文件夹内,是以年月日的形式,刚好在这时候可能需要用到一张独立的特色图片,那么我能不能在上传的时候选择这个图片存放在tese这个文件夹内呢,在下次发文章的时候能不能在添加特色图片那进入媒体库选择这张图片呢

    1. 这种情况,将图片分类存放更合适,没必要放在不同目录里,分类存放可以用插件enhanced media library

  3. 博主,你请问,我在默认的上传目录中建立了一个子目录:uploads/2014/11/0/,里面有图片,但“多媒体”无法查看到里面的图片。为啥。

    我是想省点流量,每天添加七八篇文章,每篇文章都有图片,一篇文章图片算100KB,每次点击“多媒体”都会加载所有已经上传的图片,太消耗流量了。

    所以我想在官方的基础上加上0-9这样的目录。一个月共30天,每天最后一位数上传的图片,自动分到0-9其中一个目录中。这样可以大大的减少流量。

    我水平不够。希望博主能帮上忙。

  4. 没懂,我想图片保存到wp默认上传目录,其他的文件比如zip doc保存到比如download目录,怎么操作,需要什么插件么?

  5. Pingback: sae云空间极限提高海外主机wordpress载入速度 - 逆袭 - 前进的我们,该留下什么背影
    1. 行啊,你加我,我就加你,别写容易被惩罚的东西,真诚相待就okay了

评论已关闭。