Вопрос или проблема
Я гуглю уже несколько часов, но не могу найти решение своей проблемы:
Я создаю плагин и хочу встроить поле для загрузки файла на его админ-страницу. По этой причине я даю элементу формы атрибут 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
-
Отсутствие обработки формы: Если форма отправляется на ту же страницу без соответствующей обработки данных, то все значения могут не передаваться. Убедитесь, что перед отправкой формы у вас есть код, который обрабатывает данные после отправки.
-
Некорректный атрибут
action
: Если атрибутaction
в форме отсутствует или указывает на неправильную страницу, это может привести к тому, что данные не будут обработаны. Попробуйте указать полный путь к обработчику, например:<form action="<?php echo admin_url('admin.php?page=XYZ'); ?>" method="post" enctype="multipart/form-data">
-
Проблемы с правами доступа: Убедитесь, что у вашего веб-сервера есть необходимые права на запись в директорию, куда вы собираетесь загружать файлы.
-
Отсутствие необходимых хуков: В 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"
может показаться сложной, следуя вышеописанным рекомендациям, вы можете её легко решить. Убедитесь, что правильно настроены обработка данных и права на запись. Эта процедура обеспечит стабильную работу вашего плагина и корректное выполнение загрузки файлов.
Если возникнут дополнительные вопросы, пожалуйста, не стесняйтесь задавать их.