如何覆盖wp_unique_filename逻辑

时间:2021-02-22 作者:Dan Brooking

我们遇到了一个问题,通过媒体上传工具上传图像有时会超时。使用NewRelic,我追踪到wp_unique_filename, 我想这是有道理的,因为我们有超过200000张图片。

我想我应该做的就是跳过这个,并自动生成一个哈希,以便在上传时将每个文件名附加到末尾。

似乎有一些不错的文档和相关问题,但我似乎无法将其付诸实施。我添加了调试日志以查看发生了什么,它始终调用原始功能。

我仍在思考过滤器以及它们如何与内置功能协同工作,因此我可能会犯一些非常简单的错误。

一个重要的警告是,我不是在这里进行自定义上传,而是通过WP媒体库进行上传。

尝试#1

add_filter( \'wp_unique_filename\', \'hash_filename\', 10, 4);

function hash_filename($filename, $ext, $dir, $unique_filename_callback)  {
  error_log(\'in hash_filename\');
  $new_filename = str_replace($ext, "", $filename);
  return $new_filename . "-" . md5(rand()) . $ext;
}
这仍然需要wp_unique_filename 然后打电话hash_filename. 我的日志如下所示:

[22-Feb-2021 15:07:07 UTC] in wp_unique_filename
[22-Feb-2021 15:07:07 UTC] in original wp_unique_filename logic
[22-Feb-2021 15:07:07 UTC] in hash_filename
尝试#2
function hash_filename($filename, $ext, $dir, $unique_filename_callback)  {
  error_log(\'in hash_filename\');
  $new_filename = str_replace($ext, "", $filename);
  return $new_filename . "-" . md5(rand()) . $ext;
}

$overrides = array(\'unique_filename_callback\' => \'hash_filename\' );
我的想法是如果我$overrides var,它会被media_handle_upload()wp_upload(). 我对这件事不是很有信心,因为我似乎错过了什么。它也不起作用。我的日志显示:

[22-Feb-2021 15:13:06 UTC] in wp_unique_filename
[22-Feb-2021 15:13:06 UTC] in original wp_unique_filename logic
我已经尝试了上述的其他变体,但我觉得我已经到了这样的地步,我只是在尝试一些没有意义的事情,希望一个能起作用。其他变化包括:

add_filter( \'unique_filename_callback\', \'hash_filename\' );
$overrides = array(\'test_form\' => false, \'unique_filename_callback\' => \'hash_filename\' );
apply_filters(\'wp_handle_upload\',$overrides);
// I felt this was promising but in looking up wp_handle_upload_overrides, it appears to not even be a thing? :(
$overrides = array(\'unique_filename_callback\' => \'hash_filename\' );
add_filter(\'wp_handle_upload_overrides\',$overrides);
有人能帮忙吗?

1 个回复
最合适的回答,由SO网友:Dan Brooking 整理而成

这并没有回答我遇到的具体问题,但确实解决了问题。我的问题是wp_unique_filename 当我们的媒体库中有更多图像时,时间越来越长。我们已经用年/月目录结构给它们命名了。

最后,我添加了一个过滤器,用以下代码将上载目录覆盖为年/月/日:

function upload_dir_filter($uploads)
{
    $day = date(\'d\');
    $uploads[\'path\'] .= \'/\' . $day;
    $uploads[\'url\']  .= \'/\' . $day;
    return $uploads;
}
add_filter(\'upload_dir\', \'upload_dir_filter\');
这解决了我们的问题。