wordpress上传图片时重命名--修改插件时遇到的一些问题

yangtoude yangtoude     2022-08-13     749

关键词:

wordpress是用php语言开发的博客平台,它扩展性强,容易扩展,很适合拿来做二次开发。

1,问题由来

本周五,我在浏览公司的网站(基于wordpress开发)时发现,网站首页上有两篇文章的缩略图重复了,于是我进入网站后台检查,想看下是不是某位员工在撰写文章时不小心这两篇文章选择了相同的图片作为封面图片。

结果发现这两篇文章选用的封面图片的文件名还真是相同,但我转念又想到,员工再糊涂也不至于犯这样的错误。于是,我检查了下这几篇文章的封面图片url地址,这些地址是相同的。

我想到,有可能是这两张图片的文件名相同(至于为什么会出现这种情况,恐怕只有鬼知道),然后文件被上传后,后上传的图片将前面上传的图片覆盖,最后只有一张图片留在了云存储的服务器上。

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

 

2,问题该如何解决

其实,一开始我是很纠结这个问题的:是让编辑文章的员工下次注意,每次上传图片时都要按年月日时间、加序号和图片其它信息将图片重名后再上传呢,还是自己默默的在自己写的插件里加上一些代码把图片重命名呢?

好吧,写到这里,你肯定能猜到我做了什么样的选择?写代码吧。

 

3,曲折的过程

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

这个函数就负责把图片上传到BOS并删除本地图片。一开始,我一直在想如何在这个函数里做文章:把原图重命名,把缩略图重命名,额,试了半天都没有效果。我检查了下BOS上的图片,上传成功、文件名也是修改后的。

可是为什么网站的图片url地址还是没变?

不能着急,先去媒体库下面看下图片,结果发现媒体库的图片文件名、标题、url中的名称都还是原来的文件名。

我虽然把服务器上的文件名都改了,但数据库中与图片有关的字段的值都没有改。于是,我尝试更改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中的文件名都是取的这个值。

好,总算找到病根了,剩下的问题就是如何把这个值给修改掉。

 

4,问题暂时解决,但还有一些遗留问题

前面说到了,我用到了wp_update_attachment_metadata钩子,于是我在对应的钩子函数里做文件名修改、更新_wp_attached_file的工作。钩子函数代码大致如下:

 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上去,感兴趣的朋友可以关注下。

WordPress:如何在上传时使用当前日期重命名图像?

】WordPress:如何在上传时使用当前日期重命名图像?【英文标题】:WordPress:Howtorenameimageduringuploadwithcurrentdate?【发布时间】:2021-04-0202:02:09【问题描述】:有没有插件可以在上传到wordpress库的时候加上当前日期和文件名?Example:N... 查看详情

wordpress实现附件上传自动重命名但不改变附件标题

WordPress上传媒体文件时,默认会保持文件名不变。如果上传文件名中包含中文字符,则会造成部分浏览器显示的文件URL疑似乱码甚至无法访问。网上流行较广的是通过注册  wp_handle_upload_prefilter 过滤器实现,但是该方... 查看详情

wordpress相册插件nextgen-gallery不显示flash图片

wordpress相册插件nextgen-gallery不显示FLASH图片,哪位大侠能帮忙解答一下吗?我是按照http://www.xayo.cn/interest/nextgen-gallery/的教程去做的,已经把FLASH文件imagerotator.swf传到wp-content/uploads目录里了,可是回到网站前台一直都是显示加载... 查看详情

如何在将通用工件上传到jenkins管道中的jfrogartifactory时重命名现有文件夹(代码片段)

我正在使用jenkins管道。需要上传到Artifactory的文件夹以*.tar.gz格式生成。每次在Jenkins构建之后,文件夹名称保持不变,文件夹名称没有变化。对于通用Artifactory集成,我不想覆盖以前上传的*tar.gz。想知道tar.gz是否可以基于递增顺... 查看详情

Wordpress:在管理员选项页面中上传图片

】Wordpress:在管理员选项页面中上传图片【英文标题】:Wordpress:UploadImageinAdminOptionsPage【发布时间】:2014-05-1710:56:40【问题描述】:我正在开发我的第一个wordpress插件。它只需要允许用户更改自定义模板中的徽标和更改自定义模... 查看详情

在 Wordpress 中上传期间重命名文件

】在Wordpress中上传期间重命名文件【英文标题】:RenamefilesduringuploadwithinWordpress【发布时间】:2012-11-2422:33:51【问题描述】:我正在尝试重命名与帖子标题匹配的上传文件名。另一个线程显示如何重命名为哈希:Renamefilesduringuploa... 查看详情

修改dedecms图片上传路径命名规则的具体方法步骤

...理系统的图片附件是自动按日保存的,只有有图片或附近上传,就会一天生成一个文件夹,时间长了,就在allimg中就会生成大量的文件夹,对网站的转移和管理来说真的是很不方便呀! 所以在此我根据修改马海祥博客的方法... 查看详情

在拉取请求时重命名分支

】在拉取请求时重命名分支【英文标题】:Renamingabranchwhileonpullrequest【发布时间】:2013-11-2905:30:56【问题描述】:在Github上,您可以提出拉取请求以向项目添加功能。一个人的贡献必须在一个分支上,如果请求被接受,它将被合... 查看详情

wordpress上传过程中的文件重命名功能

】wordpress上传过程中的文件重命名功能【英文标题】:Filerenamingfunctionsinwordpressuploadprocess【发布时间】:2012-11-0413:59:23【问题描述】:我有一个脚本,它可以从预定义的数组中自动加载帖子,并将图像作为特色图像从本地计算机... 查看详情

Wordpress 在插件中选择和裁剪

】Wordpress在插件中选择和裁剪【英文标题】:Wordpressselectandcropinplugin【发布时间】:2015-06-1507:47:41【问题描述】:我需要在我的插件中上传图片并使用wp.media来完成这项任务。根据https://codex.wordpress.org/Javascript_Reference/wp.media它的... 查看详情

在没有 WordPress 插件的情况下重新生成缩略图

】在没有WordPress插件的情况下重新生成缩略图【英文标题】:RegeneratethumbnailswithoutaWordPressplugin【发布时间】:2021-08-0120:28:14【问题描述】:我正在开发我的第一个WordPress插件,并且我添加了新的图片尺寸,用户可以选择这些尺... 查看详情

WordPress插件上传安装

】WordPress插件上传安装【英文标题】:WordPressPluginuploadtoinstall【发布时间】:2020-07-0923:52:32【问题描述】:我正在使用带有PHP7.2、MySql和Apache2的LinuxMint19.1。我在我的LocalHost中安装了WordPress5.3.2。现在,当我尝试上传插件ZIP文件进... 查看详情

如何在wordpress插件中添加媒体上传器[重复]

】如何在wordpress插件中添加媒体上传器[重复]【英文标题】:Howtoaddthemediauploaderinwordpressplugin[duplicate]【发布时间】:2013-07-1404:23:13【问题描述】:我阅读了一些关于如何将媒体上传器集成到wordpress插件中的教程。我根据教程做媒... 查看详情

xampp中的Wordpress无法上传图片

】xampp中的Wordpress无法上传图片【英文标题】:Wordpressinxamppcannotuploadimages【发布时间】:2014-01-1613:19:35【问题描述】:我正在使用XAMPP处理我的wordpress项目。我无法上传图片。图片在上传文件夹中上传,但wordpress显示错误,告诉... 查看详情

注销时重命名文件

】注销时重命名文件【英文标题】:Renamingafileonlogout【发布时间】:2014-04-1201:41:08【问题描述】:我正在尝试用PHP重命名一个文件,但由于某种原因它不起作用,我是否必须在PHP下激活一些特殊权限?这是我的php文件代码<?phpi... 查看详情

在上传图片 wordpress 上更改图片名称

】在上传图片wordpress上更改图片名称【英文标题】:Changeimagenameonuploadimageswordpress【发布时间】:2014-05-0419:42:15【问题描述】:当我上传图片时,wordpress会将四个文件保存到服务器上(在settings->media中定义):1->thumbnailsize(15... 查看详情

wordpress概要

wordpress要安装EasyWPSMTP插件 并填写Smtp代理邮箱,才能让服务器发邮件安装wp-user-avatar用于对用户头像图片的配置,可运行用户自行上传图像JiaThis分享工具--插件,可以让文章分享到QQ 微博等 查看详情

dnmp(docker的lnmp)安装wordpress之后图片上传问题问题:图片上传大小问题解决和报错413requestentitytoolarge

首先是提示超过图片尺寸和大小,最后发现都是图片大小的问题,需要修改php的最大上传size修改之后查看php配置 已经生效 但是还是报错,提示返回不是合法的json, 查看控制台,报错是问题:413RequestEntityTooLarge 发现是Ng... 查看详情