wordpress设置上传图片自动重命名方法分享:
在使用WordPress过程中,上传的图片、文件如果是中文名的话有时候可能或有一些奇怪的问题(这并不一定是WordPress的问题,可能是一些插件、主题之类的…),没有问题的情况下,修改默认的文件名,随机生成唯一的文件名也是有好处的,在某些站点下甚至还可以提高安全性,避免站点文件被爆破扫描下载。下面给大家分享几个自动重命名的功能代码和修改程序源代码实现的方式的,可以根据自己的需求去选择。
方法一:使用功能代码 推荐
自动重命名代码一:按按时间重命名
上传文件时会以“年月日时分秒_id”的格式重命名文件,如“20240105092139_6597ca23178de.jpg”
// 重命名WordPress上传的文件
function rename_uploaded_file($file) {
$time = date("YmdHis");
$unique_id = uniqid(); // 使用uniqid()函数生成唯一标识符
$file_extension = pathinfo($file['name'], PATHINFO_EXTENSION);
$file['name'] = $time . "_" . $unique_id . "." . $file_extension;
return $file;
}
add_filter('wp_handle_upload_prefilter', 'rename_uploaded_file');
函数详细解释
function rename_uploaded_file($file) {...}
:- 定义了一个名为
rename_uploaded_file
的函数,这个函数接收一个参数$file
,这个参数是一个数组,包含了上传文件的信息。
- 定义了一个名为
$time = date("YmdHis");
:- 这行代码获取当前的日期和时间,格式为”年月日时分秒”。
$unique_id = uniqid();
:- 这行代码使用
uniqid()
函数生成一个唯一标识符。
- 这行代码使用
$file_extension = pathinfo($file['name'], PATHINFO_EXTENSION);
:- 这行代码使用
pathinfo
函数获取文件的扩展名,并将其存储在变量$file_extension
中。
- 这行代码使用
$file['name'] = $time . "_" . $unique_id . "." . $file_extension;
:- 这行代码将文件名更改为当前的日期和时间,后面跟着一个下划线,然后是唯一标识符,最后是文件的扩展名。
return $file;
:- 这行代码返回修改后的文件信息。
add_filter('wp_handle_upload_prefilter', 'rename_uploaded_file');
:- 这行代码将
rename_uploaded_file
函数添加到WordPress的wp_handle_upload_prefilter
过滤器。这个过滤器在文件上传之前被应用,允许你修改文件的属性。
- 这行代码将
PHP的uniqid()函数简介
PHP的uniqid()函数用于生成一个唯一的ID。这个函数基于当前的微秒时间戳生成一个唯一的字符串。这个函数通常用于生成数据库记录的唯一键,或者用于生成临时文件名。
自动重命名代码二:用MD5加密生成数字并重命名
在上传文件时,将文件名更改为基于当前时间和原始文件名的MD5哈希的格式。
function rename_filename($filename) {
$info = pathinfo($filename);
$ext = empty($info['extension']) ? '' : '.' . $info['extension'];
$name = basename($filename, $ext);
$time = date("YmdHis"); // 获取当前时间
return $time . "_" . substr(md5($name), 0, 10) . $ext; // 文件名包含时间和基于原始文件名的MD5哈希的前10个字符
}
add_filter('sanitize_file_name', 'rename_filename', 10);
函数详细解释
function rename_filename($filename) {...}
:- 定义了一个名为
rename_filename
的函数,这个函数接收一个参数$filename
,这个参数是上传文件的原始文件名。
- 定义了一个名为
$info = pathinfo($filename);
:- 这行代码使用
pathinfo
函数获取文件名的路径信息,包括目录名、基本名、扩展名等,并将这些信息存储在数组$info
中。
- 这行代码使用
$ext = empty($info['extension']) ? '' : '.' . $info['extension'];
:- 这行代码检查
$info
数组中的'extension'
元素是否为空。如果为空,就将$ext
设置为空字符串,否则将$ext
设置为文件的扩展名,前面加上一个点。
- 这行代码检查
$name = basename($filename, $ext);
:- 这行代码获取文件的基本名,也就是除去扩展名的部分。
$time = date("YmdHis");
:- 这行代码获取当前的日期和时间,格式为”年月日时分秒”。
return $time . "_" . substr(md5($name), 0, 10) . $ext;
:- 这行代码将文件名更改为当前的日期和时间,后面跟着一个下划线,然后是原始文件名的MD5哈希的前10个字符,最后是文件的扩展名。
add_filter('sanitize_file_name', 'rename_filename', 10);
:- 这行代码将
rename_filename
函数添加到WordPress的sanitize_file_name
过滤器。这个过滤器在文件上传时被应用,允许你修改文件的名称。这里的10
是函数的优先级。
- 这行代码将
自动重命名代码三:中文图片自动重命名
当你上传图片时,主题会检测图片名中是否包含中文字符,如果包含就执行重命名的机制,如果不包含那么直接用上传的名称作为图片名
function rename_uploaded_file($file){
if(preg_match('/[\x{4e00}-\x{9fa5}]/u', $file['name'])):
$ext = pathinfo($file['name'], PATHINFO_EXTENSION);
$file['name'] = date('Y-m-d_H-i-s') . '.' . $ext;
endif;
return $file;
}
add_filter('wp_handle_upload_prefilter', 'rename_uploaded_file', 5, 1);
函数详细解释
function rename_uploaded_file($file){...}
:- 定义了一个名为
rename_uploaded_file
的函数,这个函数接收一个参数$file
,这个参数是一个数组,包含了上传文件的信息。
- 定义了一个名为
if(preg_match('/[\x{4e00}-\x{9fa5}]/u', $file['name'])):
:- 这行代码使用正则表达式
'/[\x{4e00}-\x{9fa5}]/u'
检查文件名$file['name']
是否包含中文字符。如果包含,就执行后面的代码。
- 这行代码使用正则表达式
$ext = pathinfo($file['name'], PATHINFO_EXTENSION);
:- 这行代码获取文件的扩展名,并将其存储在变量
$ext
中。
- 这行代码获取文件的扩展名,并将其存储在变量
$file['name'] = date('Y-m-d_H-i-s') . '.' . $ext;
:- 这行代码将文件名更改为当前的日期和时间,格式为”年-月-日_时-分-秒”,然后加上原始的文件扩展名。
return $file;
:- 这行代码返回修改后的文件信息。
add_filter('wp_handle_upload_prefilter', 'rename_uploaded_file', 5, 1);
:- 这行代码将
rename_uploaded_file
函数添加到WordPress的wp_handle_upload_prefilter
过滤器。这个过滤器在文件上传之前被应用,允许你修改文件的属性。这里的5
是函数的优先级,1
是函数接收的参数数量。
- 这行代码将
使用方法
建议你使用WPCode插件,然后把功能代码添加进行,关于WPCode插件的详细介绍可以我这篇文章:WordPress代码片段插件 WPCode。
也可以将代码添加到当前主题functions.php
模板文件中。
方法二:修改源程序文件 – 不推荐!
操作方法:
在wordpress程序的wp-admin/includes/目录中找到file.php文件,并进行编辑,在327行左右找到以下代码:
// Move the file to the uploads dir
$new_file = $uploads['path'] . "/$filename";
if ( false === @ move_uploaded_file( $file['tmp_name'], $new_file ) )
return $upload_error_handler( $file, sprintf( __('The uploaded file could not be moved to %s.' ), $uploads['path'] ) );
将其替换为
// Move the file to the uploads dir
$new_file = $uploads['path'] . "/".date("YmdHis").floor(microtime()*1000).".".$ext;
if ( false === @ move_uploaded_file( $file['tmp_name'], $new_file ) )
return $upload_error_handler( $file, sprintf( __('The uploaded file could not be moved to %s.' ), $uploads['path'] ) );
PS:整体代码其实就是替换掉了”/$filename”;
保存后覆盖原文件,那么上传文件就会以“年月日时分秒+千位毫秒整数”的格式重命名文件了,如“20121023122221765.jpg”
来源:https://www.boke8.net/auto-rename.html
注意事项
如果是修改的主题函数模板方式,在更新主题后,自己添加的代码,一般是会覆盖的,所以升级主题可以先做好备份。
如果是修改的程序源文件,升级程序后,程序升级后也是会被覆盖,也要做好备份。修改程序的方式通常是不推荐的,小白的话还容易搞出问题。
以上方法请选择一种就好了。