Пользовательская загрузка файла WordPress перезаписывается при отсутствии выбора файла - PullRequest
0 голосов
/ 12 июля 2020

Я работаю над специальной темой, которая позволяет загружать несколько изображений на одну страницу. Поскольку у меня есть несколько файловых входов, я использую эту функцию в моем functions.php файле (внутри al oop для каждого входного файла):

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; 
});

Встроенная функция - единственное, что я пробовал работает с несколькими файлами одновременно. В любом случае, теперь я столкнулся с проблемой перезаписи моих опций. После загрузки опция устанавливается в моей базе данных с правильной ссылкой на изображение. Однако, если я позже изменю другие настройки на странице, поскольку ничего не загружается, параметр будет перезаписан пустой строкой, несмотря на то, что я проверяю, не является ли файл пустым перед обновлением параметра.

В идеале я бы например, разрешить пользователю изменять все и вся и проверять загрузку файла, чтобы проверить, выбрано ли что-нибудь, и если да, загрузите и обновите параметр.

Единственная проблема в том, что Wordpress, похоже, занимается обновлением вариантов ...

Ошибок тоже не возникает, так что сейчас я в тупике.

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Я предполагаю, что WP все еще получает ваши входные данные пустого файла, поэтому вам нужно вернуть сохраненное значение.

Попробуйте что-нибудь в этом роде.

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' ввод с сохраненным значением.

0 голосов
/ 23 июля 2020

Дэниел Г. выше этот ответ в значительной степени решил это, мне пришлось немного его отрегулировать, но ради всех, у кого есть эта проблема, вот код, который я использовал для ее исправления.

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;
    }
);
...