WordPress上传中文名图片自动重命名二次开发

这几天用Wordpress搭建了一个图片站,在填充内容时遇到一个问题当我在媒体库中上传图片时有些图片可以正常显示,但是个别图片就是显示不出来缩略图,这个问题着实让我纠结了一下午。没办法查找原因少不了研究代码,默默的戴上眼镜勤奋工作吧!

图片不显示的原因

俗话说:“功夫不负苦心人呢”,问题还是被我给发现了,原来编码的问题如果我们上传的图片名称是中文的那么wp的缩略图机制处理不了于是就出现了我这样的问题。

在wp-admin/includes/file.php文件中有这么一段代码其中第2行控制着我们上传图片的命名:

// Move the file to the uploads dir
$new_file = $uploads[‘path’] . “/$filename”;  //新上传的图片按上传时的名称显示
if ( false === @ move_uploaded_file( $file[‘tmp_name’], $new_file ) ) {
if ( 0 === strpos( $uploads[‘basedir’], ABSPATH ) )
$error_path = str_replace( ABSPATH, ”, $uploads[‘basedir’] ) . $uploads[‘subdir’];
else
$error_path = basename( $uploads[‘basedir’] ) . $uploads[‘subdir’];
return $upload_error_handler( $file, sprintf( __(‘The uploaded file could not be moved to %s.’ ), $error_path ) );
}

既然定位到了问题所在当然就是赶紧解决掉好让图片正常显示了!

处理方法汇总
问题既然浮出了水面,按照一个度娘的忠实粉丝当然是先上百度去找答案,下面是百度查找到的3种答案。

第一种:修改wp的程序文件file.php

在file.php中查找下面这段代码

$new_file = $uploads['path'] . "/$filename";

把上述代码修改成

$new_file = $uploads['path'] . "/".date("YmdHis").floor(microtime()*1000).".".$ext;

显示的结果是以“年月日时分秒+千位毫秒整数”这样的格式命名的。

这 种方法弊端很大:第一上传的图片全部都会重命名;第二wp更新到新版本还要重新修改代码。

第二种:在主题functions.php中添加代码

function wpyou_rename_upload_file_prefilter($file){
$time=date("Y-m-d");
$file['name'] = $time."".mt_rand(1,100).".".pathinfo($file['name'] , PATHINFO_EXTENSION);
return $file;
}
add_filter('wp_handle_upload_prefilter', 'wpyou_rename_upload_file_prefilter');

实现的效果和第一种的结果是一样的,这样每次更新wp都不用再反复修改程序文件了,但是弊端还是有就是上传的图片全部都会重命名。

完美的解决方法

如果按照上面的方法修改的话我上传的图片都要被重命名对于我这种用云盘来存储图片的用户来说是个麻烦,于是只能自己动手了。下面给出一种完美的解决方案,当你上传图片时,主题会检测图片名中是否包含中文字符,如果包含就执行重命名的机制,如果不包含那么直接用上传的名称作为图片名,直接添加下面这段代码到主题的functions.php文件中即可。

function tin_custom_upload_name($file){
    if(preg_match('/[一-?]/u',$file['name'])):
    $ext=ltrim(strrchr($file['name'],'.'),'.');
    $file['name']=preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME'])).'_'.date('Y-m-d_H-i-s').'.'.$ext;
    endif;
    return $file;
}
add_filter('wp_handle_upload_prefilter','tin_custom_upload_name',5,1);

通过上面的代码片段中文图片不能显示缩略图的问题终于完美解决了。看来以后还是要研究一下wp程序的一些功能呀!今天把这种方法写到这里希望可以帮助到遇到跟我一样问题的朋友!

时间: 2025-01-25 01:07:08

WordPress上传中文名图片自动重命名二次开发的相关文章

jsp fckeditor 上传中文图片乱码问题的解决方法_网页编辑器

经过我修改ConnectorServlet.java和SimpleUploaderServlet.java两个文件,重新生成fckeditor-java-2.3.jar包,要解决所有的乱码问题,有3部要修改1.修改Web容器的字符编码,如果Web容器用的是Tomcat,则修改conf/server.xml文件,在两个Connector中添加"URIEncoding="utf-8"",我这里用的是utf-8编码,所以修改成utf-8,若项目是gb2312编码,则设置为

wordpress上传文件自动按日期更名

对于 WordPress 上传图片附件命名的问题,我个人是趋向于用规则重新给图片命名,这样方便后期图片的迁移和管理.周良博客 目前使用的图片附件命名方式是"人工智能...",就是自己手动修改图片的名称,和每篇文章的标题中英文相对.但这个方法对很多图片量很大的站点来说,太过于烦琐.所以周良这里给大家一个 WordPress小技巧,可以让WordpPress 上传图片的时候,自动根据日期时间修改图片地址名称. 我们可以通过下面的代码实现 方法一,插件形式  代码如下 复制代码 <?p

iframe里上传的图片地址自动写到文本框input里无显示

问题描述 内容页<inputname="banner"type="text"id="banner"size="40"><iframesrc="upload.asp"name=headwidth=370marginwidth=0height=21marginheight=0scrolling=noframeborder=0class="red"framespacing=0

WordPress上传中文附件乱码解决方法

熟悉PHP的朋友可能会很快解决问题,但不熟悉PHP代码的朋友看过此文章相信一定能解决你的问题,接下来就分享下我的解决wordpress上传中文文件名乱码的心得吧~: 找到/wp-admin/includes/file.php这个文件,并最如下修改:  代码如下 复制代码 function wp_handle_upload( &$file, $overrides = false, $time = null ) { //-. // Move the file to the uploads dir /

PHP自动重命名文件实现方法_php技巧

本文实例讲述了PHP自动重命名文件实现方法.分享给大家供大家参考.具体方法分析如下: PHP重命名文件名我们在实际开发过程中经常会使用到,比如用户上传文件或是一些缓存文件自动生成的功能我们都需要使用到自动重命名功能.但一般我们在制作上传文件时命名方式都是使用取系统当前时间加上随时数的方式在进行,这种方法固然可行但有时候并不能满足客户要需求.有些客户就要求我们的文件名命名方式要像windows系统一样自动流水编号,比如上传一个名字为"新建文本文档"当再有其它人上传一个文件名为"

php+CKFinder上传中文名文件乱码问题的解决方法

上传中文名文件乱码问题 在ckfinder/config.php中找到如下一段配置代码:    代码如下 复制代码 /* If you have iconv enabled (visit http://php.net/iconv for more information), you can use this directive to specify the encoding of file names in your system. Acceptable values can be found

用纯ASP代码实现图片上传并存入数据库中(二)

上传|数据|数据库 * GetChunk语法 返回大型文本或二进制数据 Field 对象的全部或部分内容 . variable = field.GetChunk( Size ) 返回值 返回变体型. 参数 Size 长整型表达式,等于所要检索的字节或字符数.说明 使用 Field 对象的 GetChunk 方法检索其部分或全部长二进制或字符数据.在系统内存有限的情况下,可使用 GetChunk 方法处理部分而非全部的长整型值. GetChunk 调用返回的数据将赋给"变量".如果 Si

Java调用命令实现视频上传过程中自动转换为flv格式并截图生成缩略图

//视频上传过程中自动转换为flv格式并截图生成缩略图(Java调用命令实现) import java.util.ArrayList; import java.util.List; public class VideoProcess { System.out.println(oldfilepath+"->"+newfilename+"- >"+newimg); List<String> commendF = new ArrayList<

oracle 10g在线重定义新特性:关联对象自动重命名(二)

9i的在线重定义存在一个问题,执行完在线重定义后,表的名称虽然保持不变,但是索引.约束.触发器等关联对象的名称会发生变化,有时候这会带来一定的问题,而要在事后手工修改,会比较麻烦. 10g的在线重定义解决这个问题.如果对象是利用COPY_TABLE_DEPENDENTS创建的,那么这些关联的对象在重定义操作完成后,自动改为原始的名称.如果是手工创建的关联对象,则可以利用REGISTER_DEPENDENT_OBJECT过程,所有执行了REGISTER_DEPENDENT_OBJECT过程的关联对