WordPress开发者自定义附件上传目录的几种方式

WordPress默认的媒体库,即附件上传路径在站点目录的/wp-content/uploads/路径下。WordPress官方提供了两种文件组织方式,一种是按年分,一种是按月分。个人博客网站,内容不多的,考虑按年会比较好管理;如果是更新频繁的咨询站、电商站则推荐按月分文件夹。因为如果单个目录下文件太多,会发生ftp无法索引的问题,这个问题我曾写过一篇 文章 讨论。
WordPress自带的附件管理设置

大部分情况下我们不需要修改默认的文件上传路径,但在以下情况下就会产生这样的需求:
1. 前端不直接暴露附件路径的付费下载站;
2. 交互类网站允许访客上传附件的,不希望和站长自己上传的附件放在同一路径下;
3. 有意隐藏WordPress信息的,即不希望他人通过路径特征知道我们是用WordPress建的网站。

虽然有很多媒体库相关的插件能自定义上传路径,但我还是秉承能用少量代码实现的事情就不用插件。无插件修改默认路径有两种方式:

方法一,修改wp-config.php,添加UPLOADS常量的声明

//把附件存储在/wp-content/media路径下
define( 'UPLOADS', 'wp-content/' . 'media' );
//把附件存储在站点根目录的uploads目录下
define('UPLOADS','uploads');

需要注意的是,如果你的网站是一个已在媒体库里存有附件的老网站,修改UPLOADS常量后,那些已上传的附件在媒体库里会变成空白。那是因为数据库里虽仍保有文件信息,但因为修改了读取路径,媒体库里读取不到附件等缩略图了,你需要手动把原来的附件路径里的文件都转移到新的路径下。这个方法其实本人不怎么推荐。

方法二,通过upload_dir钩子修改上传路径

//把附件存储在/wp-content/mysubdir路径下
add_filter( 'upload_dir', 'brain1981_upload_dir');
function brain1981_upload_dir( $param ){
	$mydir = '/mysubdir';
	$param['path'] = $param['basedir'] . $mydir;
	$param['url'] = $param['baseurl'] . $mydir;
	return $param;
}

只在调用此钩子之后上传的文件会被存到新路径下,而完成上传后,我们还可以通过去掉钩子,恢复原先的上传路径。

remove_filter( 'upload_dir', 'brain1981_upload_dir');

这个方法的好处是媒体库中一直都能正确读取附件的路径信息。

市面上的媒体库管理插件也都是基于方法二修改的文件路径。举个例子,如果我需要只在通过Rest API上传文件的时候启用自己的路径,那么就可以这样定义接口:

add_action( 'rest_api_init', function () {
	//修改路径 brain1981_upload_dir函数同上文
	add_filter( 'upload_dir', 'brain1981_upload_dir');
	//上传接口
	register_rest_route( 'brain1981/v1', '/upload/', array(
		'methods' => 'POST',
		'callback' => 'brain1981_api_post_upload',
	) );
});
function brain1981_api_post_upload($request){
	//...我的接口业务代码
}

在这种情况下,我不需要写remove_filter去掉钩子了,因为正常前端访问网站不会运行这个套在接口定义里的brain1981_upload_dir命令。

为没有权限的访客(非管理员和编辑)设定专门的上传路径,这个功能通常用于有带图评论或可以上传附件交流的社区网站。

//单独安排普通用户上传图片的路径
add_filter( 'upload_dir', 'brain1981_upload_dir_2',999);
function brain1981_upload_dir_2( $param ){
	if ( !current_user_can( 'edit_posts' ) ){//如果用户没有对应权限
		$mydir = '/customer_comments';
		$param['path'] = $param['path'] . $mydir;
		$param['url'] = $param['url'] . $mydir;
	}
	return $param;
}

以上,仅作参考,诸君可举一反三。

本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.brain1981.com/2719.html。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

关注我们的微信公众号-JennyStudio 本站记录了近几年的工作中遇到的一些技术问题和解决过程,“作品集”还收录了本人的大部分作品展示。除了本博客外,我们的工作室网站 – JennyStudio,内有更多作品回顾和展示。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。

2 关于 “WordPress开发者自定义附件上传目录的几种方式” 的评论

    1. Brain 文章作者

      这个很简单啊增加一条MIME的支持就行了,百度就能搜到很多
      function my_upload_mimes($mimes = array()) {
      $mimes['svg'] = 'image/svg+xml';
      return $mimes;
      }
      add_filter('upload_mimes', 'my_upload_mimes');

      回复

发表评论

您的电子邮箱地址不会被公开。