Как использовать метод WPUpload Ajax для загрузки файлов в WordPress

В этой статье мы подробно рассмотрим, как реализовать загрузку файлов в WordPress с помощью AJAX, используя собственный метод wpupload_handle_ajax_upload(). Такой подход позволяет загружать файлы без перезагрузки страницы, что существенно улучшает пользовательский опыт, особенно если вы создаете сложные интерфейсы для загрузки контента или управляете медиазагрузками на сайте.

Преимущества AJAX-загрузки файлов в WordPress

Традиционная загрузка файлов через стандартную форму требует перезагрузки страницы, что не всегда удобно. AJAX позволяет:

  • Загружать файлы асинхронно без перезагрузки страницы.
  • Показывать прогресс загрузки и мгновенные уведомления об ошибках.
  • Обрабатывать файлы на сервере с возможностью проверки безопасности и валидации.
  • Интегрировать функцию загрузки в любые части сайта — от пользовательских кабинетов до фронтенд-форм.

WordPress уже имеет встроенные AJAX-хуки и механизмы для работы с файлами, но для удобства и безопасности лучше создавать собственные обработчики с учетом специфики вашего проекта.

Настройка AJAX-обработчика для загрузки файлов: пример кода

Начнем с создания пользовательской функции wpupload_handle_ajax_upload(), которая будет обрабатывать AJAX-запросы на загрузку файлов. Для этого добавим следующий код в файл вашего плагина или темы functions.php:

add_action('wp_ajax_wpupload_ajax_upload', 'wpupload_handle_ajax_upload');
add_action('wp_ajax_nopriv_wpupload_ajax_upload', 'wpupload_handle_ajax_upload');

function wpupload_handle_ajax_upload() {
    // Проверяем nonce для безопасности
    check_ajax_referer('wpupload_nonce_action', 'security');

    if (empty($_FILES['file'])) {
        wp_send_json_error(['message' => 'Файл не был загружен']);
    }

    $file = $_FILES['file'];

    // Дополнительная проверка MIME, размера и т.п.
    $allowed_types = ['image/jpeg', 'image/png', 'application/pdf'];
    if (!in_array($file['type'], $allowed_types)) {
        wp_send_json_error(['message' => 'Недопустимый тип файла']);
    }

    if ($file['size'] > 5 * 1024 * 1024) { // 5 МБ
        wp_send_json_error(['message' => 'Размер файла превышает 5 МБ']);
    }

    require_once(ABSPATH . 'wp-admin/includes/file.php');
    $overrides = ['test_form' => false];
    $movefile = wp_handle_upload($file, $overrides);

    if ($movefile && !isset($movefile['error'])) {
        // Файл успешно загружен
        wp_send_json_success(['url' => $movefile['url'], 'file' => $movefile['file']]);
    } else {
        wp_send_json_error(['message' => $movefile['error']]);
    }

    wp_die();
}

В этом коде мы:

  • Регистрируем AJAX-обработчики для авторизованных и неавторизованных пользователей.
  • Проверяем nonce для защиты от CSRF-атак.
  • Проверяем наличие файла, тип и размер.
  • Используем встроенную функцию wp_handle_upload() для безопасного сохранения файла.
  • Возвращаем JSON-ответ с результатом загрузки.

Создание фронтенд-формы и JavaScript для AJAX-загрузки

Для отправки файла через AJAX нам нужна форма и скрипт, который отправляет файл на сервер.

HTML-форма загрузки

Добавьте на страницу следующий код:

<form id="wpupload-ajax-form" enctype="multipart/form-data">
    <input type="file" name="file" id="wpupload-file-input" required />
    <input type="hidden" name="security" value="<?php echo wp_create_nonce('wpupload_nonce_action'); ?>" />
    <button type="submit">Загрузить файл</button>
</form>
<div id="wpupload-result"></div>

JavaScript для отправки файла

Подключите следующий скрипт (можно в отдельном файле или inline):

document.getElementById('wpupload-ajax-form').addEventListener('submit', function(e) {
    e.preventDefault();

    var fileInput = document.getElementById('wpupload-file-input');
    var file = fileInput.files[0];
    var nonce = this.querySelector('input[name="security"]').value;
    var formData = new FormData();
    formData.append('action', 'wpupload_ajax_upload');
    formData.append('file', file);
    formData.append('security', nonce);

    var resultDiv = document.getElementById('wpupload-result');
    resultDiv.innerHTML = 'Загрузка...';

    fetch('<?php echo admin_url('admin-ajax.php'); ?>', {
        method: 'POST',
        body: formData
    })
    .then(response => response.json())
    .then(data => {
        if (data.success) {
            resultDiv.innerHTML = 'Файл успешно загружен: <a href="' + data.data.url + '" target="_blank">Ссылка</a>';
        } else {
            resultDiv.innerHTML = 'Ошибка: ' + data.data.message;
        }
    })
    .catch(error => {
        resultDiv.innerHTML = 'Произошла ошибка при загрузке файла.';
        console.error(error);
    });
});

Этот скрипт перехватывает отправку формы, формирует объект FormData с файлом и nonce, отправляет запрос на AJAX-обработчик и выводит результат пользователю.

Дополнительные настройки и безопасность загрузки

При реализации AJAX-загрузки файлов важно учитывать несколько моментов безопасности и удобства:

  • Проверка nonce. Это базовый механизм защиты от CSRF-атак, который мы уже использовали.
  • Ограничение типов и размеров файлов. Разрешайте только необходимые форматы и контролируйте размер, чтобы избежать DoS-атак и переполнения диска.
  • Обработка ошибок. Всегда возвращайте понятные сообщения об ошибках, чтобы пользователь понимал, что произошло.
  • Права доступа. Если загрузка доступна только зарегистрированным пользователям, используйте соответствующие хуки и проверки.
  • Безопасное хранение. Файлы лучше сохранять в стандартной папке загрузок WordPress с помощью wp_handle_upload(), чтобы избежать проблем с доступом и индексированием.

Пример расширения: добавление в медиатеку WordPress

Если вам нужно не просто сохранить файл, а добавить его в медиатеку WordPress, чтобы управлять через админку, можно расширить функцию wpupload_handle_ajax_upload(), добавив регистрацию вложения:

function wpupload_handle_ajax_upload() {
    check_ajax_referer('wpupload_nonce_action', 'security');

    if (empty($_FILES['file'])) {
        wp_send_json_error(['message' => 'Файл не был загружен']);
    }

    $file = $_FILES['file'];

    $allowed_types = ['image/jpeg', 'image/png', 'application/pdf'];
    if (!in_array($file['type'], $allowed_types)) {
        wp_send_json_error(['message' => 'Недопустимый тип файла']);
    }

    if ($file['size'] > 5 * 1024 * 1024) {
        wp_send_json_error(['message' => 'Размер файла превышает 5 МБ']);
    }

    require_once(ABSPATH . 'wp-admin/includes/file.php');
    require_once(ABSPATH . 'wp-admin/includes/media.php');
    require_once(ABSPATH . 'wp-admin/includes/image.php');

    $overrides = ['test_form' => false];
    $movefile = wp_handle_upload($file, $overrides);

    if ($movefile && !isset($movefile['error'])) {
        $filename = $movefile['file'];

        $attachment = [
            'post_mime_type' => $movefile['type'],
            'post_title' => sanitize_file_name($file['name']),
            'post_content' => '',
            'post_status' => 'inherit'
        ];

        $attach_id = wp_insert_attachment($attachment, $filename);
        $attach_data = wp_generate_attachment_metadata($attach_id, $filename);
        wp_update_attachment_metadata($attach_id, $attach_data);

        wp_send_json_success(['url' => $movefile['url'], 'attachment_id' => $attach_id]);
    } else {
        wp_send_json_error(['message' => $movefile['error']]);
    }

    wp_die();
}

Так вы сможете использовать загруженные файлы в стандартных виджетах и редакторе WordPress.

Полезные плагины для AJAX-загрузки файлов в WordPress

Если вы не хотите писать код с нуля, можно воспользоваться готовыми решениями:

  • WPForms — мощный конструктор форм с поддержкой AJAX и загрузки файлов.
  • Contact Form 7 + AJAX Upload — расширение для Contact Form 7, добавляющее AJAX-загрузку.
  • Ajax Multi Upload for WooCommerce — если работаете с WooCommerce и нужно добавить загрузку файлов в корзину.
  • DropzoneJS Integration — плагины, интегрирующие Dropzone.js для удобной drag&drop загрузки.

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

Как использовать WP Upload Dir для кэширования временных файлов в WordPress
18.02.2026
Как защитить загружаемые файлы WordPress от неавторизованного доступа
12.04.2026
Как создать собственный плагин для загрузки файлов в WordPress
01.12.2025
Как добавить автоматическое сжатие файлов при загрузке в WordPress
12.02.2026
Как автоматически переименовать загруженные файлы в WordPress
23.01.2026

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