在WordPress后台上传时重命名文件

17

WordPress 3.0 后台上传过程中是否有一种方法可以重命名文件?我想要对文件进行一致的命名,尤其是对于图片。

我认为对原始文件名进行使用 12 (+-) 位数字哈希值或类似的方式进行命名将非常棒。有什么建议吗?

问候

6个回答

35

但在上传文件之前这样做会更容易。

不太确定 - 这似乎很容易;

/**
 * @link https://dev59.com/PHA75IYBdhLWcg3wf5RV#3261107
 */
function so_3261107_hash_filename( $filename ) {
    $info = pathinfo( $filename );
    $ext  = empty( $info['extension'] ) ? '' : '.' . $info['extension'];
    $name = basename( $filename, $ext );

    return md5( $name ) . $ext;
}

add_filter( 'sanitize_file_name', 'so_3261107_hash_filename', 10 );

该过滤器会创建一个32个字符的哈希值,保留文件扩展名。如果您想缩短它,可以使用substr()函数。

该过滤器在文件被上传到服务器上的临时目录后运行,但在调整大小(如果适用)并保存到上传文件夹之前运行。

请注意,不会发生文件覆盖的风险 - 如果新哈希文件与已存在的文件相同,WordPress会尝试将增量数字追加到文件名中,直到没有冲突为止。

WordPress插件

<?php

/**
 * Plugin Name: Hash Upload Filename
 * Plugin URI:  https://dev59.com/PHA75IYBdhLWcg3wf5RV
 * Description: Rename uploaded files as the hash of their original.
 * Version:     0.1
 */

/**
 * Filter {@see sanitize_file_name()} and return an MD5 hash.
 *
 * @param  string $filename
 * @return string
 */
function so_3261107_hash_filename( $filename ) {
    $info = pathinfo( $filename );
    $ext  = empty( $info['extension'] ) ? '' : '.' . $info['extension'];
    $name = basename( $filename, $ext );

    return md5( $name ) . $ext;
}

add_filter( 'sanitize_file_name', 'so_3261107_hash_filename', 10 );

谢谢TheDeadMusic,我也考虑过类似的事情。但是希望有一个现成的插件或者易于定制的东西,因为我不是编写WordPress插件或钩子的专家,但我会尝试一下。此外,感谢您的建议。Stackoverflow上的牛人们真棒 :) - gearsdigital
3
我对我的回答进行了更新 - 将代码保存在一个名为hash-upload.php的文件中,然后将其放入您的插件文件夹 :) - TheDeadMedic
多么棒啊!我真的很兴奋 :) 目前我已经自己找到了一个解决方案。我已经定制了上传+插件,也可以工作。但是你的解决方案更加优雅,而且开销更小。非常感谢TheDeadMedic(不是TheDeadMusic-抱歉)。我再次无法投票! - gearsdigital
我在这里提问->http://stackoverflow.com/questions/3265350/change-wordpress-gallery-shortcode-slug-to-filename。为什么它不改变post_name呢?如果我将插件优先级设置为1,情况也是一样的。 - gearsdigital

10

http://wpapi.com/change-image-name-to-wordpress-post-slug-during-upload/

顺便说一句:

sanitize_file_name添加过滤器是完全错误的,因为sanitize_file_name()函数是一个帮助格式化字符串的辅助函数,它可能在其他地方被使用,比如插件或主题。

function wp_modify_uploaded_file_names($file) {
    $info = pathinfo($file['name']);
    $ext  = empty($info['extension']) ? '' : '.' . $info['extension'];
    $name = basename($file['name'], $ext);

    $file['name'] = uniqid() . $ext; // uniqid method
    // $file['name'] = md5($name) . $ext; // md5 method
    // $file['name'] = base64_encode($name) . $ext; // base64 method

    return $file;
}

add_filter('wp_handle_upload_prefilter', 'wp_modify_uploaded_file_names', 1, 1);

5

3

我也实现了同样的功能,但我想要一个比原来更随机的文件名,因为我使用这个功能的网站只是用于图片,而且所有文件都在同一个目录下。

我采用了以下方法:

return md5($ip . uniqid(mt_rand(), true)) . $ext;

2
我一直在寻找一个能够很好地完成这项任务的插件,最终我决定自己开发了一个。你可以在我的博客上获取它:http://www.meow.fr/media-file-renamer!如果你使用了它,请给我反馈 :) 我真诚地希望它能对你有所帮助!

0

使用媒体库功能无法自动重命名文件。建议在上传文件之前先将其重命名。即使上传了文件,也只能通过FTP而非WordPress进行重命名。

唯一的方法是使用插件将其钩入媒体库上传过程中。但最好还是在上传文件之前进行重命名,这样会更容易些。


谢谢您的评论!我知道我不能使用媒体库功能重命名它。这就是为什么我要问的原因 :)对于这个项目来说,在上传进度中完成会更容易。这是一个针对不太熟悉批量重命名和FTP的人们的可用性功能。 - gearsdigital

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接