让wordpress主题支持上传文件自动重命名

管理员
管理员
管理员
246
文章
27
评论
2018年9月6日14:42:55 评论 1,046 2982字

wordpress对于上传的文件默认不改变文件的原名称,有博主可能由于文件量大而不愿意逐个重命名文件,如果直接上传的话,可能会导致中文文件名的文件出现乱码或其它问题,而且附件保存在同一个目录,也可能导致文件名重复而被覆盖。有使用zblog、dedecms等程序的博主就知道,这些程序都会对上传的文件自动重命名,搜索发现可以通过修改wordpress源代码实现文件自动重命名,不过太麻烦且升级程序后又得重新修改不建议使用。让wordpress主题支持上传文件自动重命名

今天就推荐两段在上传媒体文件时自动重命名的代码。(ps:内嵌在主题的)

代码一,按时间重命名

上传文件时会以“年月日时分秒+自定义+0到100随机数”的格内容重命名文件。如“20180906062537rosa73.jpg”让wordpress主题支持上传文件自动重命名

//wordpress上传文件按时间重命名
function custom_upload_filter( $file ){
	$info = pathinfo($file['name']);
	$ext = $info['extension'];
	$filedate = date('YmdHis') . "" .'rosa'.rand(10,99);//为了避免时间重复,再加一段2位的随机数 rosa为可更改参数
	$file['name'] = $filedate.'.'.$ext;
	return $file;
}
add_filter('wp_handle_upload_prefilter', 'custom_upload_filter');

代码二,用MD5加密生成数字并重命名

名称规则是由系统自动生成的一个32位的MD5加密文件名,由于默认生成的32位文件名有点长,所以使用substr(md5($name), 0, 20) 截断将其设置为20位。让wordpress主题支持上传文件自动重命名

//wordpress上传文件用MD5加密生成数字并重命名
function rename_filename($filename) {
    $info = pathinfo($filename);
    $ext = empty($info['extension']) ? '' : '.' . $info['extension'];
    $name = basename($filename, $ext);
    return substr(md5($name), 0, 20) . $ext;
}
add_filter('sanitize_file_name', 'rename_filename', 10);

使用方法

将代码添加到当前主题functions.php模板文件中即可。

以上代码,很方便,节省时间。

其实也可在电脑上全选文件,按F2,然后直接输入字母或者数字,回车重命名的方法也很方便。

最后提一下通过修改wordpress源代码实现文件自动重命名

操作方法:

在wordpress程序的wp-admin/includes/目录中找到file.php文件,并进行编辑,在827行左右找到以下代码(实验版本4.9.8):

// Move the file to the uploads dir
$new_file = $uploads['path'] . "/$filename";

将其替换为:

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

其实就是替换掉了”/$filename”;

保存后覆盖原文件,那么上传文件就会以“年月日时分秒+千位毫秒整数”的格式重命名文件了,如“20180906122221765.jpg”

这几种方法都有自己的优缺点,一、二种缺点是每次更换主题的时候都要重新添加一次,适合不常更换主题模板的站点;优点当然是不受wordpress程序更新的影响!第三种缺点是每次wordpress程序更新后都要重新添加一次,适合常更换主题模板的站点;优点当然是不受主题更新的影响!

下面代码可直接在知更鸟Begin主题

在主题文件夹找到theme-setup.php(文件在wp-content\themes\begin\inc中);begin-options.php(文件在wp-content\themes\begin\inc\options中)两个文件。

首先在begin-options.php中添加:

    $options[] = array(
		'name' => __('重命名上传的图片文件'),
		'id' => 'zmingcx_upload_filter',
		'class' => 'be_ico',
		'std' => 'no',
		'type' => 'radio',
		'options' => array(
			'no' => __('默认'),
			'custom_upload_filter' => __('根据上传时间'),
			'rename_filename' => __('用MD5加密生成'),
		)
	);

	$options[] = array(
		'id' => 'clear'
	);

上面代码实现了在后台添加选项按钮,以实现可控操作;

然后在theme-setup.php中添加:

//重命名上传的图片文件
function custom_upload_filter( $file ){
	$info = pathinfo($file['name']);
	$ext = $info['extension'];
	$filedate = date('YmdHis') . "" .'begin'.rand(10,99);//为了避免时间重复,再加一段2位的随机数 begin为可更改参数
	$file['name'] = $filedate.'.'.$ext;
	return $file;
}
function rename_filename($filename) {
    $info = pathinfo($filename);
    $ext = empty($info['extension']) ? '' : '.' . $info['extension'];
    $name = basename($filename, $ext);
    return substr(md5($name), 0, 10) . $ext;
}
if (zm_get_option('no') !== 'no') :
	if (!zm_get_option('zmingcx_upload_filter') || (zm_get_option("zmingcx_upload_filter") == 'custom_upload_filter')) {
		add_filter('wp_handle_upload_prefilter', 'custom_upload_filter' );
	}

	if (zm_get_option('zmingcx_upload_filter') == 'rename_filename') {
		add_filter('sanitize_file_name', 'rename_filename', 10);
	}
endif;

上面代码实现了三种命名方式,1、文件原名,不做更改,2、根据上传时间重命名,3、用MD5加密生成新文件名;第三种MD5原本应为32位文件名,感觉有点长了所以改成10位了,若想修改的话请参考上文。

代码添加到文件最后就好(add_action( 'wp_enqueue_scripts', 'footerscript' );的后面);保存就可以上传到服务器了。

 

weinxin
扫码关注微信公众
幂彀社区,一个关注互联网、平面设计等领域个人博客;致力于打造一个优秀的资源共享学习平台。
教程 最后更新:2018-9-11
管理员
  • 本文由 发表于 2018年9月6日14:42:55
  • 转载请务必保留本文链接:https://www.teelm.com/2018/09/06/11654.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: