Ограничение доступа к файлам в определенной папке
Возможный дубликат:
Как защитить загрузки, если пользователь не авторизован?
Существует ли вообще способ ограничить прямой доступ к файлам в определенной папке только для определенных пользователей WordPress, у которых установлено это конкретное право?

Самое простое решение на PHP — создать скрипт для скачивания. Он проверяет права пользователя и отдает файл веб-клиенту. Либо, что предпочтительнее, разместить файлы в папке за пределами корневой директории веб-сервера.
Установите права доступа к файлам без анонимного доступа, разрешите веб-серверу их читать и выводить через PHP-файл, как показано ниже. Этот код читает файл и отправляет его в браузер.
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header('Content-disposition: attachment; filename='. $file;
header("Content-Transfer-Encoding: binary");
header("Content-Length: ". filesize(ABSPATH.$dir.$file);
readfile($dir.$file);
exit();
Редактирование от 14-1:
Создайте обычное поле для загрузки файлов, и после загрузки переместите файл в папку за пределами корневой директории веб-сервера (эта папка недоступна пользователям через HTTP, только веб-серверу).
if (move_uploaded_file( $_FILES['Filedata']['tmp_name'] , $upload_dir.$filename ) ) {
// код, выполняемый после успешного копирования файла. Обновите базу данных или что-то еще.
}
$upload_dir.$filename — это полный путь к директории за пределами папки www. Теперь файл доступен только веб-серверу. Сохраните его расположение в базе данных вместе с информацией о загрузившем пользователе. Или создайте подпапки для каждого пользователя. Вам нужно что-то, чтобы различать файлы разных пользователей.
Теперь, когда нужно скачать файл, создайте скрипт download.php. В этом скрипте проверьте, есть ли у пользователя права на файл.
global $user;
if ($user->id == $uploaded_user_id) {
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header('Content-disposition: attachment; filename='. $file;
header("Content-Transfer-Encoding: binary");
header("Content-Length: ". filesize(ABSPATH.$upload_dir.$file);
readfile($upload_dir.$file);
exit();
}
Теперь нужно передать file_id или имя файла в скрипт download.php. Сформируйте ссылку типа url/download.php?file=$file. Вы должны вызывать этот скрипт напрямую или на ранних этапах работы вашего плагина, иначе получите ошибку о том, что заголовки уже отправлены. Скрипт проверит права пользователя и начнет выводить бинарные данные.
Должно получиться примерно так. Надеюсь, это поможет. Это не полное решение, но оно даст вам старт.

большое спасибо за ваш ответ. Я был бы очень признателен, если бы вы могли расширить свой ответ. Видите ли, я хотел бы создать пользовательский метабокс для загрузки файлов, который будет загружать файлы в определенную папку на сервере. Затем я хотел бы ограничить прямой доступ к этим файлам для всех посетителей сайта, кроме тех пользователей, которые авторизованы и имеют определенную возможность просматривать все эти файлы. Как вы думаете, какой был бы лучший способ реализовать это?
