WordPress用wp_handle_upload_prefilter实现中文命名图片重命名上传

2018-09-08 19:32 栏目:技术开发 查看(8828)

WordPress自带的上传图片程序最后保存的文件名是图片的原始文件名,而且在默认情况下,在windows服务器上是会出现上传失败的。如下图:

253

解决方案

其实网上也有类似的解决方案,这里只是解释一下,实现代码如下:

function wg_rename_upload_file_prefilter($file){
	$prefix=date("YmdHis").mt_rand(1,100);
	$file['name'] = $prefix.'.'.pathinfo($file['name'] , PATHINFO_EXTENSION);
	return $file;
}
add_filter('wp_handle_upload_prefilter', 'wg_rename_upload_file_prefilter');

把以上代码加在functions.php中,也可以做成一个插件。

为什么这么做?

首先,熟悉WordPress的都知道add_filter是用于过滤过滤器中的内容的,简单的说就是把原先默认的内容给“篡改”掉,当然是按照我们想要实现的意图篡改。那么为什么就用到了wp_handle_upload_prefilter这个过滤器呢?当然是需要一个简单的分析过程的,分析过程如下:

①、首先从后台添加媒体页面可以知道WordPress上传文件入口文件为wp-admin/media-upload.php,在里面可以看到使用do_action钩子添加了media_upload_xxx方法。

②、进一部分追踪我们可以发现调用的是wp-admin/includes/media.php中的media_handle_upload方法,在该方法中完成附件信息写入数据库,而上传的文件保存过程的代码这方法本身并没有,而是它调用另外的一个方法(wp_handle_upload)。

③、而wp_handle_upload来自wp-admin/includes/file.php,在该方法中我们可以看到有两个过滤器wp_handle_upload_prefilter和wp_handle_upload,前者就是可以修改来自文件全局变量的信息的,而后者则是修改返回信息的。

④、通过打印或者可以看到如下信息,其实跟全局变量类似,包含name、type、temp_name、size、error等,而name就是文件名,原始的文件名。而且后续在的操作是完全按照这个数值来进行操作的,所以我们应该替换掉这个信息。

QQ截图20180908192301

⑤、而在该方法中有如下代码,就是一个过滤器,我们可以过滤$file,我们可以把$file['name']改成其他的值,比如上面就是年月日时分秒然后加上一个1-100的正整数随机数作为新文件名,就这样就实现了文件重命名。

$file = apply_filters( 'wp_handle_upload_prefilter', $file );

替换后在该方法中打印$file,就变成了下面这样的了

QQ截图20180908192913

以上就是开头的解决方案的简单分析过程,如果你只是做运营而非做技术开发的朋友,那么请忽略下面的分析过程。

与我们的项目经理联系
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流

转载请注明出处:WordPress用wp_handle_upload_prefilter实现中文命名图片重命名上传 - 微构网络
分享: