Вопрос или проблема
Я хотел бы, чтобы авторизованный пользователь мог скачать PDF-файл, но не видел реальный путь к файлу. Кроме того, в этом PDF-файле я ввожу информацию об имени пользователя и дате загрузки.
Я создал новую конечную точку “download”, чтобы адрес загрузки выглядел так: my-website.com/post-name/download/attached-id
function my_custom_endpoint() {
add_rewrite_endpoint( 'download', EP_PERMALINK | EP_PAGES );
}
add_action( 'init', 'my_custom_endpoint' );
Но я не знаю, какой хук использовать, чтобы не загружать страницу после вызова этой конечной точки, а вызвать мою функцию и вернуть PDF-файл пользователю.
Хорошим хуком для этого будет template_redirect
. Вы можете запросить вашу конечную точку таким образом:
add_action('template_redirect', function() {
global $wp_query;
// Если это не ваша конечная точка и не страница/пост, ничего не делаем.
if (!isset( $wp_query->query_vars['download']) || ! is_singular()) {
return;
}
// Здесь ваша магия!
[…]
// И, вероятно, хорошая идея завершить выполнение, если вы раздаете файлы.
exit;
});
Также есть отличный учебник о конечных точках на Make WordPress.
Ответ или решение
Чтобы создать конечную точку для скачивания PDF файлов в WordPress, необходимо выполнить несколько шагов, которые обеспечат безопасность, скрытие реального пути к файлу и предоставление пользователю соответствующей информации о загрузке.
Шаг 1: Создание конечной точки
Сначала мы создадим конечную точку, которая будет обрабатывать запросы для скачивания PDF. Используя функцию add_rewrite_endpoint
, мы добавим новый маршрут.
function my_custom_endpoint() {
add_rewrite_endpoint('download', EP_PERMALINK | EP_PAGES);
}
add_action('init', 'my_custom_endpoint');
Шаг 2: Обработка запросов к конечной точке
Следующий шаг — это обработка запросов к нашей новой конечной точке. Для этого мы используем хук template_redirect
. Этот хук позволяет нам определить, идет ли обращение к нашей конечной точке и, если это так, выполнить нужные действия без загрузки полной страницы.
add_action('template_redirect', function() {
global $wp_query;
// Проверяем наличие 'download' в запросе
if (!isset($wp_query->query_vars['download']) || !is_singular()) {
return;
}
// Получаем ID вложения из URL
$attachment_id = get_query_var('attached-id');
// Проверка прав пользователя
if (!is_user_logged_in()) {
wp_die('Вы должны быть авторизованы, чтобы скачать этот файл.');
}
// Получаем информацию о файле
$file_path = get_attached_file($attachment_id);
// Проверяем, существует ли файл
if (!file_exists($file_path)) {
wp_die('Файл не найден.');
}
// Устанавливаем заголовки для скачивания
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="' . basename($file_path) . '"');
header('Content-Length: ' . filesize($file_path));
// Записываем информацию о пользователе и дате загрузки в PDF (например, добавляем в метаданные)
$user = wp_get_current_user();
$download_date = date('Y-m-d H:i:s');
// Здесь можно добавить код для изменения PDF (например, используя библиотеку FPDF или TCPDF)
// Читаем файл и отправляем его пользователю
readfile($file_path);
// Завершаем выполнение скрипта
exit;
});
Шаг 3: Безопасность и проверка прав доступа
Важно, чтобы только авторизованные пользователи могли загружать файлы. Поэтому мы используем функцию is_user_logged_in()
для проверки статуса пользователя. Если пользователь неавторизован, выводим сообщение об ошибке.
Также не забывайте о том, что следует проверять наличие файла перед его отправкой, чтобы избежать ошибок при отсутствии файла.
Шаг 4: Регистрация и перезапись правил
После добавления новой конечной точки необходимо сбросить пермалинки в настройках WordPress. Это можно сделать, перейдя в "Настройки" → "Постоянные ссылки" и просто нажав "Сохранить изменения".
Заключение
Создание конечной точки для скачивания PDF-файлов в WordPress — это задача, требующая понимания внутренней архитектуры системы. Этот процесс не только обеспечивает скачивание файлов, но и защищает их от несанкционированного доступа. Используйте предложенный код как шаблон и настройте его в соответствии с вашими требованиями. Не забывайте об оптимизации SEO, поддерживайте актуальность контента, чтобы обеспечить высокую видимость вашего сайта в поисковых системах.