crispytoes
¿Hay alguna forma de adjuntar middleware a una ruta específica en WordPress o solo en PHP? Me gustaría ejecutar una función de middleware antes de permitir el acceso a la carpeta de carga para verificar si el usuario tiene acceso al archivo antes de permitirle descargarlo.
Vengo de un fondo en node.js/express, así que si ayuda, me gustaría hacer algo como esto:
app.use('/wp-content/uploads', function(req, res, next) {
// do stuff with req and call next to continue,
// or use res to end the request early.
});
Existen varios complementos de WordPress para restringir el acceso al contenido o las descargas, principalmente en función de la lógica de estar registrado o no y los privilegios que tiene ese usuario.
La lógica básica detrás de ellos es así:
// Redirect guests
function guest_redirect() {
$guest_routes = array(
'member-login',
'member-account',
'member-register',
'member-password-lost',
'member-password-reset'
);
// Force login or registration
if ( !is_user_logged_in() && !is_page($guest_routes) ) {
wp_redirect( 'member-login' );
exit;
}
}
add_action( 'template_redirect', 'guest_redirect' );
Además, WordPress tiene API REST (documento oficial aquí para su necesidad). Sin embargo, usar algo personalizado para el sitio de producción usando la API REST sin realizar las pruebas adecuadas puede ser arriesgado y complicado de usar.
simonluca landi
Por lo que entiendo sobre su caso de uso de su descripción, puede resolver su problema simplemente usando uno de los muchos complementos de wordpress ya disponibles, por ejemplo, puede usar un “administrador de descargas” para manejar la carga y descarga de los contenidos: https://wordpress.org/support/plugin/download-manager
o usar algo como https://wordpress.org/plugins/descargas-digitales-faciles/
Puedes encontrar más complementos aquí https://wordpress.org/plugins/
Si realmente desea escribir algo personalizado, puede agregar el uso de una regla de reescritura para enviar todas las solicitudes de la carpeta de carga a través de un script “protect.php”, agregando algo como esto en el archivo .htaccess
RewriteCond %{REQUEST_FILENAME} -s
RewriteRule ^wp-content/uploads/(.*)$ protect.php?filename=$1 [L,QSA]
En el script protect.php puede implementar su lógica personalizada para permitir/prohibir el acceso al “nombre de archivo” específico
Para usar las funciones de WP dentro de su archivo protect.php personalizado, debe incluir wp-load.php, más o menos así:
require_once(rtrim($_SERVER['DOCUMENT_ROOT'], "https://stackoverflow.com/") . '/wp-load.php');
-
Gracias por la respuesta, no estoy seguro de por qué tomó tanto tiempo que alguien respondiera. Miré otros complementos, pero para mis necesidades realmente necesito algo personalizado. También estoy usando Nginx, no Apache, ¿podría mostrarme un ejemplo en Nginx? ¿También podría acceder a la biblioteca de WordPress y al usuario actualmente conectado desde este otro script?
– chrispytoes
2 de agosto de 2017 a las 16:19
-
Nunca usé Nginix, pero puede leer cómo convertir las reglas de apache en reglas de nginix aquí: nginx.com/blog/converting-apache-to-nginx-rewrite-rules
– Simonluca Landi
02/08/2017 a las 19:52
No puede agregar ningún middleware porque WordPress no tiene ninguna abstracción de solicitud/respuesta en absoluto. La única posibilidad es escribir un complemento personalizado que reaccione ante una acción determinada. Puede obtener más información sobre las acciones de wp en los documentos oficiales.
– emix
2 de agosto de 2017 a las 19:58