При работе с WordPress часто возникает необходимость контролировать, какие файлы и какого размера могут загружать пользователи через медиа-библиотеку или формы загрузки. Это важно для безопасности сайта, оптимизации пространства на сервере и предотвращения загрузки неподходящих файлов.
Почему важно ограничивать типы и размер загружаемых файлов
Без ограничений пользователи могут загружать очень большие файлы, которые занимают много места на сервере и могут вызвать проблемы с производительностью сайта. Кроме того, разрешение загрузки неподходящих форматов (например, исполняемых файлов) может привести к уязвимостям безопасности.
Поэтому стоит установить лимиты и фильтры, чтобы разрешать только нужные форматы и ограничивать вес файлов.
Как ограничить максимальный размер загружаемых файлов в WordPress
Максимальный размер загрузки определяется настройками PHP (параметры upload_max_filesize и post_max_size), а также WordPress. Однако можно дополнительно проверить размер файлов на уровне WordPress и вывести понятное сообщение об ошибке.
Изменение параметров PHP
Чтобы увеличить или уменьшить максимальный размер загрузки, в файле php.ini или .htaccess можно прописать:
upload_max_filesize = 5M
post_max_size = 5M
Где 5M — это 5 мегабайт. Но если доступа к настройкам PHP нет, поможет следующий способ.
Проверка размера файла через хук WordPress
Добавим проверку с помощью фильтра wp_handle_upload_prefilter в файл functions.php или отдельный плагин:
function wpfix_limit_file_size($file) {
$max_size = 2 * 1024 * 1024; // 2 Мб
if ($file['size'] > $max_size) {
$file['error'] = 'Ошибка: размер файла превышает 2 Мб.';
}
return $file;
}
add_filter('wp_handle_upload_prefilter', 'wpfix_limit_file_size');
Этот код не позволит загрузить файлы, размер которых больше 2 Мб, и выведет ошибку.
Как ограничить типы файлов для загрузки в WordPress
По умолчанию WordPress разрешает загрузку многих типов файлов, но иногда нужно ограничить список допустимых расширений.
Использование фильтра upload_mimes
Внесём изменения в список разрешённых MIME-типов:
function wpfix_restrict_mime_types($mimes) {
// Разрешаем только изображения и PDF
return array(
'jpg|jpeg|jpe' => 'image/jpeg',
'png' => 'image/png',
'gif' => 'image/gif',
'pdf' => 'application/pdf',
);
}
add_filter('upload_mimes', 'wpfix_restrict_mime_types');
Теперь пользователь сможет загружать только картинки и PDF-документы.
Добавление исключений для администраторов
Иногда админы должны иметь расширенные права на загрузку. Добавим проверку роли:
function wpfix_restrict_mime_types_for_users($mimes) {
if (current_user_can('manage_options')) {
return $mimes; // админ может загружать все
}
return array(
'jpg|jpeg|jpe' => 'image/jpeg',
'png' => 'image/png',
'gif' => 'image/gif',
'pdf' => 'application/pdf',
);
}
add_filter('upload_mimes', 'wpfix_restrict_mime_types_for_users');
Практические советы и плагины для управления загрузками
Если хочется более гибко управлять загрузками, можно использовать плагины. Например:
- Clearfy Pro — оптимизирует работу сайта и позволяет управлять безопасностью, в том числе настройками загрузок.
- My Popup — позволяет создавать кастомные всплывающие окна, например, с уведомлениями о правилах загрузки.
Но чаще всего достаточно простых фильтров и проверок, описанных выше.
Обработка ошибок и пользовательский интерфейс
Важно не только ограничить загрузку, но и корректно сообщить пользователю о причине отказа. В приведённом выше примере с wp_handle_upload_prefilter задаётся текст ошибки, который WordPress выводит в админке.
Если вы используете фронтенд-формы загрузки через AJAX, можно перехватить ошибку и показать её пользователю динамически.
Пример AJAX-обработчика с проверкой размера файла
add_action('wp_ajax_wpfix_ajax_upload', 'wpfix_ajax_upload_handler');
function wpfix_ajax_upload_handler() {
if (empty($_FILES['file'])) {
wp_send_json_error('Файл не загружен');
}
$file = $_FILES['file'];
$max_size = 2 * 1024 * 1024; // 2Мб
if ($file['size'] > $max_size) {
wp_send_json_error('Размер файла превышает 2 Мб');
}
$uploaded = wp_handle_upload($file, array('test_form' => false));
if (isset($uploaded['error'])) {
wp_send_json_error($uploaded['error']);
}
wp_send_json_success($uploaded['url']);
}
Такой подход позволяет легко интегрировать ограничения в любые кастомные формы загрузки.
Итоги и рекомендации
Ограничение типа и размера загружаемых файлов — важный шаг для обеспечения безопасности и производительности WordPress-сайта. Используйте настройки PHP, фильтры WordPress, а при необходимости — AJAX-валидацию на фронтенде.
Не забывайте тестировать ограничения на разных ролях пользователей и информировать пользователей о причинах отказа в загрузке.