По умолчанию WordPress ограничивает типы файлов, которые пользователи могут загружать через медиа-библиотеку или формы загрузки. Это сделано в целях безопасности, чтобы избежать загрузки потенциально опасных файлов. Однако в ряде случаев необходимо расширить список разрешённых расширений, чтобы, например, позволить загружать архивы, документы нестандартных форматов, SVG-файлы или другие специфические типы.
Почему WordPress ограничивает типы загружаемых файлов
WordPress использует внутренний список разрешённых MIME-типов и расширений файлов. Если расширение не входит в этот список, загрузка будет запрещена с ошибкой. Это помогает защитить сайт от внедрения вредоносных скриптов и других угроз.
Тем не менее, если вы уверены в безопасности определённых типов файлов, можно расширить список разрешённых файлов, не снижая общую защиту сайта.
Как разрешить новые расширения через functions.php
Самый простой способ добавить новые расширения — использовать фильтр wpma_mime_types (префикс wpma добавлен для уникальности функций в данном примере). Вставьте следующий код в файл functions.php вашей темы или в плагин для кастомных функций:
function wpma_allow_custom_mime_types( $mimes ) {
// Добавляем разрешённые расширения
$mimes['svg'] = 'image/svg+xml';
$mimes['zip'] = 'application/zip';
$mimes['csv'] = 'text/csv';
$mimes['docx'] = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
return $mimes;
}
add_filter( 'upload_mimes', 'wpma_allow_custom_mime_types' );Этот код добавляет поддержку SVG, ZIP, CSV и DOCX. Вы можете добавить или удалить расширения по необходимости, указывая правильные MIME-типы.
Пояснение по MIME-типам
Важно указывать корректные MIME-типы, иначе браузеры и серверы могут некорректно обрабатывать файлы. Список MIME-типов можно посмотреть в официальном реестре IANA или на wpshop.ru.
Как разрешить загрузку SVG с безопасной обработкой
SVG-файлы — это текстовые XML-документы, их можно модифицировать для внедрения вредоносного кода. Поэтому по умолчанию WordPress запрещает загрузку SVG. Для безопасной работы с SVG можно использовать плагин Safe SVG, который проверяет и очищает содержимое SVG перед загрузкой.
Установка плагина:
- В админке WordPress перейдите Плагины > Добавить новый.
- Поиск по слову
Safe SVG. - Установите и активируйте плагин.
Плагин автоматически разрешит загрузку SVG и обеспечит безопасность.
Пример создания пользовательской формы загрузки с фильтрацией расширений
Если вы хотите разрешить загрузку файлов с определёнными расширениями через кастомную форму на сайте, можно использовать следующий пример кода с AJAX и проверкой расширений.
add_action('wp_enqueue_scripts', 'wpma_enqueue_upload_script');
function wpma_enqueue_upload_script() {
wp_enqueue_script('wpma-upload', get_template_directory_uri() . '/js/wpma-upload.js', array('jquery'), null, true);
wp_localize_script('wpma-upload', 'wpma_upload_obj', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wpma_upload_nonce')
));
}
add_action('wp_ajax_wpma_custom_upload', 'wpma_custom_upload_handler');
add_action('wp_ajax_nopriv_wpma_custom_upload', 'wpma_custom_upload_handler');
function wpma_custom_upload_handler() {
check_ajax_referer('wpma_upload_nonce', 'nonce');
if (empty($_FILES['file'])) {
wp_send_json_error('Файл не загружен');
}
$file = $_FILES['file'];
$allowed_exts = array('jpg', 'png', 'pdf', 'docx');
$ext = pathinfo($file['name'], PATHINFO_EXTENSION);
if (!in_array(strtolower($ext), $allowed_exts)) {
wp_send_json_error('Недопустимый тип файла');
}
require_once(ABSPATH . 'wp-admin/includes/file.php');
$overrides = array('test_form' => false);
$movefile = wp_handle_upload($file, $overrides);
if ($movefile && !isset($movefile['error'])) {
wp_send_json_success(array('url' => $movefile['url']));
} else {
wp_send_json_error($movefile['error']);
}
}
Этот код принимает файл, проверяет расширение и загружает его в стандартную папку WordPress. Чтобы использовать, создайте форму с AJAX-запросом на admin-ajax.php с действием wpma_custom_upload.
JavaScript для отправки файла через AJAX
jQuery(document).ready(function($) {
$('#wpma-upload-form').on('submit', function(e) {
e.preventDefault();
var fileInput = $('#wpma-file')[0];
if (fileInput.files.length === 0) {
alert('Выберите файл');
return;
}
var formData = new FormData();
formData.append('action', 'wpma_custom_upload');
formData.append('nonce', wpma_upload_obj.nonce);
formData.append('file', fileInput.files[0]);
$.ajax({
url: wpma_upload_obj.ajax_url,
type: 'POST',
data: formData,
processData: false,
contentType: false,
success: function(response) {
if (response.success) {
alert('Файл успешно загружен: ' + response.data.url);
} else {
alert('Ошибка: ' + response.data);
}
}
});
});
});Плагины для расширенного управления загрузками
Если хочется более продвинутого функционала без ручного кода, рекомендую обратить внимание на следующие плагины:
- WP User Frontend — позволяет создавать пользовательские формы загрузки с гибкой настройкой типов файлов.
- File Upload Types by WPForms — расширяет типы разрешённых файлов для форм, созданных с WPForms.
- Clearfy Pro — среди множества оптимизаций есть удобные настройки безопасности и медиа.
Все эти решения помогут не только добавить поддержки новых расширений, но и контролировать процесс загрузки, обеспечивая безопасность и удобство.
Безопасность при работе с расширениями файлов
При расширении списка загружаемых файлов всегда помните о безопасности:
- Добавляйте только проверенные и необходимые расширения.
- Используйте плагины для фильтрации содержимого, особенно для SVG и документов Office.
- Ограничивайте права загрузки для определённых ролей пользователей.
- Регулярно обновляйте плагины и ядро WordPress.
Таким образом, вы сможете расширить функционал загрузки файлов и при этом сохранить безопасность сайта.