Crear bloque personalizado de Gutenberg – Parte 4: Atributos
En esta parte, veremos cómo definir atributos, obtener sus valores y actualizarlos. Con los atributos podemos aceptar la entrada del editor, guardarla y generarla como elijamos. En el paso anterior vimos los componentes de WordPress, dónde encontrarlos y cómo implementarlos. En esta publicación, agregaremos accesorios para hacer la conexión con los atributos: los datos guardados.
Definición de atributos
Los atributos se agregan como objetos en una matriz a la attributes
propiedad en registerBlockType()
. La clave de cada atributo es el nombre del atributo, y debe tener la propiedad type
como mínimo.
La type
propiedad puede ser cualquiera de las siguientes; null
, boolean
, object
, array
, number
, string
, o integer
.
Opcionalmente, puede proporcionar la propiedad default
para definir el valor inicial de su atributo. Si no proporciona un valor predeterminado, el atributo será null
.
Otra propiedad de atributo es source
que funciona junto con la selector
propiedad, pero estas son cosas delicadas que veremos en detalle más adelante.
Por ejemplo, definir dos atributos; exampleText
como cadena y postIds
como matriz, se vería así:
Cualquier cosa que necesite guardar para su bloque (entrada del usuario/editor) requiere un atributo. Depende de usted cómo estructura sus datos, definiendo atributos separados para cada uno o agrupándolos todos en un objeto. Solo será una diferencia en cómo obtienes sus datos y cómo los actualizas.
Obtener valores de atributo
Los atributos están disponibles como accesorios para sus bloques edit
y save
funciones. Si ha seguido esta serie del paso anterior, recuerde que actualizamos las funciones para pasar props como parámetro.
Es común desestructurar los atributos de los accesorios, ya que normalmente se refiere a ellos con frecuencia. Por ejemplo, la salida de un atributo llamado exampleText
se vería así:
Actualizar valores de atributos
Para actualizar atributos tenemos un método disponible en props, llamado setAttributes()
. Esta función acepta un objeto donde puede agregar cualquier atributo que desee actualizar. Puede actualizar solo un atributo, más o todos a la vez. Si tiene varios atributos definidos y llama setAttributes()
para actualizar solo uno de ellos, los otros no se tocan.
Si tiene experiencia con React, probablemente reconocerá inmediatamente las similitudes entre setAttributes()
y setState()
. Funcionan exactamente igual, pero la diferencia es que el estado en React es simplemente algo almacenado localmente en ese componente, y los atributos en realidad se guardan como datos fuera del componente.
Para actualizar un atributo, generalmente destruiría la función de accesorios y la llamaría así: A continuación, actualizamos exampleText
el atributo para que sea "Hola".
const { setAttributes } = props;
setAttributes({ exampleText: 'Hi' });
Naturalmente, ejecutaría setAttributes()
desde dentro alguna acción. Un ejemplo común está dentro de la onChange
propiedad en algún tipo de campo de entrada que se usa para almacenar el valor del exampleText
atributo.
Asegúrese de guardar los atributos en el tipo que ha definido en el atributo. No tendrá suerte tratando de guardar objetos en un atributo de cadena, por ejemplo.
¡Probémoslo en la práctica! Inicie npm run start
si aún no lo ha hecho.
Mostrar un atributo en una entrada de texto personalizada y actualizar el valor del atributo
En el paso anterior, agregamos algunos componentes edit
, por ejemplo, una entrada de texto, pero no se almacenó nada. Agreguemos un atributo y una entrada de texto en nuestro bloque. Ambos nos aseguraremos de que la entrada de texto muestre el valor actual, y cada vez que se cambie la entrada, actualizaremos el atributo.
Agregar la entrada de texto y su onChange
accesorio
Desestructuramos attributes
y setAttributes
de props
como usaremos ambos. Luego usamos un componente del paquete TextControl
de WordPress. wp.components
Le pasamos dos puntales; value
establecerá el valor de la entrada (tanto inicialmente como mientras escribimos) y una acción en el evento de la entrada onChange
.
En value
lo fijamos al valor de nuestro atributo; attributes.exampleText
. En el onChange
caso de que ejecutemos una función, pasando el valor escrito de nuestra entrada como parámetro newtext
(el valor de entrada es un accesorio que se devuelve desde el componente). En esa función llamamos setAttributes()
y actualizamos el atributo exampleText
a lo que se escribió en la entrada.
Esto es React básico, aparte del hecho de que trabajamos con atributos y no con estados. Si lo anterior te confundió, te recomiendo que consultes un tutorial rápido en React, ¡ya que probablemente te lo explicarán mejor que yo!
¡Actualiza tu editor y mira cómo funciona el bloque! Debería obtener una entrada de texto estándar para escribir cosas, y se guardará cada vez que presione Guardar/Actualizar en la edición posterior.
El resultado en frontend y en la base de datos.
Si ve su publicación en la interfaz, aún debería hacer eco de un div con ":)" porque eso es lo que todavía tenemos en nuestra save
función. ¡Pero algo ha sucedido detrás de escena! El bloque de comentarios de nuestro bloque ahora contiene el valor de nuestro atributo en JSON.
No puede ver los bloques de comentarios en una plantilla que realiza una the_content()
llamada normal. Para ver los bloques de comentarios tienes dos opciones. O mire en la post_content
tabla de la base de datos de publicaciones. O agregue echo get_the_content()
la plantilla y mírela en la herramienta Inspeccionar/depurar.
Obviamente, también tenemos acceso a los atributos save
, desde props.
Mostrar el valor de la entrada ensave
Mostremos el valor del atributo dentro de un div en nuestra save
función:
Nota: Después de hacer este cambio, obtendrá un bloque roto en la publicación a la que ya ha agregado este bloque. Esto sucede porque el editor encuentra una salida diferente a la save
que hemos definido ahora. Retire el bloque y vuelva a agregarlo. Ingrese algo en su entrada de texto, actualice la publicación y visualícela en la interfaz.
Y esta es la esencia de esto en realidad. Tú decides qué atributos necesitas para guardar lo que quieras en tu bloque. En edit
él, presentará formas para que el usuario ingrese, teniendo cuidado de que se muestren los valores actuales y actualícelos cada vez que cambien. Y save
extrae los atributos guardados y renderiza la salida como quieras.
Abordaremos muchos más componentes y atributos diferentes a medida que avanzamos en esta serie de tutoriales. Pero veamos otro componente en esta publicación para ver de qué source
se trata la propiedad de atributo.
RichText y la propiedad de atributosource
El componente de WordPress RichText
le brinda un área de texto "sin bordes" con soporte para formato de texto. Es posible que prefiera usar esto en lugar de una entrada de texto estándar o un área de texto (¿feo?). Pero tenga en cuenta que RichText
debe manejarse de manera un poco diferente, ya que hay varios accesorios que debe tener en cuenta, y hay una diferencia en la forma en que obtenemos el valor en nuestra save
función.
Agregar un RichText
componente
La forma más simple de RichText
implementarlo es como lo harías con una entrada de texto:
Desestructuramos el RichText
componente del wp.blockEditor
paquete, pero por lo demás, lo anterior es idéntico a lo que hicimos con la entrada de texto estándar.
Manejo save
conRichText
Sin embargo, en la save
función, debe usar el RichText
componente nuevamente para obtener el valor del atributo. Llamamos RichText.Content
y configuramos el accesorio value
a nuestro atributo:
Esto generará lo que se haya escrito en el RichText
editor directamente sin ningún código HTML.
Cuando trabaja con RichText
usted, lo más probable es que desee controlar el contenedor HTML alrededor del texto, por ejemplo, a <p>
o a <h2>
, tanto en la interfaz como en el editor. Para eso podemos usar un accesorio llamado tagName
.
El componente RichText
también permite varios otros accesorios. Puede definir un texto de marcador de posición que se muestra (desvanecido) cuando está vacío con la placeholder
propiedad. El componente también le permite controlar qué opciones de formato permite el campo (qué botones muestra en la barra de herramientas).
RichText
contagName
Con el accesorio tagName
, puede predefinir en qué etiqueta HTML se envuelve su salida. Cuando lo use tagName
, debe usar el mismo tagName
accesorio y valor en ambos edit
y save
.
Digamos que desea poner el valor de su atributo en a <h2>
, lo que en el editor forzará que cualquier entrada sea h2. En edit
puedes hacer:
Y en save
:
Lo anterior ahora generará lo que se haya escrito en el RichText
área dentro de una <h2>
etiqueta.
Usandosource
Obviamente, puede combinar varios textos enriquecidos para un bloque, por ejemplo, uno para encabezado y otro para párrafo. Solo recuerda que cada uno necesitará su propio atributo. Por ejemplo:
Sin embargo, ahora comenzará a encontrar algunos problemas. Aunque puede formatear texto en el editor, no se guardará nada (o parte) de su formato. Cuando vea la publicación en la interfaz, simplemente aparecerá como h2
y un p
, sin ningún formato que haya hecho (cursiva, negrita, enlace). Ni siquiera el bloque de comentarios de su bloque contiene el formato. Esto es lo complicado con RichText
. Para solucionar esto necesitamos trabajar con el atributo property source
.
La source
propiedad que permite a WordPress extraer e interpretar el contenido directamente del contenido de la publicación. Si un atributo no está source
configurado, se guardará y se extraerá del bloque de comentarios HTML.
Cuando trabajamos con RichText
, generalmente establecemos, source
que html
usa la biblioteca de WordPress para analizar el marcado HTML. La propiedad source
funciona junto con otra propiedad de atributo; selector
que define de qué etiqueta HTML se debe extraer.
Como ejemplo, establecemos source
como html
en nuestro párrafo RichText
y establecemos selector
como p
(de lo contrario, el valor predeterminado es root o block the block).
attributes: {
...
myRichText: {
type: 'string',
source: 'html',
selector: 'p'
}
},
Ahora nuestro segundo RichText
debería guardar con éxito todo su formato de texto. También notará que el bloque de comentarios ahora solo muestra el myRichHeading
atributo en JSON. El atributo myRichText
ha desaparecido por completo del bloque de comentarios. Esto se debe a que source
WordPress ahora analiza el contenido de la publicación en lugar del bloque de comentarios para el valor del atributo.
Para ser completamente honesto, no he trabajado tanto con el source
atributo y recomendaría evitarlo si puede. La documentación de WordPress explica algo más sobre la fuente y los atributos que desea comprobar por sí mismo.
En esta publicación, hemos aprendido los conceptos básicos sobre los atributos; cómo definirlos, actualizarlos y generar sus valores. En los próximos pasos, veremos más componentes diferentes y cómo agregar configuraciones fuera del contenido del bloque en sí; en la barra de herramientas y la barra lateral del editor (llamada Inspector).