Restringir el acceso a archivos dentro de una carpeta específica
Posible duplicado:
¿Cómo proteger archivos subidos si el usuario no ha iniciado sesión?
¿Existe alguna forma de restringir el acceso directo a archivos dentro de una carpeta específica solo a usuarios de WordPress que tengan una capacidad específica asignada?

La solución más fácil en PHP sería crear un script de descarga. Verifica si el usuario tiene los permisos correctos y sirve el archivo al cliente web. O mi preferencia, configurar una carpeta fuera del directorio raíz web y colocar los archivos allí.
Establece los permisos del archivo sin acceso anónimo y permite que el servidor web los lea y los muestre en un archivo PHP como este. El siguiente código lee el archivo y lo envía al navegador.
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();
edición 14-1:
Crea un cuadro de carga normal y cuando el archivo se cargue, muévelo a una carpeta fuera del directorio raíz web (esta carpeta no puede ser accedida por usuarios a través de HTTP, solo por el servidor web).
if (move_uploaded_file( $_FILES['Filedata']['tmp_name'] , $upload_dir.$filename ) ) {
// código para ejecutar después de que el archivo se haya copiado correctamente. Actualiza tu base de datos o algo similar.
}
$upload_dir.$filename es la ruta completa al directorio fuera de la carpeta www. El archivo ahora solo puede ser accedido por el servidor web. Almacena la ubicación en una base de datos con información del cargador. O crea subdirectorios para cada usuario. Necesitas algo para diferenciar los archivos de cada usuario.
Ahora, cuando quieras descargar un archivo, crea un script llamado download.php En ese script verificas si el usuario tiene derechos sobre el archivo.
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();
}
ahora quieres pasar un file_id o nombre al script de descarga. así que construye el enlace como url/download.php?file=$file. Tienes que llamar esto directamente o en las primeras etapas de tu plugin o obtendrás el mensaje de "headers already sent". El script verificará si el usuario tiene derechos y comenzará a enviar datos binarios.
Debería ser algo como esto, espero que ayude. No es completo pero debería darte un comienzo.

muchas gracias por tu respuesta. Te agradecería mucho si pudieras ampliar tu respuesta. Verás, lo que me gustaría hacer es crear un metabox personalizado para subir archivos a una carpeta específica en el servidor. Luego me gustaría restringir el acceso directo a esos archivos por parte del público a todos los visitantes del sitio web, excepto para aquellos usuarios que hayan iniciado sesión y tengan la capacidad específica de ver todos estos archivos. ¿Cuál crees que sería la mejor manera de lograr esto?
