未选择文件时 WordPress 自定义文件上传被覆盖

WordPress custom file upload being overwritten on no file selection

我正在开发一个允许您在一个页面上上传多张图片的自定义主题。因为我有多个文件输入,所以我在 functions.php 文件中使用了这个函数(在每个文件输入的循环内):

register_setting('hero', 'slider_slide_' . $i . '_image',
function($option) use ($i) {
    if (!empty($_FILES['slider_slide_' . $i . '_image']['tmp_name'])) {
        $_FILES['slider_slide_' . $i . '_image']['name'] = 'slide_' . $i . '.png';
        $urls = wp_handle_upload($_FILES['slider_slide_' . $i . '_image'], array('test_form' => FALSE));
        $temp = $urls['url'];
        return $temp;
    }
    return $option; 
});

内联函数是我尝试过的唯一一种同时适用于多个文件的函数。无论哪种方式,我现在都面临着我的选项被覆盖的问题。上传后,该选项将在我的数据库中设置,并为图像设置正确的 link。但是,如果我稍后更改页面上的其他设置,由于没有上传任何内容,该选项将被空白字符串覆盖,尽管我在更新选项之前检查了文件是否为空。

理想情况下,我希望允许用户更改所有内容并检查文件上传以检查是否选择了任何内容,如果选择了,则上传并更新选项。

唯一的问题是,Wordpress 似乎正在处理选项的更新...

也没有抛出任何错误,所以我现在完全被难住了。

我假设 WP 仍在接收您的空文件输入,因此您需要 return 存储的值。

尝试类似的东西。

register_setting('hero', 'slider_slide_' . $i . '_image',
function($value, $option) use ($i) {
    if (empty($_FILES['slider_slide_' . $i . '_image']['tmp_name'])) {
        return get_option($option); 
    }

    $_FILES['slider_slide_' . $i . '_image']['name'] = 'slide_' . $i . '.png';
    $urls = wp_handle_upload($_FILES['slider_slide_' . $i . '_image'], array('test_form' => FALSE));

    return $urls['url'];
});

另一种方法是用存储的值填充 'slider_slide_' . $i . '_image' 输入。

Daniel G. 上面这个答案几乎已经解决了它,我不得不稍微调整一下,但是为了其他遇到这个问题的人,这里是我用来修复它的代码。

register_setting('hero', 'slider_slide_' . $i . '_image',
    function($option) use ($i) {
        if ($_FILES['slider_slide_' . $i . '_image']['error'] != 0) {
            return get_option('slider_slide_' . $i . '_image');
        }
        $_FILES['slider_slide_' . $i . '_image']['name'] = 'slide_' . $i . '.png';
        $urls = wp_handle_upload($_FILES['slider_slide_' . $i . '_image'],
                array(
                    'test_form' => FALSE,
                    'unique_filename_callback' => 'file_override_overwrite'
                )
        );
        $temp = $urls['url'];
        return $temp;
    }
);