9. Metadatos

Los metadatos, por su definición, son información acerca de información. En el caso de WordPress, es información asociada con el contenido en las tablas de comentarios, artículos o usuarios. Desde WordPress 4.4, también puedes tener metadatos de los ‘term’.

Un ejemplo podría ser un tipo de contenido llamado ‘productos’ con un campo de metadatos para el precio. Este campo se guardaría en la tabla postmeta.

Dada la relación varios a uno de los metadatos en WordPress, tus opciones son prácticamente ilimitadas. Puedes tener tantas meta-opciones como quieras, y puedes guardar en ellas cualquier cosa.

Este capítulo trata sobre cómo ‘crear la interfaz de usuario del panel de administración para la selección de metadatos’, funciones o ‘selección y recuperación de metadatos’, y el proceso de ‘impresión de los metadatos’ en el front-end de tu sitio web.

 

Crear y gestionar metadatos de artículos

Añadir metadatos

Añadir metadatos se puede hacer fácilmente con add_post_meta() busca un post_id, un meta_key, un meta_value y un flag únicos.

El meta_key es como tu plugin referenciará el valor meta en otra parte de tu código. Cualquier cosa como mycrazymetakeyname funcionará, pero mejor emplear un prefijo relacionado con el nombre de tu plugin o tema y una descripción de la clave será más útil. t1k_featured_menu sería bueno. Hay que notar que el mismo meta_key puede ser utilizado varias veces para guardar variaciones de los metadatos.

El meta_value puede ser una cadena, entero, o matriz. Si es una matriz, será automáticamente serializada antes de guardarla en la base de datos.

El flag único te permite declarar si esta clave puede ser única. Una clave no única puede ser algo como un articulo puede tener múltiples, como precio. Puedes tener diversas variaciones de precio basadas, p.ej., en la talla.

En el otro lado, si tu solo quiere un precio para un artículo lo puedes hacer único y el meta_key sólo se podrá usar una vez.

 

Actualizar metadatos

Si una clave ya existe y quieres actualizarla, utiliza update_post_meta(). Si utilizas esta función y la clave no existe, entonces la creará, como si hubieras utilizado add_post_meta() con flag no único.

Similar a add_post_meta(), quiere un post_id, meta_keymeta_value.

 

Borrar metadatos

delete_post_meta() toma un post_id y meta_key, y opcionalmente un meta_value. Hace exactamente los que estás pensando.

 

Carácter de escape

Los valores meta de los posts se pasan a través de la función stripslashes() al ser guardados, por lo que necesitas ser cuidadoso al pasar valores (como JSON) que incluyen caracteres de escape. No guardar los valores escapados.

Considera el valor JSON {“key”:”value with \”escaped quotes\””}:

Solución

Añadiendo un nivel más de escapado, mediante la función wp_slash() (introducida en WP 3.6), puedes compensar la llamada a stripslashes():

 

Campos ocultos de usuario

Si eres un desarrollador de plugins o temas y estás pensando en utilizar campos de usuario para guardar parámetros relaciones con tu plugin o tema, es interesante notar que WordPress no mostrará los campos personales que tengan claves que empiecen con “_” (subrayado) en la lista de campos personales en el editor de pantalla de artículos o cuando se utilice la función de plantilla the_meta(). Esto puede, por ejemplo, utilizarse para mostrar estos campos personales en una manera inusual utilizando la función add_meta_box().

El ejemplo siguiente:

añadira un único campo personal con el nombre clave ‘_color’ y el valor ‘red’ pero este campo personal no se mostrará en la pantalla de edición del post.

 

Matrices ocultas

Adicionalmente, si el argumento $meta_value es una matriz, no se mostrará en la pantalla de edición de página, incluso si no prefijas el nombre clave con un subrayado.

 

Crear meta boxes personales

¿Qué es un meta box?

Cuando un usuario edita su artículo, la pantalla de edición está compuesta de diferentes cajas por defecto: editor, publicar, categorías, etiquetas, etc. Estas cajas son meta boxes. Los plugins pueden añadir meta boxes personales en cualquier pantalla de edición de cualquier tipo de post, como artículo, página, vínculo, tipos de post personales y otros. El contenido de los meta boxes personales son generalmente elementos de formularios HTML donde el usuario introduce datos relativos a un propósito del plugin, pero el contenido puede ser prácticamente cualquier HTML que desees.

 

¿Porqúe utilizar meta boxes?

Los meta boxes son elementos de la pantalla de edición manejables, flexibles, modulares, que pueden utilizarse para recoger información sobre el post que está siendo editado. Tu meta box personal estará en la misma pantalla como toda la otra información relacionada con el post, por lo que se establece una clara relación con el mismo.

Los meta boxes son fácilmente ocultables de usuarios que no los necesitan, y visibles para los que sí. Los meta boxes se pueden disponer para el usuario en la pantalla de edición. Son libres de disponer la pantalla de edición de manera que la ajusta, dando a los usuarios un cierto sentido de control sobre el entorno.

 

¿Cómo creo un meta box?

Crear un meta box para tu plugin tiene tres elementos básicos: salida de los elementos del formulario HTML, guardado de valores introducidos, y revisión de los mismos. Una vez estos tres elementos están dirigidos, símplemente engancha en la acción add_meta_boxes y haz una llamada a add_meta_box().

También se ilustra en este ejemplo el añadir la meta box a la pantalla de edición de múltiples tipos de post.

 

El formulario

Los elementos de formulario HTML, etiquetas y otros elementos relacionados se muestran desde una función de llamada de vuelta que tú defines. El nombre de la función se pasa a la función add_meta_box() como el parámetro de la llamada de vuelta. Aquí un simple función de llamada de vuelta que genera el meta box de ejemplo mostrado anteriormente. Aprecia que no existe botón submit en este ejemplo. Cualquier elemento de formulario  meta box esta incluido dentro de las etiquetas del formulario de la pantalla de edición, luego algunos valores de usuarios son enviados (POST) con el resto de la información del post cuando el usuario clica en los botones ‘Publicar’ o ‘Actualizar’ de la pantalla de edición. Este trozo de código particular tiene un fallo lógico que se explicará más adelante, pero muestra correctamente los elementos de formulario por defecto.

NOTA: Este trozo de código, y todos los ejemplos en esta página, son para ilustrar el uso de meta boxes. El código no es útil para entornos de producción porque las operaciones relacionadas como saneado, seguridad e internacionalización se han omitido intencionadamente. Asegurate de dirigir siempre estas importantes operaciones en tu código de producción.

El ejemplo mostrado aquí sólo contiene un campo de formulario, una lista desplegable. Puedes crear tantos campos como necesites en cualquier meta box particular. Si tienes muchos campos para mostrar, considera la opción de emplear múltiples meta boxes, agrupando juntos los campos similares en cada meta box. Esta ayuda hace la página más organizada y agradable visualmente.

 

Guardar valores

Por supuesto, no está bien recoger datos del usuario si no se guardan en algún lugar. Cuando un tipo de artículo se guarda o actualiza, se ejecutan algunas acciones, cualquiera de las cuales son apropiadas para enganchar el salvador de los valores introducidos. En este ejemplo, empleamos ‘save_post‘, pero otros ganchos pueden ser más apropiados para ciertas situaciones. Asegúrate que ‘save_post‘ se ejecutará más de una vez para un evento de actualización singular. Estructura tu enfoque para guardar los datos acordemente.

Guarda los datos introducidos en cualquier lugar que tenga sentido para ti. Desde que estas probablemente trabajando con datos relaciones con el tipo de post que se está editando, la tabla postmeta es generalmente un buen lugar para guardar los datos. Pero si tiene sentido guardar los datos en otro lugar, hazlo sin problemas.

Además del saneado y la seguridad, los permisos de usuario deben ser chequeados antes de guardar los datos en el código en producción.

 

Recuperar valores

Finalmente, no sería lógico guardar datos si no los recuperamos y los utilizamos. Simplemente cógelo de donde lo guardaste. Si lo guardaste en la tabla postmeta, puedes recuperarlo con get_post_meta(). Un lugar en el que seguramente querrás mostrar los datos es en el contenido de un meta box. Así, los campos de formulario se les puede asignar un valor previo con los valores actualmente guardados. La función de llamada de vuelta original mostrada a continuación tiene un flujo lógico, muestra un elemento de formulario con un valor por defecto si éste estaba guardado:

 

Operaciones no visibles

Hay más acerca de los meta boxes que los tres elementos anteriormente mencionados, pero estos elementos extra funcionan generalmente encubiertos. No necesitas ser consciente de estas operaciones, pero debes conocerlas.

Cuando una pantalla de selección de un tipo de post quere mostrar todos los meta boxes que hemos añadido, simplemente llama do_meta_boxes(). Esta función crea un ‘loop’ que llama a cada meta box que hayamos añadido, mostrándolo en pantalla.

 

Variantes

El método procedimental más común de implementar los meta boxes es el que hemos mostrado hasta aquí. Algunos desarrolladores de plugins encuentran la necesidad de implementarlos de otra manera.

 

Clases

Añadir meta boxes mediante una clase de objetos requiere enfoques diferentes, si bien el concepto básico no cambia. Añadir el meta box, mostrar el formulario, y guardar los valores de los campos, funcionalmente se definen como métodos de la clase. Estos métodos se añaden a ganchos acciones mediante el método __construct() de la clase donde la llamada de vuelta add_action() se pasa mediante el formato de método de clase: add_action( ‘action_tag’, array( $this, ‘method_name’ ) ). Finalmente, se instancia la clase mediante new class_name(); en una función de llamada de vuelta a la acción “load-{$page_hook}”. Para meta boxes de posts, $page_hook será lo mismo en post.phppost-new.php. Ambas acciones se pueden enganchar. El siguiente código es equivalente al código PHP para crear el siguiente emplo de meta box mediante un objeto de clase:

¿Observas los nombres de métodos genéricos? Una buena práctica de utilizar clases en plugins es que puedes utilizar propiedades genéricas, lógicas, y nombres de método sin el problema de los conflictos de nombre encontrados en el código procedimental.

 

AJAX

El comportamiento por defecto de un meta box es enviar los datos de formulario con POST con el resto de los elementos de la pantalla de edición del post. En muchos casos se requiere la respuesta más inmediata a la acción de un usuario. En algunos casos puedes proveer un vínculo o botón gráfico dentro del meta box para que lo clique el usuario. En nuestro ejemplo, el evento puede cambiar. Cuando ocurre el click o cambia el evento, se puede hacer una consulta AJAX y se puede actualizar inmediatamente el contenido de la pantalla para reflejar la respuesta del servidor.

Un ejemplo de script jQuery del lado cliente que realiza una consulta AJAX cuando se cambia la opción del select, entonces modifica el HTML de un elemento con el ID “myother_field” con la respuesta del servidor. Este elemento está presumiblemente en algún otro lugar de la pantalla y no dentro del meta box en este ejemplo en particular, ya que el elemento no se encuentra en el ejemplo.

Aquí vemos el script PHP del lado servidor que encadena el anterior script jQuery en la pantalla de edición del post. Nuestro script se encuentra en el fichero myjquery.js y se ubica en la subcarpeta /js/ de la carpeta del plugin principal.

Observa que localizamos (wp_localize_script) la URL a admin-ajax.php en lugar de utilizar la variable global ajaxurl. Algunos desarrolladores prefieren este sistema, porque ajaxurl no está disponible para los scripts del front-end. Una versión localizada está disponible en todos los contextos. Finalmente, aquí está el código PHP que actualmente gestiona la consulta AJAX. En este caso, la opción de texto seleccionada se utiliza como una clave de matriz para coger un valor de la matriz guardada en la tabla de opciones. Se envia entonces al navegador como respuesta.

Como recordatorio final, este básico ejemplo de código ha omitido las importantes operaciones de seguridad, permisos, saneado, etc. Asegúrate que tu código de producción incluye estas operaciones. Revisa la sección ‘Mejorar UX con AJAX’ de este manual y el Codex para más información sobre AJAX.

 

Eliminar meta boxes

Puede ser que necesites eliminar un meta box de la pantalla de edición. Utiliza remove_meta_box() para hacerlo. Los parámetros pasados deben ser los utilizados para añadirlo. Para eliminar meta boxes preexistentes del sistema, verifica el código fuente. Las llamadas por defecto de add_meta_box() se realizan desde el fichero wp-includes/edit-form-advanced.php.

 

Más información

 

Mostrar los metadatos

Existen dos funciones muy sencillas para acceder a tus metadatos para mostrarlos por pantalla.

 

get_post_meta()

Esta función tanto te dará acceso directo a una meta-clave singular, como te dará una matriz asociativa a todos los meta-items de un post dado.

Ambas instancias requieren un post_id. Si además pasas un nombre clave, te devuelve el valor para dicha clave.

Un ejemplo:

<?php $key_1_values = get_post_meta( 76, ‘key_1’ ); ?>

Devuelve:

  • Si sólo se pasa $id, devolverá todos los valores meta en una matriz asociativa.
  • Si no se le pasa $id, devuelve una matriz conteniendo todos los valores de la clave especificada.
  • Si se le pasan ambos parámetros devuelve el primer valor de la clave especificada.

 

get_post_custom()

Esta función devuelve una matriz multi-dimensional con todos los campos personales de un artículo o página particulares.

$meta_fields = get_post_custom( get_the_ID() );

El contenido devuelto será así:

Puedes obtener un único valor así:

echo $meta_fields[‘_my_custom_field’][0];

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *