En este artículo veremos como evitar la descarga directa de archivos de WordPress y que sólo sean accesibles por usuarios con un determinado rol en WordPress, veremos como hacerlo a través de código.
Resultado Final
Al final queremos obtener algo similar a la siguiente imagen cuando un usuario que esta conectado trata de conectarse y no tiene un rol que permite descargar el archivo.
Generalidades
Existen plugins como Prevent Direct Access que restringen la descarga de archivos de medios de WordPress, sin embargo en este artículo veremos como realizarlo a través de código.
Protegeremos cualquier archivo pdf, zip, docx, jpg, png que se suba a WordPress desde la opción de medios y que además tenga al inicio del nombre el texto de «protegido_»
Código .htaccess para restringir la descarga de archivos protegidos
Usaremos un código al inicio del archivo .htaccess para que si el recurso solicitado en la ruta de uploads empiece con el texto de ‘protegido_XXXXX’ entonces le pase el control a WordPress a través del punto de entrada index.php
De esta forma una vez en WordPress podremos decidir si el usuario tiene o no el rol que le permite ver ese archivo.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# Redirigir archivos que comienzan con "protegido_" a index.php
RewriteRule ^wp-content/uploads/.*protegido_.*\.(pdf|zip|docx|jpg|png)$ index.php [L]
</IfModule>
Código PHP para evaluar si el usuario puede descargar o no el archivo
Puedes agregar el siguiente código como parte del archivo functions.php de tu tema hijo, usar algún plugin de Snippets o como parte de un plugin personalizado.
add_action( 'init', 'restringir_acceso_a_archivos' );
function restringir_acceso_a_archivos(): void {
// Obtener la URL actual solicitada
$request_uri = $_SERVER['REQUEST_URI'];
// Verificar si la URL solicitada pertenece a la carpeta protegida y el archivo comienza con "protegido_"
if ( preg_match( '#/wp-content/uploads/\d{4}/\d{2}/protegido_.*\.(pdf|zip|docx|jpg|png)$#i', $request_uri ) ) {
// Verificar si el usuario ha iniciado sesión
if ( ! is_user_logged_in() ) {
wp_redirect( home_url( '/wp-login.php?redirect_to=' . urlencode( $request_uri ) ) );
exit;
}
// Obtener el usuario actual y sus roles
$current_user = wp_get_current_user();
// Definir los roles permitidos (ajusta según tus necesidades)
$roles_permitidos = array( 'administrator', 'editor' );
// Verificar si el usuario tiene el rol adecuado
if ( ! array_intersect( $roles_permitidos, $current_user->roles ) ) {
wp_die( 'No tienes permisos para acceder a este recurso.', 'Acceso denegado', array( 'response' => 403 ) );
}
// Obtener la ruta completa del archivo
$file_path = ABSPATH . parse_url( $request_uri, PHP_URL_PATH );
// Verificar si el archivo existe
if ( file_exists( $file_path ) ) {
// Forzar la descarga del archivo
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 ) );
}
}
}
En el código anterior:
- Usamos el hook init de WordPress que hace referencia a la función restringir_acceso_a_archivos
- Comprobamos si la URL actual cumple el patrón de encontrarse en la URL de descarga y si el nombre del archivo empieza con ‘protegido_’
- Si cumple estas condiciones entonces comprobamos que debe ser un usuario conectado
- También comprobamos que el usuario conectado tenga alguno de los roles de: administrator o editor
- Si se cumplen todas esas condiciones entonces accedemos al archivo y forzamos la descarga
Conclusión
En este artículo hemos visto como restringir la descarga directa de archivos que cumplen determinadas condiciones, además que sólo sean accesibles por usuarios de un determinado rol y hemos visto como hacerlo a través de código.
La entrada Evitar la descarga directa de archivos en WordPress es un artículo reciente del sitio DecodeCMS.
0 Commentaires