Загрузка файлов — одна из важных функций для многих сайтов на WordPress. Несмотря на то, что есть множество готовых плагинов, иногда требуется создать собственное решение, которое будет идеально подходить под конкретные задачи и требования. В этой статье мы подробно рассмотрим, как создать собственный плагин для загрузки файлов в WordPress, включая настройку формы, обработку загрузки, проверки безопасности и сохранение файлов.
Почему стоит создавать собственный плагин загрузки файлов
Стандартные решения, такие как Contact Form 7 с плагинами для загрузки, или популярные плагины для медиа, не всегда подходят. Иногда нужно:
- Ограничить типы файлов и размер;
- Сохранять файлы в нестандартные папки;
- Добавить мета-данные к загружаемым файлам;
- Встроить загрузку в фронтенд сайта;
- Обеспечить дополнительную безопасность и контроль.
Собственный плагин позволяет полностью контролировать процесс и интегрировать загрузку с вашей бизнес-логикой.
Создаем базовый плагин для загрузки файлов
Для начала создадим структуру плагина WPUpload_Custom_Upload:
<?php
/*
Plugin Name: WPUpload Custom Upload
Description: Плагин для загрузки файлов с фронтенда.
Version: 1.0
Author: WPUpload
*/
// Хук для добавления шорткода
add_shortcode('wpupload_form', 'wpupload_custom_upload_form');
// Функция вывода формы
function wpupload_custom_upload_form() {
if ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_FILES['wpupload_file']['name'])) {
return wpupload_handle_file_upload();
}
$form = '<form method="post" enctype="multipart/form-data">';
$form .= '<input type="file" name="wpupload_file" required /><br/>';
$form .= '<input type="submit" value="Загрузить файл" />';
$form .= '</form>';
return $form;
}
// Функция обработки загрузки
function wpupload_handle_file_upload() {
if (!function_exists('wp_handle_upload')) {
require_once(ABSPATH . 'wp-admin/includes/file.php');
}
$uploadedfile = $_FILES['wpupload_file'];
$upload_overrides = array('test_form' => false);
// Проверка типа файла и размера добавим позже
$movefile = wp_handle_upload($uploadedfile, $upload_overrides);
if ($movefile && !isset($movefile['error'])) {
return '<p>Файл успешно загружен: <a href="'.esc_url($movefile['url']).'" target="_blank">Ссылка</a></p>';
} else {
return '<p>Ошибка загрузки файла: '.esc_html($movefile['error']).'</p>';
}
}
?>Этот код создает шорткод [wpupload_form], который можно вставить в любую страницу или пост. На фронтенде отобразится простая форма загрузки файлов, которые будут сохранены в стандартной папке WordPress uploads.
Добавляем проверку типа и размера загружаемых файлов
Чтобы обезопасить сайт и контролировать загрузки, важно ограничить допустимые типы файлов и максимальный размер. Например, разрешим только изображения и PDF, размер до 5 МБ.
function wpupload_handle_file_upload() {
if (!function_exists('wp_handle_upload')) {
require_once(ABSPATH . 'wp-admin/includes/file.php');
}
$uploadedfile = $_FILES['wpupload_file'];
// Проверяем размер
$max_size = 5 * 1024 * 1024; // 5 МБ
if ($uploadedfile['size'] > $max_size) {
return '<p>Ошибка: размер файла превышает 5 МБ.</p>';
}
// Разрешенные форматы
$allowed_types = array('image/jpeg', 'image/png', 'application/pdf');
if (!in_array($uploadedfile['type'], $allowed_types)) {
return '<p>Ошибка: недопустимый тип файла. Разрешены JPG, PNG, PDF.</p>';
}
$upload_overrides = array('test_form' => false);
$movefile = wp_handle_upload($uploadedfile, $upload_overrides);
if ($movefile && !isset($movefile['error'])) {
return '<p>Файл успешно загружен: <a href="'.esc_url($movefile['url']).'" target="_blank">Ссылка</a></p>';
} else {
return '<p>Ошибка загрузки файла: '.esc_html($movefile['error']).'</p>';
}
}Так мы защитим сайт от нежелательных и слишком больших файлов.
Сохраняем информацию о загруженных файлах в базе данных
Иногда важно не только загрузить файл, но и сохранить данные о нем для дальнейшей обработки или отображения. Для этого можно создать отдельную таблицу или использовать мета-данные.
Для простоты добавим запись в пользовательские мета-данные текущего пользователя (если он авторизован) с URL загруженного файла:
function wpupload_handle_file_upload() {
if (!function_exists('wp_handle_upload')) {
require_once(ABSPATH . 'wp-admin/includes/file.php');
}
$uploadedfile = $_FILES['wpupload_file'];
$max_size = 5 * 1024 * 1024;
if ($uploadedfile['size'] > $max_size) {
return '<p>Ошибка: размер файла превышает 5 МБ.</p>';
}
$allowed_types = array('image/jpeg', 'image/png', 'application/pdf');
if (!in_array($uploadedfile['type'], $allowed_types)) {
return '<p>Ошибка: недопустимый тип файла.</p>';
}
$upload_overrides = array('test_form' => false);
$movefile = wp_handle_upload($uploadedfile, $upload_overrides);
if ($movefile && !isset($movefile['error'])) {
// Сохраняем ссылку в мета данных пользователя
$user_id = get_current_user_id();
if ($user_id) {
$files = get_user_meta($user_id, 'wpupload_files', true);
if (!is_array($files)) {
$files = array();
}
$files[] = $movefile['url'];
update_user_meta($user_id, 'wpupload_files', $files);
}
return '<p>Файл успешно загружен: <a href="'.esc_url($movefile['url']).'" target="_blank">Ссылка</a></p>';
} else {
return '<p>Ошибка загрузки файла: '.esc_html($movefile['error']).'</p>';
}
}Это позволит пользователям видеть загруженные ими файлы и использовать эту информацию дальше.
Расширяем функционал: вывод списка загруженных файлов пользователя
Чтобы пользователю видеть свои загруженные файлы, создадим отдельный шорткод [wpupload_user_files], который выведет список ссылок:
add_shortcode('wpupload_user_files', 'wpupload_show_user_files');
function wpupload_show_user_files() {
$user_id = get_current_user_id();
if (!$user_id) {
return '<p>Пожалуйста, войдите, чтобы увидеть свои файлы.</p>';
}
$files = get_user_meta($user_id, 'wpupload_files', true);
if (empty($files)) {
return '<p>Вы еще не загружали файлы.</p>';
}
$output = '<ul>';
foreach ($files as $file_url) {
$output .= '<li><a href="'.esc_url($file_url).'" target="_blank">'.basename($file_url).'</a></li>';
}
$output .= '</ul>';
return $output;
}Таким образом, сайт на WordPress с плагином WPUpload Custom Upload будет иметь удобный фронтенд для загрузки и просмотра файлов без использования сторонних решений.
Рекомендации по безопасности при загрузке файлов
Обработка загрузок — потенциальный вектор атак. Вот основные рекомендации:
- Всегда проверяйте MIME-тип и расширение файла;
- Ограничивайте максимальный размер;
- Используйте функции WordPress для загрузки (
wp_handle_upload), которые делают дополнительные проверки; - Не сохраняйте файлы в директории с исполняемыми скриптами;
- При возможности проверяйте содержимое файла (например, изображения через
getimagesize); - Если не используете авторизацию, добавьте CAPTCHA или nonce для защиты от автоматических загрузок;
- Регулярно обновляйте WordPress и плагины.
Следуя этим советам, вы снизите риски и сделаете загрузку файлов надежной.
Альтернативные плагины для загрузки файлов в WordPress
Если не хочется создавать плагин с нуля, можно рассмотреть проверенные плагины с расширяемым функционалом:
- WPForms — мощный конструктор форм с поддержкой загрузки файлов, удобен для новичков.
- Contact Form 7 с дополнениями — бесплатное решение с возможностью кастомизации.
- File Upload Types — плагин для расширения поддерживаемых типов файлов.
- Frontend File Manager — позволяет пользователям загружать и управлять файлами с фронтенда.
Однако собственный плагин дает полный контроль, что особенно важно для уникальных проектов.