WordPress默认的媒体库,即附件上传路径在站点目录的/wp-content/uploads/路径下。WordPress官方提供了两种文件组织方式,一种是按年分,一种是按月分。个人博客网站,内容不多的,考虑按年会比较好管理;如果是更新频繁的咨询站、电商站则推荐按月分文件夹。因为如果单个目录下文件太多,会发生ftp无法索引的问题,这个问题我曾写过一篇 文章 讨论。
大部分情况下我们不需要修改默认的文件上传路径,但在以下情况下就会产生这样的需求:
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。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。
学习了,有机会给分享一下.svg媒体上传教程
这个很简单啊增加一条MIME的支持就行了,百度就能搜到很多
function my_upload_mimes($mimes = array()) {
$mimes['svg'] = 'image/svg+xml';
return $mimes;
}
add_filter('upload_mimes', 'my_upload_mimes');