WordPress Hosting

descarga de archivos wordpress

Cómo forzar la descarga de archivos en WordPress

Quizás no te hayas fijado nunca, pero cuando enlazas a un archivo PDF u de otro tipo desde una entrada o página en tu web WordPress, por defecto se abrirá en el mismo navegador, usando la funcionalidad nativa de visualización de archivos de los navegadores actuales.

Y está muy bien, pero ¿y si tú prefieres que se lo descarguen en vez de que se abra en el navegador?

Pues hoy te voy a mostrar un sencillo truco para conseguir eso, que los archivos se descarguen al hacer clic, en vez de abrirse en la visualizador del navegador.

Cómo forzar la descarga de archivos en vez de que sea abran en el navegador

Lo mejor de todo es que el truco funciona con cualquier enlace a un archivo, ni siquiera es relevante que sea un PDF, y da igual qué editor uses, el de bloques o clásico, es HTML estándar, que reconocen todos los navegadores.

Solo tienes que añadir lo siguiente al HTML del enlace:

download

O, si lo prefieres, semánticamente más correcto:

download=""

Y, ya si quieres, puedes predefinir con qué nombre se descargará el archivo, por ejemplo:

download="nombre-del-archivo-al-descargarlo.pdf"

¿Qué cómo se añade eso? Aquí tienes unos ejemplos de las distintas posibilidades:

Simple:

<a href="https://midominio.com/mi-archivo.pdf" download>Descarga el PDF</a>

Mejor:

<a href="https://midominio.com/mi-archivo.pdf" download="">Descarga el PDF</a>

Forzando nombre del archivo:

<a href="https://midominio.com/mi-archivo.pdf" download="balance-anual-ayudawp-2025">Descarga el PDF</a>

Como te decía al principio, inicialmente la idea es para usarlo con archivos PDF, lo más habitual, pero serviría igual para cualquier otro tipo de archivo que por defecto el navegador muestre en vez de descargarlo, como por ejemplo imágenes y otros.

Cómo forzar la descarga de archivos en el editor de WordPress (bloques y clásico)

Para aplicar este truco en el editor de WordPress lo único es que tienes que editar como HTML el elemento al que quieras forzar la descarga, no hay un campo para añadir esto por defecto:

  • Editor clásico:
    1. Añades el enlace al texto, botón o lo que sea como harías normalmente en el editor visual.
    2. Cambias a la pestaña del editor de código y editas el HTML de la descarga como en los ejemplos.
  • Editor de bloques:
    1. Añades enlace al texto, botón o lo que sea como harías normalmente editando el bloque.
    2. Abres los ajustes del bloque y seleccionas «Editar como HTML» para añadir el parámetro download que prefieras.
      Nota: es posible que el editor te avise de que el bloque tiene contenido inesperado y te anime a recuperarlo, tú ni caso, funciona sin problemas.

Así sería el proceso en el editor clásico:

Y así en el de bloques:

Da igual el editor que uses, simplemente funciona 🙂

A ver … ¿y no podría ser así siempre por defecto, sin tener que andar añadiendo parámetros a los enlaces?

Eso es algo que, antiguamente, cada cual podía configurar en SU navegador, pero si no ha cambiado, actualmente vienen configurados para mostrar los PDF en vez de descargarlos y, que yo sepa, ya no se puede cambiar.

En cualquier caso, no procede, porque aún si se pudiese, es algo que decide el usuario, pero que tú, en principio, no puedes forzar, y de ahí esta guía.

Perooooo, ya que preguntas, como veo que tienes curiosidad, si TÚ, en tu ordenador, quieres forzar la descarga de los PDF en las webs que visitas, da igual como sea el enlace a los mismos, siempre puedes hacer clic derecho en el enlace y elegir la opción de «Guardar enlace como…»

Cómo forzar la descarga automática de archivos

Ahora bien, ahi no acaba la cosa: ¿que lo que quieres es que en tu web los todos enlaces a los PDF – y quizás otros archivos – siempre se descarguen por defecto en vez de visualizarse en el navegador?

Pues sí, se puede, solo hay que forzar este comportamiento añadiendo una bonita regla al archivo .htaccess del servidor, que encontrarás en la carpeta raíz de la instalación de tu WordPress.

La regla sería así:

<FilesMatch "\.(?i)pdf$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>

Con ese código forzamos a que todos los archivos con extensión .pdf, en minúsculas o mayúsculas (para eso el parámetro (?i)), se fuerce la descarga, independientemente de la configuración del navegador.

Un ejemplo en el que incluimos más tipos de archivo sería así:

<FilesMatch "\.(?i)(pdf|zip|docx|xlsx|csv)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>

Si, por el motivo que sea, no tienes acceso al archivo .htaccess, también puedes forzarlo con un código PHP que puedes añadir a tu web usando tu método favorito. Este sería un ejemplo:

/* Forzar descarga de archivos en vez de vista previa en el navegador */
function ayudawp_forzar_descarga_archivos() {
if ( isset($_GET['download']) ) {
$file = $_GET['download'];

// Limitado solo a nombres de archivo simples, sin rutas relativas
$file = basename($file);

// Extensiones de archivo permitidas (puedes cambiar, añadir o quitar)
$allowed_ext = array('pdf', 'zip', 'docx', 'xlsx', 'csv');
$ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));

if ( !in_array($ext, $allowed_ext) ) {
return;
}

// Busca el archivo en la instalación de WordPress
$path = ABSPATH . $file;

if ( file_exists($path) ) {
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $file . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($path));
readfile($path);
exit;
}
}
}
add_action('init', 'ayudawp_forzar_descarga_archivos');

Si lo prefieres – y de hecho te lo recomiendo – es más seguro limitar el forzado a carpetas concretas, no a toda la instalación, como en este otro ejemplo:

/* Forzar descarga de archivos en vez de vista previa en el navegador */
function ayudawp_forzar_descarga_archivos() {
// Ruta base de archivos protegidos, lo puedes cambiar a tu gusto
$base_dir = WP_CONTENT_DIR . '/uploads/descargas/';

// Comprobar que se pasa un archivo por URL, por ejemplo ?download=archivo.pdf
if ( isset($_GET['download']) ) {
$file = basename($_GET['download']); // Evita inyecciones de ruta
$path = $base_dir . $file;

if ( file_exists($path) ) {
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $file . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($path));
readfile($path);
exit;
}
}
}
add_action('init', 'ayudawp_forzar_descarga_archivos');

El código tiene algunas líneas no imprescindibles, como las que fuerzan saltarnos la caché (Cache-Control, Expires, etc.), pero eso lo dejo a tu criterio, funcionar funciona.

Recomendación: mi consejo es que, salvo que lo tengas clarísimo, NO fuerces la descarga globalmente, de todos, sino que lo hagas en según qué archivos, manualmente, respetando la configuración del usuario, pues es a lo que está acostumbrado, y además, siempre puedes darles la opción de descargar los archivos, recordándoles que pueden hacer clic derecho ¿no?

Y nada más, espero que te haya sido útil, o cuanto menos instructivo y hayas aprendido algo nuevo. Aquí me tienes para cualquier duda, sugerencia o consulta 😉

Compartir en redes
Resumir con IA

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en las estrellas para valorarlo!

Promedio de puntuación 5 / 5. Total de votos: 3

¡Todavía no hay votos! Sé el primero en valorar este contenido.

Ya que has encontrado útil este contenido...

¡Sígueme en las redes sociales!

¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!



Sobre el autor

Scroll al inicio