在 Wordpress 中上传期间重命名文件

Posted

技术标签:

【中文标题】在 Wordpress 中上传期间重命名文件【英文标题】:Rename files during upload within Wordpress 【发布时间】:2012-11-24 22:33:51 【问题描述】:

我正在尝试重命名与帖子标题匹配的上传文件名。

另一个线程显示如何重命名为哈希:Rename files during upload within Wordpress backend

使用此代码:

function make_filename_hash($filename) 
    $info = pathinfo($filename);
    $ext  = empty($info['extension']) ? '' : '.' . $info['extension'];
    $name = basename($filename, $ext);
    return md5($name) . $ext;

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

有人知道重命名文件以匹配 Post Title.extension 的代码吗?

【问题讨论】:

【参考方案1】:

barakadam 的回答几乎是正确的,只是根据我在他的回答下方留下的评论稍作修正。

function new_filename($filename, $filename_raw) 
    global $post;
    $info = pathinfo($filename);
    $ext  = empty($info['extension']) ? '' : '.' . $info['extension'];
    $new = $post->post_title . $ext;
    // the if is to make sure the script goes into an indefinate loop
    if( $new != $filename_raw ) 
        $new = sanitize_file_name( $new );
    
    return $new;

add_filter('sanitize_file_name', 'new_filename', 10, 2);

代码说明:

假设您将原始文件名为 picture one.jpg 的文件上传到名为“我在巴黎/伦敦的假期”的帖子中。

当您上传文件时,WordPress 会使用 sanitize_file_name() 函数从原始文件名中删除特殊字符。

函数的右下角是过滤器的位置。

// line 854 of wp-includes/formatting.php
return apply_filters('sanitize_file_name', $filename, $filename_raw);

此时,$filename 将是picture-one.jpg。因为我们使用了add_filter(),所以我们的new_filename() 函数将被调用,$filename 为picture-one.jpg,$filename_raw 为picture one.jpg

我们的 new_filename() 函数然后将文件名替换为附加原始扩展名的帖子标题。如果我们停在这里,新的文件名$new 最终会变成My Holiday in Paris/London.jpg,我们都知道这是一个无效的文件名。

这是我们再次调用 sanitize_file_name 函数的时候。注意那里的条件语句。由于此时$new != $filename_raw,它会再次尝试清理文件名。

sanitize_file_name() 将被调用,在函数结束时,$filename 将是 My-Holiday-in-Paris-London.jpg,而 $filename_raw 仍将是 My Holiday in Paris/London.jpg。由于apply_filters(),我们的new_filename() 函数再次运行。但这一次,因为$new == $filename_raw,就这样结束了。

My-Holiday-in-Paris-London.jpg 终于返回了。

【讨论】:

+1 好文章!如果同一个文件被上传两次会怎样? @brasofilo 你能看看这个场景吗? link global $post; 返回NULL,知道发生了什么吗?【参考方案2】:

这样的? (考虑到 $post 是你的 post 变量,让它成为全局变量):

function new_filename($filename) 
    global $post;
    $info = pathinfo($filename);
    $ext  = empty($info['extension']) ? '' : '.' . $info['extension'];
    return $post->post_title . $ext;

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

我听懂了吗?

【讨论】:

您想对帖子标题做一些事情,因为命名文件可能不安全。带有斜线的帖子标题肯定会破坏代码。是的,WordPress 会清理上传文件的文件名,但添加过滤器会覆盖它,您需要再次调用它。 core.trac.wordpress.org/browser/tags/3.4.2/wp-includes/…

以上是关于在 Wordpress 中上传期间重命名文件的主要内容,如果未能解决你的问题,请参考以下文章

WordPress 实现附件上传自动重命名但不改变附件标题

WordPress:如何在上传时使用当前日期重命名图像?

WordPress 使用工作缩略图重命名附件文件

wordpress上传图片时重命名--修改插件时遇到的一些问题

django如何给上传的图片重命名(给上传文件重命名)

如何在上传过程中重命名图像文件