В некоторых случаях на сайте WordPress необходимо контролировать, как браузер пользователя обрабатывает скачиваемые файлы. Для этого используется HTTP заголовок Content-Disposition. Он позволяет задать имя файла для сохранения, а также управлять тем, будет ли файл открываться в браузере или скачиваться напрямую.
По умолчанию WordPress не предоставляет удобных инструментов для настройки этого заголовка. В этой статье мы рассмотрим, как добавить уникальный файловый заголовок для загрузок в WordPress, чтобы улучшить пользовательский опыт и избежать проблем с именами файлов, дублированием или неправильным отображением.
Что такое заголовок Content-Disposition и зачем он нужен в WordPress
Заголовок Content-Disposition отвечает за способ обработки файла браузером. Его параметры:
inline— файл открывается непосредственно в браузере (например, PDF или изображение);attachment— браузер предлагает скачать файл с указанным именем.
Пример корректного заголовка для скачивания: Content-Disposition: attachment; filename="document.pdf".
В WordPress файлы могут быть загружены через медиабиблиотеку, плагинами или напрямую по URL. В некоторых случаях, например, при продаже цифровых товаров или предоставлении отчетов, важно гарантировать правильное имя файла при скачивании. Без настройки Content-Disposition браузер может сохранять файл с некорректным именем или открывать его в окне.
Как настроить уникальный Content-Disposition с помощью кода в WordPress
Давайте рассмотрим пример, как добавить заголовок Content-Disposition для файлов, отдаваемых через WordPress. Предположим, у вас есть специальный обработчик скачивания, например, через AJAX или кастомный PHP-файл.
В functions.php вашей темы или в отдельном плагине добавьте следующий код:
function wplist_add_content_disposition_header($file_path, $download_name = '') {
if (!file_exists($file_path)) {
status_header(404);
exit('Файл не найден');
}
// Определяем имя файла для скачивания
$filename = $download_name ? $download_name : basename($file_path);
// Очищаем буфер вывода
if (ob_get_length()) ob_end_clean();
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . rawurlencode($filename) . '"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file_path));
readfile($file_path);
exit;
}Этот код создает функцию wplist_add_content_disposition_header, которая принимает путь к файлу и необязательное имя для скачивания. Она корректно устанавливает заголовки и отдает файл пользователю, гарантируя, что браузер предложит сохранить файл с указанным именем.
Пример использования
Создадим кастомную страницу скачивания:
add_action('template_redirect', 'wplist_custom_file_download');
function wplist_custom_file_download() {
if (isset($_GET['wplist_download'])) {
$file = WP_CONTENT_DIR . '/uploads/custom_file.pdf';
$download_name = 'otchet_' . date('Y-m-d') . '.pdf';
wplist_add_content_disposition_header($file, $download_name);
}
}Теперь, перейдя по URL https://example.com/?wplist_download=1, пользователь скачает файл с уникальным именем, например, otchet_2024-06-01.pdf.
Использование плагинов для управления Content-Disposition
Если вы не хотите писать код, можно воспользоваться готовыми решениями:
- Download Monitor — плагин для управления загрузками с настройкой заголовков и имен файлов. Позволяет создавать защищенные ссылки на файлы и управлять скачиваниями.
- WP Force Download — простой плагин для принудительной отправки файлов с нужными заголовками, включая Content-Disposition.
- Clearfy Pro — в этой комплексной оптимизационной сборке есть модули для контроля HTTP заголовков и безопасности загрузок.
Ссылки на плагины можно найти на WPSHOP.ru.
Дополнительные советы по работе с файлами и заголовками в WordPress
Безопасность скачиваемых файлов
Перед отдачей файла убедитесь, что пользователь имеет права на скачивание. Это важно для платного контента или приватных документов. Используйте проверки текущего пользователя и nonce для защиты от несанкционированного доступа.
Кодировка имени файла в заголовках
Чтобы избежать проблем с кириллицей и пробелами в имени файла, используйте функцию rawurlencode для имени файла в заголовке Content-Disposition, как показано в примерах выше. Это обеспечит правильное распознавание имени на всех браузерах.
Обработка больших файлов
Для больших файлов лучше не читать их целиком через readfile(), а использовать функции постраничной передачи или серверные решения типа X-Sendfile. Это уменьшит нагрузку на PHP и улучшит производительность.
Итог
Управление заголовком Content-Disposition в WordPress — полезный навык для любого разработчика, работающего с файлами. Вы можете легко сделать скачивание файлов удобным и корректным, используя простой PHP-код или надежные плагины. Важно помнить про безопасность и правильную кодировку имен файлов.