Editamos la lista de archivos que se pueden subir

Cómo añadir o limitar los tipos de archivos y extensiones que podemos subir desde WordPress

Tal como viene configurado WordPress por defecto, desde el area de administración podemos subir al servidor archivos de imágenes, documentos como PDFs, de Word, Pages, OpenOffice e incluso archivos de audio, midi y vídeo. Esta es la lista de extensiones de archivos más utilizados que acepta, si no hemos hecho ninguna modificación:

Archivos permitidos en WordPress:

  • Imágenes: jpg, jpeg, gif, png, bmp, tiff, psd
  • Documentos: txt, csv, ics, rtx, css, js, html, pdf, doc, docx, pps, ppt, xls, xlsx, pptx, odt, numbers, pages
  • Audio: mp3, m4a, wav, ogg, midi
  • Video: wmv, avi, divx, flv, mov, mpeg, mp4, ogv, mkv, 3gp
  • Archivos comprimidos: tar, zip, gzip, rar, 7z

Para mejorar la seguridad y evitar que se suban al servidor archivos potencialmente peligrosos, además de las restricciones de WordPress, puede haber también limitaciones del proveedor de alojamiento, como por ejemplo que no permita ciertas extensiones, o que esté limitado el tamaño de los archivos que podemos subir.

Información relacionada: Cómo limitar el tamaño de las imágenes que se suben a WordPress

Cuando el usuario intenta subir un archivo que no está en esta lista, le aparece un mensaje de error: “Ha habido un error al subir “nombre-del-archivo”. Perdona, por razones de seguridad, este tipo de archivos no está permitido.

Para evitar o conseguir que aparezca este error, podemos ampliar, sustituir o limitar esta lista fácilmente según las necesidades del proyecto.

Cómo saber qué tipos de archivo puedo subir a WordPress

Para obtener la lista completa de archivos y extensiones permitidas se utiliza la función get_allowed_mime_types(). Este fragmento nos imprimirá todas las extensiones y tipos de archivo que podemos subir:

$mime_types = get_allowed_mime_types();
$types = array();
foreach ( $mime_types as $extension => $mime ) {
	echo $extension . ' (' . $mime . ')' . "\n";
}

Cómo añadir tipos de archivo a la lista de extensiones permitidas

Si queremos permitir que WordPress accepte algún archivo que no esté en su lista, podemos incluir nuevas extensiones, conservando la lista original. Para ello se utiliza el filtro “upload_mimes”. La función sería:

function custom_add_upload_mimes( $mime_types=array() ) {

	// Incluimos nuevos tipos de archivo
    $mime_types['fh'] = 'image/x-freehand'; // Archivos FreeHand MX
	$mime_types['kml'] = 'application/vnd.google-earth.kml+xml'; // Archivos KML de Google Earth 

	return $mime_types;

}
add_filter( 'upload_mimes', 'custom_add_upload_mimes' );

El filtro “upload_mimes” se utiliza para modificar la lista de extensiones de archivos permitidos que WordPress acepta al subir objetos (tanto desde el botón “Añadir objeto” al editar páginas o entradas, como desde Medios > Añadir nuevo).

El ejemplo anterior se integra con la lista original de extensiones y permite incluir nuevos tipos de archivo, concretamente .fh (Freehand) y .kml (Google Earth), además de los permitidos por defecto. Es decir que, si volvemos a imprimir la lista completa del primer ejemplo, veremos que estas extensiones se han añadido al final de la lista.

El primer parámetro en la linea 10 (add_filter) es el nombre del filtro (upload_mimes) y el segundo, el nombre que hayamos dado a la función que se encarga de alterar la lista. Esta función podemos llamarla como queramos (en este caso “custom_add_upload_mimes”) y habrá que incluirla en algún archivo de funciones del tema activo (por ejemplo, functions.php).

Para poder incluir nuevos archivos es necesario conocer el tipo de MIME (Internet Media Type) de cada formato, es decir, el identificador que nos indica el tipo de datos que contiene el archivo (por ejemplo: “image/jpeg”, “application/pdf”, etc). Aquí encontrarás una lista muy completa de tipos de archivos: http://www.freeformatter.com/mime-types-list.html

Cómo eliminar un tipo de archivo de la lista por defecto de WordPress

Si por el contrario lo que queremos es limitar la lista de archivos permitidos, es decir, que el usuario no pueda subir un tipo de archivo determinado (por ejemplo, vídeos) utilizaríamos el mismo filtro “upload_mimes” con una función como esta:

function custom_remove_upload_mimes( $mime_types=array() ) {

	// Eliminamos archivos que no queremos que se suban
	unset( $mime_types['mov|qt'] ); // Vídeos con la extensión .mov
    unset( $mime_types['mp4|m4v'] ); // Vídeos con la extensión .mp4
    unset( $mime_types['avi'] ); // Vídeos con la extensión .avi
    unset( $mime_types['mpeg|mpg|mpe'] ); // Vídeos con la extensión .mpg

	return $mime_types;

}
add_filter( 'upload_mimes','custom_remove_upload_mimes' );

En este caso hemos eliminado la posibilidad de subir vídeos desde WordPress de tipo MP4, MOV, AVI y MPG. Por supuesto, esto no afecta a la gestión de archivos a través de FTP, sólo a los que se suben desde el gestor de contenidos. El resto de extensiones no se ven afectadas por esta función.

Cómo limitar los tipos de archivo sustituyendo la lista original de extensiones permitidas

Si sólo queremos permitir algunos tipos de archivo determinados, por ejemplo imágenes y documentos PDF, eliminando todos los demás, lo más fácil sería crear una lista nueva de extensiones permitidas, sustituyendo a la que WordPress trae por defecto, así no tenemos que eliminar las extensiones una a una. En este caso, la función quedaría así:

function restrict_mime_types_list( $mime_types ) {
	$mime_types = array(
		'jpg|jpeg|jpe' => 'image/jpeg',
        'gif' => 'image/gif',
        'png' => 'image/png',
        'pdf' => 'application/pdf'
    );
    return $mime_types;
}
add_filter( 'upload_mimes', 'restrict_mime_types_list' );

A diferencia de los ejemplos anteriores, esta función no añade ni elimina extensiones individualmente, sinó que crea una lista nueva de extensiones permitidas (sólo JPG, JPEG, GIF, PNG y PDF). Si el usuario intenta subir cualquier otro tipo de archivo (vídeos, comprimidos, imágenes BMP, TIFF, documentos de Word, etc), le aparecerá el mensaje de error “Ha habido un error al subir…”.

Comentarios

  1. Excelente post y muy buen aporte. Un saludo.

  2. Oriol

    Entiendo que estos cambios los haces en el archivo function.php del tema. Correcto? No encuentro el archivo que modificas. Gracias sin embargo por el post. Útil y necesario.

  3. Daniel

    Hola Oriol.
    Sí, estas funciones pueden incluirse directamente en el archivo “functions.php” del tema, o bien crear un archivo PHP aparte con funciones específicas (por ejemplo, en este caso podría llamarse “media.php”) enlazado desde funcions.php. También se puede crear un plugin de funciones, para separar la funcionalidad del tema. Depende de cómo lo quiera organizar cada uno.

  4. Miguel Angel

    Hola, tengo una duda sobre WordPress, tengo una pagina creada en html5 y aparte podría tener instalado WordPress en mi servidor…gracias y un cordial saludo.

  5. Daniel

    Hola Miguel Angel.
    Puedes seguir con la web estática y utilizar WordPress para tener una sección dinámica en la web (por ejemplo Blog, Noticias…). Si te refieres a pasar toda la web de HTML a WordPress y poder gestionar las páginas desde el panel de control, en ese caso habría que montar una plantilla nueva e integrar toda la funcionalidad de tu web actual.

  6. Serena

    Excelente!! mil gracias!!
    No me quedó claro si al agregar la función: custom_add_upload_mimes, es necesario también antes la parte de: get_allowed_mime_types().
    No encontré en la lista que adjuntas, los mime types de dos tipos de archivo (.ai y .studio), supongo que si los comprimo en zip, o rar podría subirlos, no?

  7. Daniel

    Hola Serena.
    No es necesario definir cada vez la variable $mime_types = get_allowed_mime_types().

    Para permitir otros tipos de archivo como Illustrator (.ai) habría que incluirlos primero en la lista, o bien comprimirlos, para que el archivo que se sube sea ZIP, RAR, etc.

  8. dante

    Hola, como hago para que los usuarios no puedan subir multimedia, nada mas postear texto?

  9. Daniel

    Hola Dante.
    Aquí encontrarás información sobre cómo desactivar la subida de archivos, ocultar botones de subida, ocultar accesos desde el menú, etc: http://www.danielnabil.com/blog/desactivar-subida-archivos-usuarios-wordpress/

  10. Ana

    Buenisimo articulo!! Muchas gracias por compartirlo :-)

Y tú qué opinas?

Las URLs se convertirán en enlaces automáticamente. Tu dirección de email no se publicará ni se utilizará para enviar ningún tipo de información. Los mensajes que no aporten nada al tema que se trata en esta entrada se borrarán. Las imágenes que aparecen al lado de cada autor utilizan el servicio de Gravatar. Recuerda que puedes usar etiquetas HTML como <a href>, <code>, <em> o <strong> en los comentarios.

(necesario)

(opcional)