Hoy vuelvo con otro howto o codekata para WordPress. Esta vez es para hacer una descarga de un fichero que no existe, a partir de una URL. Es decir, es una forma de generar contenido de un fichero al vuelo, en forma de fichero y darlo en descarga al navegador que visita WP. En vez de devolver contenido HTML, CSS y JavaScript desde el servidor al navegador que nos visita, devolvemos el contenido de un fichero y le decimos al navegador que nos visita que hay que descargar.
Para hacer esto es simple la idea. Sólo hay que engancharse a un hook de WordPress antes de que se devuelva ninguna respuesta web normal al navegador. Entonces, si la URL de la petición es la que queremos, entonces devolvemos el contenido del fichero, y ponemos los HEADERS en la respuesta para que el navegador se descargue el contenido en forma de fichero.
Al grano, el código fuente
En este codekata sobran demasiadas explicaciones, así que la forma de engancharnos en WordPress al hook init puede ser así:
add_action('init', 'tu_funcion_de_descarga');
Y lo siguiente es lo que hace que WordPress dé en descarga un fichero llamado nombreFichero.txt:
function tu_funcion_de_descarga()
{
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Type: text/plain');
header('Content-Disposition: attachment; filename=nombreFichero.txt');
$file = fopen('php://output', 'w');
fwrite($file,
'Contenido del fichero que vamos a dar en descarga..'.PHP_EOL
);
fclose($file);
exit();
}
Esto si lo ponemos en un tema o en un plugin de WordPress provocará que siempre se descargue este fichero con cada petición que se haga a WordPress. No es lo que queremos claro, así que sólo queda devolver el fichero en descarga sólo cuando queremos.
Se podría hacer de esta forma:
function tu_funcion_de_descarga()
{
if($_SERVER['REQUEST_URI'] == '/ruta/al/fichero/ficticio/que/queramos?param1=value1') {
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Type: text/plain');
header('Content-Disposition: attachment; filename=nombreFichero.txt');
$file = fopen('php://output', 'w');
fwrite($file,
'Contenido del fichero que vamos a dar en descarga..'.PHP_EOL
);
fclose($file);
exit();
}
}
Sólo queda generar el contenido del fichero que queramos. Además, también le podríamos añadir capas de seguridad para restringir el acceso. Es decir, en esta función, se le pueden añadir control por roles o por usuario, devolver ficheros distintos en función del usuario, o no devolver ningún fichero si no está logueado el usuario, y así sucesivamente todo tipo de personalizaciones.. Más información aquí:
https://developer.wordpress.org/plugins/security/
Terminando, y referencias
Resumiendo, WordPress provee de mecanismos muy interesantes y sencillos de usar para hacer todo tipo de personalizaciones a base de hooks. Me remito a la documentación oficial para más información:
https://developer.wordpress.org/plugins/hooks/