继续折腾Wordpress,这次的问题是中文附件。Wordpress不支持中文文件名,如果上传的附件是中文文件名,就会显示乱码,导致附件不可用。解决这个问题的方法有很多,我这里总结一下。
1、修改系统文件:wp-admin/includes/file.php
搜索这一句:
return apply_filters( 'wp_handle_upload', array( 'file' => $new_file, 'url' => $url, 'type' => $type ), 'upload' );
修改为:
return apply_filters( 'wp_handle_upload', array( 'file' => $uploads['path'] . "/$filename", 'url' => $url, 'type' => $type ) , 'upload');
类似上面这种,还有一个修改file.php文件指定编码方式的方法,这里就不在列出了,不同的版本file.php代码差异较大,4.2.2版本的Wordpress这个函数已经改掉了,这种照葫芦画瓢的修改方法已经无效。另外,我个人不建议这种修改方法,因为需要修改系统文件,二Wordpress又是经常升级的,每升级一次就要重新修改一次,很麻烦。
2、修改主题的function.php文件
推荐这种修改方法,因为我们一旦选定一个主题,轻易是不会更换的,所以尽管Wordpress经常升级,却一般影响不到我们的主题。
常用的方法有MD5法和上传时间重命名法。
下面举个MD5法的例子,将这段代码添加到主题的function.php文件中:
function upload_file($filename) {
$parts = explode('.', $filename);
$filename = array_shift($parts);
$extension = array_pop($parts);
foreach ( (array) $parts as $part)
$filename .= '.' . $part;
if(preg_match('/[一-龥]/u', $filename)){
$filename = md5($filename);
}
$filename .= '.' . $extension;
return $filename ;
}
add_filter('sanitize_file_name', 'upload_file', 5,1);
只要上传的文件名中包含中文,就自动用MD5值重命名这个文件,而英文文件名则保持原状。这种方法可以完美解决中文附件乱码的问题,但不足之处是MD5值太长了,所以在此代码的基础上又有截取前若干个字符的变通方法,代码大家自行寻找就是。另外,我觉得这种方法还有个缺点,需要先计算MD5值才能重命名,多多少少会占用系统资源,不够“绿色”。
下面推荐上传时间重命名法,将下面代码添加到主题的function.php文件中:
function mayicun_wp_handle_upload_prefilter($file){ $time=date("Ymdhis"); $file['name'] = $time."".mt_rand(1,100).".".pathinfo($file['name'] , PATHINFO_EXTENSION); return $file; } add_filter('wp_handle_upload_prefilter', 'mayicun_wp_handle_upload_prefilter');
不管上传什么附件,一律重命名为日期时间+随机字符,无需计算MD5,所有文件名都用同一种命名方式,简直是强迫症福音啊,呵呵。
高海鹏老师的博客
![[剁手]教师上课必备神器:小蜜蜂扩音器 券后低至9.9元包邮-高海鹏老师的博客](https://www.gaohaipeng.com/wp-content/uploads/2020/04/25b2916b5c49db6-220x150.jpg)
![[剁手]英雄钢笔359款送24支墨囊+刻字-高海鹏老师的博客](https://www.gaohaipeng.com/wp-content/uploads/2018/02/0483338c10e1978-220x150.jpg)
![[剁手]教师必备神器,激光翻页笔券后低至17.9元包邮-高海鹏老师的博客](https://www.gaohaipeng.com/wp-content/uploads/2018/02/127d02206107009-220x150.jpg)
