April 2, 2019

Controlar por rol de usuario los tipos de ficheros permitidos

Antes de abordar el código para controlar los tipos de ficheros, lo primero es saber que desde el backend de WordPress de manera nativa se pueden subir diferentes ficheros además de imágenes que es lo usualmente usado, pudiendo subir: imágenes, documentos, audio y vídeo.

Dicho esto, lo que tienes que tener en cuenta es que el tipo de ficheros que puedes subir está limitado, como por ejemplo a NO poder subir ficheros del tipo SVG por cuestión de seguridad.

Por defecto WordPress NO permite subir ficheros SVG ya que estos podrían contener en su interior codigo malicioso sin que el usuario que lo sube fuera consciente de ello, siendo este el motivo de que no sean permitidos… aunque bajo nuestra responsabilidad podemos hacer que sí se pueda. 🙂


MIME

WordPress tiene establecidos los tipos de ficheros permitidos en base a los tipos MIME, que sirven para clasificar los tipos de archivos y las diferentes extensiones de fichero.

Multipurpose Internet Mail Extensions o MIME (en español «extensiones multipropósito de correo de internet») son una serie de convenciones o especificaciones dirigidas al intercambio a través de Internet de todo tipo de archivos (texto, audio, vídeo, etc.)

Wikipedia

Los tipo MIME sirven para que por ejemplo un navegador sea capaz de determinar que tanto un archivo .png como un archivo .jpeg los trate ambos archivos como imágenes en lugar de videos u otro tipo de archivo.

Si acudes a la documentación de WordPress «uploading_files» puedes ver los que se permiten subir por defecto: imágenes, documentos, audio y vídeo, así como todos los tipos de ficheros de cada uno de ellos ( aunque también podrías tener una limitación por servidor ) :

  • Imágenes:
    .jpg
    .jpeg
    .png
    .gif
    .ico
  • Documentos:
    .pdf (Portable Document Format; Adobe Acrobat)
    .doc, .docx (Microsoft Word Document)
    .ppt, .pptx, .pps, .ppsx (Microsoft PowerPoint Presentation)
    .odt (OpenDocument Text Document)
    .xls, .xlsx (Microsoft Excel Document)
    .psd (Adobe Photoshop Document)
  • Audio:
    .mp3
    .m4a
    .ogg
    .wav
  • Vídeo:
    .mp4, .m4v (MPEG-4)
    .mov (QuickTime)
    .wmv (Windows Media Video)
    .avi
    .mpg
    .ogv (Ogg)
    .3gp (3GPP)
    .3g2 (3GPP2)

Usando la función wp_get_allowed_mime_types(), puedes obtener una lista de tipos de MIME permitidos y extensiones de archivo. Recuerda que esta tarea de mostrar resultados de funciones la puedes hacer mejor usando la función de ayuda d() que tienes disponible en el plugin development helper.


Controlando los tipos de ficheros permitidos

Como siempre WordPress tiene un comportamiento nativo que se puede alterar con el uso de hooks de tal modo que podamos personalizarlo a nuestra conveniencia.

Con el siguiente código puedes ver un modo completo de personalizarlo situando el código en un plugin o child theme propio:

add_action( 'after_setup_theme', function(){

	add_filter( 'upload_mimes', function( $mimes ){

		$user = wp_get_current_user();

		if( 'administrator' === $user->roles[0] ){
			$mimes = array_merge( $mimes, [
                'ac3' => 'audio/ac3',
                'mpa' => 'audio/MPA',
                'flv' => 'video/x-flv',
                'svg' => 'image/svg+xml'
            ] );
		} else {
			unset( $mimes['svg'] );
		}

		return $mimes;

	} );

} );

pd: se usan funciones anónimas para evitar tratar con prefijos y nombres de funciones

  • En primer lugar se recomienda hacer uso del hook after_setup_theme para que nuestra acción se realice anulando otras posibles acciones que pudieran ocurrir antes, como por ejemplo que un theme permita añadir SVG cuando nosotros realmente es algo que queremos controlar a quien permitirlo.
  • El siguiente hook usado es de tipo filtro upload_mimes y es el que se usa para obtener un «array» con todos los tipos de ficheros permitidos por WordPress y así poder alterarlo. Recuerda siempre hacer «return» de la variable, ya que se trata de un filtro.
  • La parte donde se añaden tipos de ficheros permitidos es cuando se hace el array_merge en el que se incluyen en el ejemplo 4 tipos.
  • La parte donde se eliminan tipos de ficheros permitidos es cuando se hace un unset de un posible tipo que pudiera estar añadido por el theme u otro plugin, pero no queremos que se permita su subida por seguridad.
  • Destacar que se hace un condicional en función del rol de usuario que se encuentra en ese momento registrado, para según el ejemplo planteado permitir a los administradores subir 4 tipos nuevos de contenido como el SVG, pero asegurarnos que no lo podran hacer el resto.

Partiendo del código de ejemplo podrás hacer facilmente todas las variaciones que necesites según el proyecto en cuestión, pudiendo situar este código en un plugin propio, el cual puedes iniciar desde el boilerplate de SumaPress.

Si te ha gustado... ¡Compártelo!