则会招致局地浏览器显示的文书,很适合拿来做二次开发澳门永利娱乐总站

WordPress
上传媒体文件时,默许会保持文件名不变。若是上传文件名中涵盖中文字符,则会造成一些浏览器突显的文件
URL 疑似乱码甚至不能够访问。网上流行较广的是经过挂号  wp_handle_upload_prefilter 过滤器达成,不过该方案在重命名文件的同时也会将附件的题目修改,造成数据丢失。本篇小说将介绍一种既能自动重命名文件名且不改动附件标题的不二法门。

wordpress是用php语言开发的博客平台,它伸张性强,不难伸张,很吻合拿来做二次开发。

将以下代码添加到所利用大旨的functions.php
文件中最后一个?>的前方即可。

1,难题原因

本周天,我在浏览公司的网站(基于wordpress开发)时意识,网站首页上有两篇文章的缩略图重复了,于是我进去网站后台检查,想看下是否某位员工在作文小说时不小心那两篇作品选拔了一样的图样作为封面图片。

结果发现那两篇作品采用的封面图片的文件名还真是相同,但自身转念又想到,员工再繁杂也未见得犯那样的荒唐。于是,我反省了下这几篇小说的封面图片url地址,那么些地址是同样的。

本身想到,有可能是那两张图片的文本名相同(至于为何相会世那种景观,恐怕只有鬼知道),然后文件被上传后,后上传的图样将眼前上传的图样覆盖,最终唯有一张图片留在了云存储的服务器上。

注:我写了个插件,在上传图片时,可以将图片上传至百度云的BOS上。

 

 

2,难题该怎么化解

骨子里,一开始我是很纠结那一个题材的:是让编辑成文的员工下次小心,每一次上传图片时都要按年月日日子、加序号和图表其余音讯将图纸重名后再上传呢,照旧要好默默的在融洽写的插件里丰裕有些代码把图纸重命名呢?

好呢,写到那里,你肯定能猜到我做了怎么着的精选?写代码吧。

 

1 function wp_coderbusy_sanitize_file_name( $filename ) {
2     $time = date("YmdHis");
3     return $time . "" . mt_rand(1000, 9999) . "." . pathinfo($filename, PATHINFO_EXTENSION);
4 }
5  
6 add_filter( 'sanitize_file_name', 'wp_coderbusy_sanitize_file_name', 10, 1 );

3,曲折的进度

自身的插件原来只担负把图片上传到百度云的BOS上,然后把当地图片删除,主要接纳了wordpress的wp_update_attachment_metadata钩子。我在这一个钩子里调用了一个温馨定义的函数upload_attachement_to_bos,

其一函数就承担把图片上传出BOS并删除本地图片。一伊始,我一向在想什么在那几个函数里做小说:把原图重命名,把缩略图重命名,额,试了半天都从不听从。我检查了下BOS上的图片,上传成功、文件名也是修改后的。

可是为啥网站的图片url地址仍然没变?

不能着急,先去媒体库下边看下图片,结果发现媒体库的图纸文件名、标题、url中的名称都如故本来的文件名。

澳门永利娱乐总站 1

本身尽管把服务器上的文书名都改了,但数据库中与图片有关的字段的值都并未改。于是,我尝试更改wordpress的数据表,来看媒体库和小说缩略图中的图片文件名是不是有变化。

以内,我试着修改post表中的postname、post_title、guid字段,不过并不曾用。postname:小说的别名,呈现在url地址中,一般可用来标榜url地址,post_title:与媒体库中,附件详情表单页面中的图片标题对应,就一定于文章标题,

guid:这几个,说实话,我也不亮堂它有哪些用,好像是小说的绝无仅有标识。

本人最后一定到postmeta表中的meta_key:
_wp_attached_file对应的meta_value。这个_wp_attached_file的值会影响小说附件的连锁音信,如媒体库中的附件详情页中的图片url、文件名都是取的meta_value值

除此以外就是wordpress宗旨(据我测试的蝇头的多少个主旨)下首页文章缩略图、作品单页中的头图url中的文件名都是取的这么些值。

好,总算找到病因了,剩下的难点就是如何把那些值给修改掉。

 

 原文地址:https://www.coderbusy.com/archives/677.html

4,难点暂时缓解,但还有局地遗留难题

前方说到了,我使用了wp_update_attachment_metadata钩子,于是自己在相应的钩函数里做文件名修改、更新_wp_attached_file的干活。钩子函数代码大概如下:

澳门永利娱乐总站 2澳门永利娱乐总站 3

 1 // 钩子函数: 重命名文件,更新文件meta信息,调用上传函数,并将上传的原图在bucket下的路径信息保存到数据库
 2 function update_attachment_metadata($data, $post_id) {
 3     /* 重命名文件防止冲突 */
 4     date_default_timezone_set('PRC');
 5     $wp_upload_dir = wp_upload_dir();
 6     $old_path = $wp_upload_dir['basedir'] . '/' . $data['file'];
 7     $ext = pathinfo($old_path, PATHINFO_EXTENSION);
 8     $old_namestr = str_replace('.' . $ext, '', basename($data['file']));
 9     $new_namestr = date('YmdHis-') . dechex(mt_rand(100000, 999999));
10     $new_path = $wp_upload_dir['path'] . '/' . $new_namestr. '.' . $ext;
11 
12     rename($old_path, $new_path);
13 
14     if (isset($data['sizes']) && count($data['sizes']) > 0) {
15         $thumb_data = &$data['sizes'];
16         foreach ($thumb_data as $key => $thumb) {
17             $old_thumbpath = $wp_upload_dir['basedir'] . '/' . substr($data['file'], 0, 8)
18                 . $thumb['file'];
19             $new_thumbpath = str_replace($old_namestr, $new_namestr, $old_thumbpath);
20             if (file_exists($old_thumbpath)) {
21                 rename($old_thumbpath, $new_thumbpath);
22             }
23         }
24     }
25     /* 更新data中的文件名 */
26     $old_jsdata = json_encode($data, JSON_UNESCAPED_UNICODE);
27     $new_data = json_decode(str_replace($old_namestr, $new_namestr, $old_jsdata), true);
28 
29     unset($data, $old_jsdata);
30 
31     $ori_object_key = upload_attachement_to_bos($new_data, $post_id);
32     // 将原始图片在BOS bucket下的路径信息(object信息)添加到数据库
33     add_post_meta($post_id, 'bos_info', $ori_object_key);
34 
35     /* 更新数据库中postmeta表中_wp_attached_fies的值 */
36     $old_meta = get_post_meta($post_id, '_wp_attached_file', true);
37     update_post_meta($post_id, '_wp_attached_file', str_replace($old_namestr, $new_namestr, $old_meta));
38 
39     return $new_data;
40 }

View Code

关键是36、37行修改postmeta表中的_wp_attached_file值,然后必要小心的是,我那边对函数的重返值举行了处理,重临的$new_data数组是替换文件名后的数组,我暂时还不亮堂这么做会不会发出怎么着副效能。

接下来,我把插件代码更新了下。嗯,插件起功能了,重命名作用已毕,原有功能没被磨损。

 

5,其他啰哩啰嗦的题材

(1)代码中的$data数组是一个多维数组,多维数组做字符串替换该咋办啊?str_replace()函数好像只可以替换一维数组。我在代码里用的是将数组转化为字符串再交替的措施,用到了json_encode()和json_decode(),不知道还有没有任何更好的方法。

(2)文件重名的的主意rename(),在对文件重命名以前要先判断文件是还是不是留存和文书夹权限(或者权力不够时,修改文件夹权限),我那边没有做。

 

ps:我写的那些wp-bos插件(援救wordpress使用云存储作为图片的囤积空间,近期襄助BOS百度云存储)托管在gitoschinagithub上,

然则托管的代码暂时还尚未将重命名的效益进入,等到插件在网站上运行一段时间不是难点后,我会立即将转移push上去,感兴趣的情侣可以关怀下。

相关文章