Это решение, которое я использовал для защищенных файлов в Wordpress. Файлы находились в определенной папке, доступ был запрещен для всех пользователей в этой папке через .htaccess. контроль доступа чисто по статусу пользователя WordPress.
serve.php:
<?php
ob_start();
header('Content-Type: html');
header("Expires: 0");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
//this will enable the basic functionality to check for user status
$wpload=$_SERVER['DOCUMENT_ROOT'] . '/wp-load.php';
define( 'WP_USE_THEMES', false );
Include_once($wpload);
$loggedin= is_user_logged_in();
//here you can also do more extensive checks. eg: each user has only access to his own folder or files
if(!$loggedin) exit;
$file= sanitize_text_field($_GET['file']);
$file= realpath(dirname(__FILE__) . '/../../../uploads/myplugin/').'/'.$file;
ob_end_clean();
readfile($file);
?>
Ссылка для получения файла будет выглядеть примерно так:
https://mydomain/serve.php?file=my-sample.html
Это работает очень хорошо. Один из недостатков заключается в том, что кеширование в браузере не работает с этим методом, и на стороне сервера вывод также происходит медленнее. Это не должно быть проблемой с HTML-файлами. Я использовал его, чтобы показать изображения, добавил, может быть, 500 мс задержки
, так что, в основном, serve.php - это автономный файл, который загружает основные файлы WordPress и проверяет параметр, переданный в строке запроса.