在 WordPress 中,当用户上传一个包含中文文件名的附件(如图片、文档)时,WordPress 默认的 sanitize_file_name 函数会将其转换为拼音或移除中文字符,这可能导致文件链接难以辨识。有时,我们希望保留附件在媒体库中显示的中文标题,但实际存储在服务器上的文件名是经过重命名的(例如,使用时间戳+随机数),以避免潜在的编码问题和冲突。
解决方案:自定义文件名处理函数
通过 WordPress 的 sanitize_file_name 过滤器,我们可以自定义上传附件的重命名逻辑。以下是一个示例函数,它会在上传时自动将文件名重命名为“年月日时分秒+随机数.扩展名”的格式,同时不影响附件在媒体库中显示的标题。
// WordPress 实现附件上传自动重命名但不改变附件标题
function wp_custom_sanitize_file_name( $filename ) {
// 获取当前时间,格式:年月日时分秒
$time = date("YmdHis");
// 生成一个 1000 到 9999 之间的随机数
$random = mt_rand(1000, 9999);
// 获取文件扩展名
$extension = pathinfo($filename, PATHINFO_EXTENSION);
// 组合新文件名:时间 + 随机数 + 扩展名
return $time . "_" . $random . "." . $extension;
}
add_filter( 'sanitize_file_name', 'wp_custom_sanitize_file_name', 10, 1 );
代码说明
- 函数作用:此函数挂钩到
sanitize_file_name过滤器,在上传过程中对文件名进行处理。 - 文件名生成规则:新文件名由三部分组成:精确到秒的当前时间(如 20231015143022)、一个下划线、一个4位随机数以及原始文件的扩展名。例如:
20231015143022_1234.jpg。 - 保留标题:此函数仅修改存储在服务器上的物理文件名,不会影响 WordPress 媒体库中显示的“标题”、“说明”等元数据。您仍然可以为附件设置和保留中文标题。
- 优势:避免了中文文件名可能导致的服务器兼容性问题、URL编码混乱,同时通过时间戳和随机数确保了文件名的唯一性,防止覆盖。
使用方法
- 将上述代码添加到您当前主题的
functions.php文件末尾,或通过自定义插件添加。 - 保存文件后,新上传的附件将自动按新规则重命名。
- 请注意:此修改仅对之后上传的附件生效,已上传的文件名不会被更改。
扩展与注意事项
- 自定义命名规则:您可以根据需要修改
wp_custom_sanitize_file_name函数内的逻辑,例如使用用户ID、文章ID等作为文件名的一部分。 - SEO 考量:对于图片,重命名为无意义的字符串可能不利于图片SEO。如果SEO是首要考虑,可能需要更复杂的方案,例如将中文标题转换为英文关键词后再用于文件名。
- 调试:如果上传后出现问题,请检查服务器权限是否允许写入新命名的文件,并确保代码没有语法错误。