修改插件时相遇的一些题材,完毕附属类小部件上传自动重命名但不改变附属类小部件标题

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

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中的文件名都是取的这一个值。

好,总算找到病因了,剩下的题材正是怎么样把那个值给修改掉。

WordPress
上传媒体文件时,默许会保持文件名不变。要是上传文件名中富含中文字符,则会造成一些浏览器突显的公文
U帕杰罗L 疑似乱码甚至不能够访问。网上流行较广的是经过挂号  wp_handle_upload_prefilter 过滤器达成,可是该方案在重命名文件的同时也会将附属类小部件的题目修改,造成数据丢失。本篇文章将介绍一种既能自动重命名文件名且不改变附属类小部件题指标章程。

5,其余啰哩啰嗦的题材

代码中的$data数组是二个多维数组,多维数组做字符串替换该如何是好啊?str_replace()函数好像只好替换一维数组。小编在代码里用的是将数组转化为字符串再交替的章程,用到了json_encode()和json_decode(),不精通还有没有任何更好的格局。

文本重名的的办法rename(),在对文件重命名以前要先判断文件是或不是留存和文书夹权限(只怕权力不够时,修改文件夹权限),小编那里没有做。

ps:作者写的这几个wp-bos插件(辅助wordpress使用云存款和储蓄作为图片的储存空间,近来帮衬BOS百度云存款和储蓄)托管在gitoschina和github上,

而是托管的代码临时还未曾将重命名的功用进入,等到插件在网站上运营一段时间没失常后,小编会立马将改成push上去,感兴趣的意中人能够关注下。

将以下代码添加到所利用核心的functions.php
文件中最终1个?>的后面即可。

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下的路径信息添加到数据库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数组是替换文件名后的数组,作者一时还不知情那样做会不会发出哪些副功能。

然后,笔者把插件代码更新了下。嗯,插件起效用了,重命名功效完毕,原有职能没被磨损。

 

1,难点由来

本星期四,小编在浏览公司的网站(基于wordpress开发)时发现,网站首页上有两篇小说的缩略图重复了,于是我进入网站后台检查,想看下是还是不是某位员工在作文文章时非常大心那两篇小说选取了一如既往的图样作为封面图片。

结果发现那两篇文章选择的书面图片的文件名还真是相同,但作者转念又想到,职员和工人再繁杂也未必犯那样的荒唐。于是,笔者检查了下这几篇小说的书面图片url地址,那么些地点是一律的。

自个儿想开,有恐怕是那两张图纸的文书名相同(至于缘何会产出那种气象,可能唯有鬼知道),然后文件被上传后,后上传的图形将前方上传的图形覆盖,最后只有一张图纸留在了云存款和储蓄的服务器上。

注:笔者写了个插件,在上传图片时,能够将图片上传至百度云的BOS上。

wordpress是用php语言开发的博客平台,它扩张性强,简单扩张,很适合拿来做壹次开发。