Как создать собственный плагин для загрузки файлов в WordPress

Загрузка файлов — одна из важных функций для многих сайтов на 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 — позволяет пользователям загружать и управлять файлами с фронтенда.

Однако собственный плагин дает полный контроль, что особенно важно для уникальных проектов.

Как использовать WP Upload Dir для кэширования временных файлов в WordPress
18.02.2026
Как удалить или скрыть файлы из медиабиблиотеки WordPress
27.01.2026
Как автоматизировать удаление старых файлов в WordPress: практические решения для WPUpload
27.11.2025
Как использовать WP Uploads для хранения пользовательских файлов в WordPress
16.03.2026
Как автоматически оптимизировать изображения при загрузке в WordPress
25.12.2025

wp upload - это директория в WP для загрузки файлов. Подробнее про загрузку файлов в админку можно почитать на этой странице.