En WordPress, los archivos que subes a tu sitio, como imágenes, documentos o archivos comprimidos, suelen ser accesibles para cualquier persona que tenga el enlace directo. Esto puede representar un problema si necesitas restringir el acceso a ciertos archivos, ya sea para proteger información confidencial o para limitar su uso a un grupo específico, como miembros premium, empleados o administradores.
En este artículo, te mostraremos cómo evitar que los archivos en tu sitio WordPress sean descargados directamente, permitiendo el acceso únicamente a usuarios con roles específicos. Este método resulta útil para resguardar contenido exclusivo o privado, como informes, archivos de pago u otros recursos destinados solo a personas con autorización.
Razones para restringir la descarga directa de archivos
- Mejor control sobre el acceso: Implementar una solución personalizada te permite gestionar los permisos de acceso sin necesidad de depender de plugins adicionales que podrían afectar el rendimiento de tu sitio.
- Mayor seguridad: Los documentos confidenciales o recursos pagos pueden quedar expuestos si no cuentan con restricciones adecuadas. Al bloquear el acceso no autorizado, proteges la información de tu sitio.
- Gestión eficiente de usuarios: Con esta configuración, puedes asegurarte de que solo administradores, editores o usuarios con un rol específico puedan descargar los archivos, impidiendo que visitantes sin permisos accedan al contenido.
Resultado esperado
Si un usuario inicia sesión, pero no tiene el rol necesario para descargar el archivo, se le mostrará un mensaje indicando que no cuenta con los permisos requeridos. De este modo, solo las personas autorizadas podrán acceder a los archivos protegidos, evitando descargas no deseadas.

Introducción
En WordPress, los archivos subidos a la biblioteca de medios suelen estar disponibles a través de una URL directa, lo que significa que cualquier persona que conozca la ruta exacta del archivo podría descargarlo sin restricciones. Para evitar esto, existen plugins como Prevent Direct Access, que brindan protección automática. Sin embargo, si buscas una alternativa más flexible sin depender de complementos, puedes implementar un sistema de restricción mediante código.
En este artículo, veremos cómo evitar la descarga directa de archivos específicos, asegurando que solo los usuarios autenticados con ciertos roles puedan acceder a ellos.
Estrategia de protección
El método que aplicaremos se basa en los siguientes puntos:
- Filtrado de archivos protegidos: Se restringirá el acceso a ciertos tipos de archivos, como PDF, ZIP, DOCX, JPG y PNG, dentro de la biblioteca de medios.
- Identificación de archivos restringidos: Solo los archivos cuyo nombre comience con “protegido_” estarán sujetos a estas restricciones.
- Redirección con .htaccess: Se configurará el archivo .htaccess para interceptar las solicitudes de descarga y redirigirlas a WordPress para su verificación.
- Validación con PHP: Se añadirá un código en functions.php o en un plugin personalizado para comprobar si el usuario tiene los permisos necesarios antes de permitir el acceso al archivo.
Este sistema es ideal para proteger documentos privados, contenido exclusivo o archivos sensibles, garantizando que solo los usuarios autorizados puedan descargarlos.
Configuración de .htaccess para restringir descargas
Para limitar el acceso a ciertos archivos dentro de la carpeta uploads, es necesario modificar el archivo .htaccess con el siguiente código.
Si el archivo solicitado comienza con “protegido_”, la solicitud será redirigida a index.php, donde WordPress verificará si el usuario tiene los permisos adecuados antes de permitir el acceso.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# Restringir acceso directo a archivos protegidos y redirigir la solicitud a index.php
RewriteRule ^wp-content/uploads/.*protegido_.*\.(pdf|zip|docx|jpg|png)$ index.php [L]
</IfModule>
Este enfoque proporciona un mayor control sobre los archivos sensibles de tu sitio web, asegurando que solo los usuarios con los permisos adecuados puedan descargarlos.
Código PHP para controlar el acceso a archivos protegidos
Para gestionar quién puede descargar ciertos archivos en WordPress, puedes agregar el siguiente código en el archivo functions.php de tu tema hijo, utilizar un plugin de fragmentos de código como WP Code, o incluirlo en un plugin personalizado. Optar por WP Code u otro plugin similar facilita la administración del código sin modificar los archivos principales del tema, lo que reduce el riesgo de errores y asegura compatibilidad con futuras actualizaciones.

add_action( 'init', 'restringir_acceso_a_archivos' );
function restringir_acceso_a_archivos(): void {
// Obtener la URL del archivo solicitado
$request_uri = $_SERVER['REQUEST_URI'];
// Verificar si el archivo pertenece a la carpeta protegida y sigue el patrón "protegido_"
if ( preg_match( '#/wp-content/uploads/\d{4}/\d{2}/protegido_.*\.(pdf|zip|docx|jpg|png)$#i', $request_uri ) ) {
// Redirigir a la página de inicio de sesión si el usuario no está autenticado
if ( ! is_user_logged_in() ) {
wp_redirect( home_url( '/wp-login.php?redirect_to=' . urlencode( $request_uri ) ) );
exit;
}
// Obtener los roles del usuario actual
$current_user = wp_get_current_user();
$roles_permitidos = array( 'administrator', 'editor' );
// Bloquear la descarga si el usuario no tiene los permisos necesarios
if ( ! array_intersect( $roles_permitidos, $current_user->roles ) ) {
wp_die( 'No tienes permisos para acceder a este archivo.', 'Acceso denegado', array( 'response' => 403 ) );
}
// Obtener la ruta real del archivo
$file_path = ABSPATH . parse_url( $request_uri, PHP_URL_PATH );
// Permitir la descarga si el archivo existe
if ( file_exists( $file_path ) ) {
header( 'Content-Type: application/octet-stream' );
header( 'Content-Disposition: attachment; filename="' . basename( $file_path ) . '"' );
header( 'Expires: 0' );
header( 'Content-Length: ' . filesize( $file_path ) );
readfile( $file_path );
exit;
} else {
wp_die( 'El archivo solicitado no existe.', 'Archivo no encontrado', array( 'response' => 404 ) );
}
}
}
Con este método, solo los usuarios con permisos específicos podrán acceder a los archivos protegidos, evitando así descargas no autorizadas.
Explicación del código
- Uso del hook
init
: Se emplea este hook de WordPress para ejecutar la función que controla el acceso a los archivos. - Comprobación de la URL: Se verifica si el archivo solicitado se encuentra en la carpeta uploads y si su nombre comienza con protegido_.
- Restricción de acceso: Si el archivo coincide con el patrón definido, se revisa si el usuario ha iniciado sesión.
- Verificación de permisos: Solo los administradores y editores podrán descargar los archivos protegidos.
- Forzar la descarga: Si se cumplen todos los requisitos, se permite la descarga del archivo solicitado.
Conclusión
En este artículo, exploramos cómo restringir la descarga directa de archivos en WordPress a través de un enfoque basado en código. Implementamos reglas en .htaccess para interceptar solicitudes y redirigirlas a WordPress, junto con una función PHP que verifica los permisos del usuario antes de permitir el acceso al archivo. Este método proporciona una mayor seguridad, garantizando que solo los usuarios autorizados puedan descargar archivos confidenciales o exclusivos.
Si te gustó este artículo, suscríbete a nuestro canal de YouTube para videos tutoriales de Hosting, prácticas y demás. También puede encontrarnos en X (Twitter), Facebook e Instagram, además de LinkedIn.