Функция media_handle_upload()
в WordPress предназначена для обработки загруженных файлов через форму, сохранения их в медиабиблиотеку и создания вложения для поста. Это удобный инструмент, когда требуется загружать файлы с фронтенда сайта и привязывать их к определенным постам или использовать в других целях.
media_handle_upload( string $file_id, int $post_id, array $post_data = array(), array $overrides = array('test_form' => false) ): int|WP_Error
Параметры:
$file_id
(строка) — обязательный. Индекс массива$_FILES
, где хранится информация о загружаемом файле.$post_id
(число) — обязательный. ID поста, к которому привязывается вложение. Если указать 0, файл будет загружен без привязки к посту.$post_data
(массив) — опциональный. Позволяет перезаписать данные создаваемого вложения, такие как заголовок, описание и другие метаданные.$overrides
(массив) — опциональный. Массив параметров для изменения поведения функции загрузки файла. Например, можно отключить проверку формы (test_form).
Возвращаемое значение:
- int — ID созданного вложения в случае успешной загрузки.
- WP_Error — объект ошибки, если загрузка не удалась.
Подключаемые файлы:
Для работы функции на фронтенде необходимо подключить несколько файлов:
require_once ABSPATH . 'wp-admin/includes/image.php';
require_once ABSPATH . 'wp-admin/includes/file.php';
require_once ABSPATH . 'wp-admin/includes/media.php';
Пример 1: Форма для загрузки изображения и обработка файла
Форма загрузки:
<form id="featured_upload" method="post" action="#" enctype="multipart/form-data">
<input type="file" name="custom_image_upload" id="custom_image_upload" />
<input type="hidden" name="post_id" id="post_id" value="123" />
<?php wp_nonce_field('custom_image_upload', 'custom_image_upload_nonce'); ?>
<input type="submit" value="Загрузить" />
</form>
Обработка загрузки:
if (
isset($_POST['custom_image_upload_nonce'], $_POST['post_id']) &&
wp_verify_nonce($_POST['custom_image_upload_nonce'], 'custom_image_upload') &&
current_user_can('edit_post', $_POST['post_id'])
) {
require_once(ABSPATH . 'wp-admin/includes/image.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/media.php');
// Выполняем загрузку файла
$attachment_id = media_handle_upload('custom_image_upload', $_POST['post_id']);
if (is_wp_error($attachment_id)) {
echo "Ошибка загрузки файла: " . $attachment_id->get_error_message();
} else {
echo "Файл успешно загружен!";
}
} else {
echo "Ошибка безопасности или недостаточно прав.";
}
Пример 2: Загрузка нескольких файлов
Для реализации множественной загрузки можно использовать атрибут multiple
в поле формы.
Форма загрузки:
<form method="post" enctype="multipart/form-data">
<input type="file" name="multi_attachments[]" multiple />
<input type="submit" value="Загрузить файлы" />
</form>
Обработка загрузки:
if (isset($_FILES['multi_attachments'])) {
require_once(ABSPATH . 'wp-admin/includes/image.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/media.php');
foreach ($_FILES['multi_attachments']['name'] as $key => $value) {
if ($_FILES['multi_attachments']['name'][$key]) {
$file = array(
'name' => $_FILES['multi_attachments']['name'][$key],
'type' => $_FILES['multi_attachments']['type'][$key],
'tmp_name' => $_FILES['multi_attachments']['tmp_name'][$key],
'error' => $_FILES['multi_attachments']['error'][$key],
'size' => $_FILES['multi_attachments']['size'][$key]
);
$_FILES['single_attachment'] = $file;
$attachment_id = media_handle_upload('single_attachment', 0);
if (is_wp_error($attachment_id)) {
echo "Ошибка загрузки файла: " . $attachment_id->get_error_message();
} else {
echo "Файл с ID {$attachment_id} загружен!";
}
}
}
}
Пример 3: Изменение поведения функции загрузки
В некоторых случаях может потребоваться изменить стандартное поведение функции wp_handle_upload()
, например, для добавления нестандартных проверок или изменения настроек. Это можно сделать через массив $overrides
.
Пример с изменением параметров:
$overrides = array(
'test_form' => false, // Отключаем проверку формы
'mimes' => array('jpg' => 'image/jpeg', 'png' => 'image/png') // Допустимые типы файлов
);
$attachment_id = media_handle_upload('custom_image_upload', 456, array(), $overrides);
if (is_wp_error($attachment_id)) {
echo "Ошибка загрузки файла: " . $attachment_id->get_error_message();
} else {
echo "Файл успешно загружен!";
}
Заключение
Функция media_handle_upload()
в WordPress предоставляет гибкий способ работы с загруженными файлами через формы на фронтенде. Она облегчает процесс загрузки и управления файлами, обеспечивая интеграцию с медиабиблиотекой и постами. Важно помнить о проверке безопасности и правильном подключении необходимых файлов для корректной работы функции.