Административная страница: форма с enctype=”multipart/form-data” не передает свои данные

Вопрос или проблема

Я гуглю уже несколько часов, но не могу найти решение своей проблемы:

Я создаю плагин и хочу встроить поле для загрузки файла на его админ-страницу. По этой причине я даю элементу формы атрибут enctype="multipart/form-data" и пытаюсь получить доступ к файлу через $_FILES, но он пуст! То же самое с $_POST.

Без enctype="multipart/form-data" по крайней мере имя файла и другие поля формы появляются в $_POST.

Мне интересно, не удаляет ли WordPress прямой доступ к этим суперглобальным переменным или каким-то образом не предотвращает обычный способ загрузки файлов.

Я много читал о хуках и отправке всех форм на admin_post.php или admin_ajax.php, но поскольку моя функция загрузки находится в классе, который является частью большой библиотеки с автозагрузкой и т.д., это не вариант для меня. Моя форма отправляет свои данные на текущую админ-страницу (я пробовал без атрибута action, но также указывая его action="admin.php?page=XYZ", но ничто не сработало).

Я буду благодарен за любые подсказки!

Если вы хотите загрузить файл в пользовательскую папку, вы можете использовать следующую функцию. Добавьте эту функцию в файл functions.php

function upload_user_file( $file = array(),$path ) {
    if(!empty($file)) 
    {


        $upload_dir=$path;
        $uploaded=move_uploaded_file($file['tmp_name'], $upload_dir.$file['name']);
        if($uploaded) 
        {
            echo "файл загружен успешно ";

        }else
        {
            echo "произошла ошибка при загрузке "; print_r($file['error']);  
        }
    }

}

Создайте форму в вашем шаблонном файле так:

<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" name="upload">
</form>

Вызовите функцию загрузки в шаблонном файле, как и перед функцией get_header():

if(isset($_POST['upload']))
    {

       if( ! empty( $_FILES ) ) 
       {
          $file=$_FILES['file'];   // массив файла
          $upload_dir=wp_upload_dir();
          $path=$upload_dir['basedir'].'/myuploads/';  // папка для загрузки.
          if(!is_dir($path)) { mkdir($path); }
          $attachment_id = upload_user_file( $file ,$path);

       }
    }

Ответ или решение

При разработке плагина для WordPress нередко возникает необходимость загрузки файлов через админскую панель. В таком случае важно правильно настроить форму с атрибутом enctype="multipart/form-data", но, к сожалению, часто разработчики сталкиваются с проблемами, когда данные формы не передаются. Рассмотрим возможные причины данной проблемы и способы её решения.

Причины пустых массивов $_FILES и $_POST

  1. Отсутствие обработки формы: Если форма отправляется на ту же страницу без соответствующей обработки данных, то все значения могут не передаваться. Убедитесь, что перед отправкой формы у вас есть код, который обрабатывает данные после отправки.

  2. Некорректный атрибут action: Если атрибут action в форме отсутствует или указывает на неправильную страницу, это может привести к тому, что данные не будут обработаны. Попробуйте указать полный путь к обработчику, например:

    <form action="<?php echo admin_url('admin.php?page=XYZ'); ?>" method="post" enctype="multipart/form-data">
  3. Проблемы с правами доступа: Убедитесь, что у вашего веб-сервера есть необходимые права на запись в директорию, куда вы собираетесь загружать файлы.

  4. Отсутствие необходимых хуков: В WordPress нужно использовать хуки (admin_post или admin_ajax) для передачи данных. Если вы не используете их, данные могут не передаваться должным образом.

Решение проблемы с загрузкой файлов

Ниже приведён пошаговый алгоритм, который поможет вам правильно настроить форму и функцию загрузки файлов.

Шаг 1: Создайте форму для загрузки файлов

Создайте HTML-форму с необходимыми атрибутами:

<form action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>" method="post" enctype="multipart/form-data">
    <input type="file" name="file" required>
    <input type="submit" name="upload" value="Загрузить">
</form>

Шаг 2: Обработка данных формы

Добавьте следующий код в файл вашего плагина или функции темы:

if (isset($_POST['upload'])) {
    if (!empty($_FILES['file'])) {
        $file = $_FILES['file'];
        // Проверьте, была ли ошибка при загрузке файла
        if ($file['error'] === UPLOAD_ERR_OK) {
            $upload_dir = wp_upload_dir()['basedir'] . '/myuploads/';
            if (!is_dir($upload_dir)) {
                mkdir($upload_dir, 0755, true);
            }
            $move_file = move_uploaded_file($file['tmp_name'], $upload_dir . basename($file['name']));
            if ($move_file) {
                echo "Файл загружен успешно!";
            } else {
                echo "Ошибка при загрузке файла.";
            }
        } else {
            echo "Ошибка при загрузке файла: " . $file['error'];
        }
    } else {
        echo "Нет файла для загрузки.";
    }
}

Шаг 3: Проверьте права доступа

Убедитесь, что папка, в которую вы хотите загрузить файлы, существует и имеет необходимые права доступа. Это нужно сделать для успешного выполнения функции move_uploaded_file.

Заключение

Хотя проблема с загрузкой файлов через форму с атрибутом enctype="multipart/form-data" может показаться сложной, следуя вышеописанным рекомендациям, вы можете её легко решить. Убедитесь, что правильно настроены обработка данных и права на запись. Эта процедура обеспечит стабильную работу вашего плагина и корректное выполнение загрузки файлов.

Если возникнут дополнительные вопросы, пожалуйста, не стесняйтесь задавать их.

Оцените материал
Добавить комментарий

Капча загружается...