4 Hacks Prácticos De La Biblioteca Multimedia WordPress

Por , Actualizado: marzo 13, 2017
Traducido por Daniel Harfouch

hacks-biblioteca-multimedia-wordpress

La Biblioteca Multimedia WordPress es una poderosa herramienta que facilita la carga, edición y eliminación de imágenes y otros medios. Además, permite filtrar, seleccionar, incluir medios en publicaciones y páginas, con leyenda, descripción y texto alternativo, generando el código HTML necesario.

biblioteca multimedia wordpress
La página de administración de la Biblioteca Multimedia WordPress

La mayoría de las veces, la Biblioteca Multimedia WordPress cubre los requisitos más comunes de un administrador de sitio, y no tenemos que agregar nuevas funcionalidades. De todos modos, en caso de que necesitamos mejorar las características específicas, WordPress proporciona una serie de funciones y ganchos que nos permiten dar más poderes a la Biblioteca Multimedia sin el uso de plugins de terceros. Por lo tanto, en esta publicación vamos a bucear en estas funciones y ganchos con cuatro ejemplos prácticos.

Hacks de la Biblioteca Multimedia WordPress

Aquí está nuestra tabla de contenidos:

Tipo de Publicación de Adjunto y Megadatos

Cada vez que subimos un archivo multimedia, WordPress genera un tipo de post de adjunto. Al igual que cualquier otro tipo de publicación, los archivos adjuntos se registran en la tabla wp_posts, y los respectivos metadatos en la tabla wp_postmeta.

  • La tabla wp_posts almacena datos como post_content (descripción de adjunto), post_excerpt (leyenda de adjunto), post_author, post_title, post_status, post_mime_type.
  • La tabla wp_postmeta almacena cualquier tipo de metadatos, como URL de archivo adjunto, dimensiones de imagen y tipos mime, metadatos EXIF e IPTC.
detalles_adjuntos
El panel de detalles de adjuntos predeterminado

De vez en cuando necesitará agregar metadatos personalizados a los archivos adjuntos, como el nombre del autor de un documento o una URL asociada. Agregar campos meta a los archivos adjuntos es un poco diferente de agregar campos meta a los mensajes, y tenemos que usar ganchos y funciones específicas. Primero, tenemos que agregar todos los campos personalizados necesarios a la pantalla Editar medios. Podemos realizar esta tarea filtrando los campos de adjuntos disponibles a través del filtro attachment_fields_to_edit:

function media_hacks_attachment_field_to_edit( $form_fields, $post ){

	// https://codex.wordpress.org/Function_Reference/wp_get_attachment_metadata
	$media_author = get_post_meta( $post->ID, 'media_author', true );
    
	$form_fields['media_author'] = array(
		'value' => $media_author ? $media_author : '',
		'label' => __( 'Author' )
	); 
	return $form_fields;
}
add_filter( 'attachment_fields_to_edit', 'media_hacks_attachment_field_to_edit', 10, 2 );

La función mantiene dos argumentos: la formación $form_fields de campos de forma y el objeto $post. Primero, get_post_meta recupera la información existente del valor ‘media_author’ , después un elemento ‘media_author’ es añadido a la formación $form_fields. Finalmente, la devolución de llamada devuelve $form_fields (ver el código en Gist)

pantalla_editar_medios
El campo personalizado tal como aparece en la parte inferior de la pantalla de Editar medios

El siguiente paso es guardar la entrada del usuario. Podemos realizar esta segunda tarea conectando una nueva función a la acción edit_attachment:

function media_hacks_edit_attachment( $attachment_id ){
	if ( isset( $_REQUEST['attachments'][$attachment_id]['media_author'] ) ) {
    
		$media_author = $_REQUEST['attachments'][$attachment_id]['media_author'];
    
		update_post_meta( $attachment_id, 'media_author', $media_author );
	}
}
add_action( 'edit_attachment', 'media_hacks_edit_attachment' );

Esta función mantiene sólo un argumento: el $attachment_id del archivo de medios actual. En primer lugar, la función comprueba si se ha enviado un valor válido para el meta campo personalizado, luego registra el valor gracias a la función update_post_meta (ver el código en Gist). Ahora, podemos recuperar el valor ‘media_author’ gracias a la función get_post_meta y mostrarla en cualquier parte en el lado frontal:

$media_author = get_post_meta( $post->ID, 'media_author', true );

Cómo Mostrar Metadatos de EXIF e IPCT en la Pantalla de Editar Medios

WordPress almacena automáticamente los metadatos extendidos para tipos mime JPEG y TIFF, y ahora que sabemos cómo agregar campos a la pantalla de Editar Medios, podemos usar lo que hemos aprendido para mostrar estos datos. Para llevar a cabo esta tarea, tenemos que cambiar la primera función de devolución de llamada como sigue:

function media_hacks_attachment_fields_to_edit( $form_fields, $post ){

	// get post mime type
	$type = get_post_mime_type( $post->ID );

	// get the attachment path
	$attachment_path = get_attached_file( $post->ID );

	// get image metadata
	$metadata = wp_read_image_metadata( $attachment_path );

	if( 'image/jpeg' == $type ){

		if( $metadata ) {

			$exif_data = array(
				'aperture'          => 'Aperture', 
				'camera'            => 'Camera', 
				'created_timestamp' => 'Timestamp',
				'focal_length'      => 'Focal Lenght', 
				'iso'               => 'ISO', 
				'shutter_speed'     => 'Exposure Time', 
				'orientation'       => 'Orientation' );

			foreach ( $exif_data as $key => $value ) {

				$exif = $metadata[$key];
				$form_fields[$key] = array(
					'value' => $exif ? $exif : '',
					'label' => __( $value ),
					'input' => 'html',
					'html'  => "<input type='text' class='text' readonly='readonly' name='attachments[$post->ID][$exif]' value='" . $exif . "' /><br />" 
				);
			}
		}
	}
	return $form_fields;
}
add_filter( 'attachment_fields_to_edit', 'media_hacks_attachment_fields_to_edit', 10, 2 );

Aquí usamos las siguientes funciones de WordPress:

Si el tipo de imagen mime es ‘image/jpeg’, y si existen metadatos, entonces declaramos una matriz de metadatos necesarios y creamos un campo de formulario para cada elemento de la matriz. Los campos de formulario de este ejemplo son un poco más complejos, ya que estamos estableciendo un valor para el elemento de formulario ‘html’ (ver el código en Gist).

detalles_adjunto_exif
La imagen muestra metadatos EXIF en campos de forma de sólo lectura

No es necesario guardar los metadatos EXIF e IPCT, ya que WordPress los almacena automáticamente en la tabla wp_postmeta al cargar imágenes.

Mostrar Metadatos Extendidos en el Front-End

Tenemos una serie de posibilidades para incluir metadatos en el contenido de la publicación (descripción del adjunto). Podemos anexarlos al contenido gracias al filtro the_content, o podemos crear un archivo de plantilla en un tema derivado de acuerdo con la Jerarquía de Plantillas (Template Hierarchy). La función siguiente agrega metadatos a la descripción del adjunto:

function media_hacks_the_content( $content ){
	global $post;

	if( is_attachment() && 'image/jpeg' == get_post_mime_type( $post->ID ) ) {

		$fields = wp_get_attachment_metadata( $post->ID );
		$meta = $fields['image_meta'];

		if( ! empty( $meta['camera'] ) ){
			$custom_content = "
			<ul>
				<li>Camera: {$meta['camera']}</li>
				<li>Created timestamp: {$meta['created_timestamp']}</li>
				<li>Aperture: {$meta['aperture']}</li>
				<li>Focal length: {$meta['focal_length']}</li>
				<li>ISO: {$meta['iso']}</li>
				<li>Shutter speed: {$meta['shutter_speed']}</li>
				<li>Orientation: {$meta['orientation']}</li>
			</ul>";
			$content .= $custom_content; 
		}
	}
	return $content;
}
add_filter( 'the_content', 'media_hacks_the_content' );

Aquí llamamos a la función wp_get_attachment_metadata (vea el Codex para la lista completa de datos devueltos). Si el tipo de publicación actual es ‘attachment’, y si el tipo mime actual es ‘image/jpeg’, entonces obtendremos los metadatos de imagen disponibles y crearemos una lista desordenada de campos, que se añadirá al contenido de la publicación. La función de devolución devuelve $content (ver este código en Gist).

el_contenido
La nueva descripción del adjunto en Twenty Seventeen

Cómo Mostrar un Archivo Fotográfico

Fuera de lo establecido WordPress no muestra archivos de adjuntos. Esto ocurre porque la opción ‘has_archive’ del tipo de post adjunto se establece en false. Además, aunque el parámetro post_status por defecto del objeto $query está establecido en ‘publish’, el archivo adjunto por defecto post_status se establece en ‘inherit’. Esto significa que no se mostrarán adjuntos en archivos, a menos que establezcamos explícitamente la consulta post_status como “inherit” o en ‘any’ (ver WP_Query Type Parameters para más información).

Dicho esto, para mostrar archivos de imágenes, tenemos que definir dos funciones. La primera función filtra los argumentos de un tipo de post especificado y establece la propiedad de un archivo adjunto ‘has_archive’ en true:

function media_hacks_register_post_type_args( $args, $post_type ){
	if( $post_type == 'attachment' ){
		$args['has_archive'] = true;
	}
	return $args;
}
add_filter( 'register_post_type_args', 'media_hacks_register_post_type_args', 10, 2 );

La segunda función establece valores personalizados para las variables de consulta post_mime_type y post_status:

function media_hacks_pre_get_posts( $query ){
	if ( !is_admin() && $query->is_main_query() ) {

		if( is_post_type_archive('attachment') ){
			$query->set('post_mime_type', 'image/jpeg');
			$query->set( 'post_status', 'inherit' );
		}
	}
}
add_action( 'pre_get_posts', 'media_hacks_pre_get_posts' );

La función está enganchada al gancho de acción pre_get_posts, que se activa después de que se ha creado la consulta, pero antes de que se ejecute. El objeto $query se pasa por referencia, no por valor, y esto significa que cualquier cambio en la instancia actual de $query afecta al objeto $query original (lea más en the Codex). Por esta razón, debemos comprobar cuál es la consulta que vamos a cambiar (ver este código en Gist).
Ahora podemos enviar una solicitud como la siguiente:

example.com/?post_type=attachment 

Y WordPress devuelve un archivo de imágenes JPEG.

archivo
Un archivo de imágenes JPEG

El código completo de nuestro ejemplo está disponible como plugin en un Gist público.

Resumen

Fuera de lo establecido, la Biblioteca Multimedia WordPress es una herramienta completa y de gran alcance para la gestión de los medios que cubre generalmente todas sus necesidades como admin del sitio. Pero si necesita más características y funcionalidades, WordPress proporciona ganchos y funciones que nos permiten llevar la Biblioteca Multimedia al siguiente nivel. ¿Ha hackeado ya la Biblioteca Multimedia? Comparta su experiencia con nosotros en los comentarios a continuación.