{"id":233952,"date":"2023-02-27T12:54:00","date_gmt":"2023-02-27T09:54:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233952"},"modified":"2022-11-11T13:22:54","modified_gmt":"2022-11-11T10:22:54","slug":"crear-bloque-personalizado-de-gutenberg-parte-4-atributos","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/crear-bloque-personalizado-de-gutenberg-parte-4-atributos\/","title":{"rendered":"Crear bloque personalizado de Gutenberg &#8211; Parte 4: Atributos"},"content":{"rendered":"\n<p>En esta parte, veremos c\u00f3mo definir atributos, obtener sus valores y actualizarlos. Con los atributos podemos aceptar la entrada del editor, guardarla y generarla como elijamos. En el <a href=\"https:\/\/awhitepixel.com\/blog\/wordpress-gutenberg-create-custom-blocks-part-3-props-wordpress-components\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">paso anterior<\/a> vimos los componentes de WordPress, d\u00f3nde encontrarlos y c\u00f3mo implementarlos. En esta publicaci\u00f3n, agregaremos accesorios para hacer la conexi\u00f3n con los atributos: los datos guardados.<\/p>\n<h2>Definici\u00f3n de atributos<\/h2>\n<p>Los atributos se agregan como objetos en una matriz a la <code>attributes<\/code>propiedad en <code>registerBlockType()<\/code>. La clave de cada atributo es el nombre del atributo, y debe tener la propiedad <code>type<\/code>como m\u00ednimo.<\/p>\n<p>La <code>type<\/code>propiedad puede ser cualquiera de las siguientes; <code>null<\/code>, <code>boolean<\/code>, <code>object<\/code>, <code>array<\/code>, <code>number<\/code>, <code>string<\/code>, o <code>integer<\/code>.<\/p>\n<p>Opcionalmente, puede proporcionar la propiedad <code>default<\/code>para definir el valor inicial de su atributo. Si no proporciona un valor predeterminado, el atributo ser\u00e1 <code>null<\/code>.<\/p>\n<p>Otra propiedad de atributo es <code>source<\/code>que funciona junto con la <code>selector<\/code>propiedad, pero estas son cosas delicadas que veremos en detalle m\u00e1s adelante.<\/p>\n<p>Por ejemplo, definir dos atributos; <code>exampleText<\/code>como cadena y <code>postIds<\/code>como matriz, se ver\u00eda as\u00ed:<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\nregisterBlockType('awp\/firstblock', {\n    title: 'My first block',\n    category: 'common',\n    attributes: {\n        exampleText: {\n            type: 'string',\n            default: ''\n        },\n        postIds: {\n            type: 'array'\n            default: []\n        }\n    },\n    edit: (props) =&gt; { \n    ...<\/code><\/pre>\n<p><strong>Cualquier cosa que necesite guardar para su bloque (entrada del usuario\/editor) requiere un atributo<\/strong>. Depende de usted c\u00f3mo estructura sus datos, definiendo atributos separados para cada uno o agrup\u00e1ndolos todos en un objeto. Solo ser\u00e1 una diferencia en c\u00f3mo obtienes sus datos y c\u00f3mo los actualizas.<\/p>\n<h2>Obtener valores de atributo<\/h2>\n<p>Los atributos est\u00e1n disponibles como accesorios para sus bloques <code>edit<\/code>y <code>save<\/code>funciones. Si ha seguido esta serie del <a href=\"https:\/\/awhitepixel.com\/blog\/wordpress-gutenberg-create-custom-blocks-part-3-props-wordpress-components\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">paso anterior<\/a>, recuerde que actualizamos las funciones para pasar props como par\u00e1metro.<\/p>\n<p>Es com\u00fan <strong>desestructurar<\/strong> los atributos de los accesorios, ya que normalmente se refiere a ellos con frecuencia. Por ejemplo, la salida de un atributo llamado <code>exampleText<\/code>se ver\u00eda as\u00ed:<\/p>\n<pre><code>edit: (props) =&gt; { \n    const { attributes } = props;\n    return &lt;div&gt;{attributes.exampleText}&lt;\/div&gt;\n},<\/code><\/pre>\n<h2>Actualizar valores de atributos<\/h2>\n<p>Para actualizar atributos tenemos un m\u00e9todo disponible en props, llamado <code>setAttributes()<\/code>. Esta funci\u00f3n acepta un objeto donde puede agregar cualquier atributo que desee actualizar. Puede actualizar solo un atributo, m\u00e1s o todos a la vez. Si tiene varios atributos definidos y llama <code>setAttributes()<\/code>para actualizar solo uno de ellos, los otros no se tocan.<\/p>\n<p>Si tiene experiencia con React, probablemente reconocer\u00e1 inmediatamente las similitudes entre <code>setAttributes()<\/code>y <code>setState()<\/code>. 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.<\/p>\n<p>Para actualizar un atributo, generalmente destruir\u00eda la funci\u00f3n de accesorios y la llamar\u00eda as\u00ed: A continuaci\u00f3n, actualizamos <code>exampleText<\/code>el atributo para que sea &quot;Hola&quot;.<\/p>\n<pre><code>const { setAttributes } = props;\nsetAttributes({ exampleText: 'Hi' });<\/code><\/pre>\n<p>Naturalmente, ejecutar\u00eda <code>setAttributes()<\/code>desde dentro alguna acci\u00f3n. Un ejemplo com\u00fan est\u00e1 dentro de la <code>onChange<\/code>propiedad en alg\u00fan tipo de campo de entrada que se usa para almacenar el valor del <code>exampleText<\/code>atributo.<\/p>\n<p>Aseg\u00farese de guardar los atributos en el tipo que ha definido en el atributo. No tendr\u00e1 suerte tratando de guardar objetos en un atributo de cadena, por ejemplo.<\/p>\n<p>\u00a1Prob\u00e9moslo en la pr\u00e1ctica! Inicie <code>npm run start<\/code>si a\u00fan no lo ha hecho.<\/p>\n<h2>Mostrar un atributo en una entrada de texto personalizada y actualizar el valor del atributo<\/h2>\n<p>En el paso anterior, agregamos algunos componentes <code>edit<\/code>, por ejemplo, una entrada de texto, pero no se almacen\u00f3 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.<\/p>\n<h3>Agregar la entrada de texto y su <code>onChange<\/code>accesorio<\/h3>\n<pre><code>const { registerBlockType } = wp.blocks;\nconst { TextControl } = wp.components;\n\u00a0\nregisterBlockType('awp\/firstblock', {\n    title: 'My first block',\n    category: 'common',\n    attributes: {\n        exampleText: {\n            type: 'string',\n            default: ''\n        }\n    },\n    edit: (props) =&gt; { \n        const { attributes, setAttributes } = props;\n        return (&lt;div&gt;\n                &lt;TextControl \n                    value={attributes.exampleText}\n                    onChange={(newtext) =&gt; setAttributes({ exampleText: newtext })}\n                \/&gt; \n            &lt;\/div&gt;\n        );\n    },\n    save:() =&gt; { \n        return &lt;div&gt;:)&lt;\/div&gt; \n    }\n});<\/code><\/pre>\n<p>Desestructuramos <code>attributes<\/code>y <code>setAttributes<\/code>de <code>props<\/code>como usaremos ambos. Luego usamos un componente del paquete <code>TextControl<\/code>de WordPress. <code>wp.components<\/code>Le pasamos dos puntales; <code>value<\/code>establecer\u00e1 el valor de la entrada (tanto inicialmente como mientras escribimos) y una acci\u00f3n en el evento de la entrada <code>onChange<\/code>.<\/p>\n<p>En <code>value<\/code>lo fijamos al valor de nuestro atributo; <code>attributes.exampleText<\/code>. En el <code>onChange<\/code>caso de que ejecutemos una funci\u00f3n, pasando el valor escrito de nuestra entrada como par\u00e1metro <code>newtext<\/code>(el valor de entrada es un accesorio que se devuelve desde el componente). En esa funci\u00f3n llamamos <code>setAttributes()<\/code>y actualizamos el atributo <code>exampleText<\/code>a lo que se escribi\u00f3 en la entrada.<\/p>\n<p>Esto es React b\u00e1sico, aparte del hecho de que trabajamos con atributos y no con estados. Si lo anterior te confundi\u00f3, te recomiendo que consultes un tutorial r\u00e1pido en React, \u00a1ya que probablemente te lo explicar\u00e1n mejor que yo!<\/p>\n<p>\u00a1Actualiza tu editor y mira c\u00f3mo funciona el bloque! Deber\u00eda obtener una entrada de texto est\u00e1ndar para escribir cosas, y se guardar\u00e1 cada vez que presione Guardar\/Actualizar en la edici\u00f3n posterior.<\/p>\n<h3>El resultado en frontend y en la base de datos.<\/h3>\n<p>Si ve su publicaci\u00f3n en la interfaz, a\u00fan deber\u00eda hacer eco de un div con &quot;:)&quot; porque eso es lo que todav\u00eda tenemos en nuestra <code>save<\/code>funci\u00f3n. \u00a1Pero algo ha sucedido detr\u00e1s de escena! El bloque de comentarios de nuestro bloque ahora contiene el valor de nuestro atributo en JSON.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151357-61e4ca89cf1d2.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151357-61e4ca89cf1d2.png\" alt=\"Crear bloque personalizado de Gutenberg - Parte 4: Atributos\" ><\/a><\/p>\n<p>No puede ver los bloques de comentarios en una plantilla que realiza una <code>the_content()<\/code>llamada normal. Para ver los bloques de comentarios tienes dos opciones. O mire en la <code>post_content<\/code>tabla de la base de datos de publicaciones. O agregue <code>echo get_the_content()<\/code>la plantilla y m\u00edrela en la herramienta Inspeccionar\/depurar.<\/p>\n<p>Obviamente, tambi\u00e9n tenemos acceso a los atributos <code>save<\/code>, desde props.<\/p>\n<h3>Mostrar el valor de la entrada en<code>save<\/code><\/h3>\n<p>Mostremos el valor del atributo dentro de un div en nuestra <code>save<\/code>funci\u00f3n:<\/p>\n<pre><code>save: (props) =&gt; { \n    const { attributes } = props;\n    return &lt;div&gt;{attributes.exampleText}&lt;\/div&gt;\n}<\/code><\/pre>\n<p>Nota: Despu\u00e9s de hacer este cambio, obtendr\u00e1 un bloque roto en la publicaci\u00f3n a la que ya ha agregado este bloque. Esto sucede porque el editor encuentra una salida diferente a la <code>save<\/code>que hemos definido ahora. Retire el bloque y vuelva a agregarlo. Ingrese algo en su entrada de texto, actualice la publicaci\u00f3n y visual\u00edcela en la interfaz.<\/p>\n<p>Y esta es la esencia de esto en realidad. T\u00fa decides qu\u00e9 atributos necesitas para guardar lo que quieras en tu bloque. En <code>edit<\/code>\u00e9l, presentar\u00e1 formas para que el usuario ingrese, teniendo cuidado de que se muestren los valores actuales y actual\u00edcelos cada vez que cambien. Y <code>save<\/code>extrae los atributos guardados y renderiza la salida como quieras.<\/p>\n<p>Abordaremos muchos m\u00e1s componentes y atributos diferentes a medida que avanzamos en esta serie de tutoriales. Pero veamos otro componente en esta publicaci\u00f3n para ver de qu\u00e9 <code>source<\/code>se trata la propiedad de atributo.<\/p>\n<h2>RichText y la propiedad de atributo<code>source<\/code><\/h2>\n<p>El componente de WordPress <code>RichText<\/code>le brinda un \u00e1rea de texto &quot;sin bordes&quot; con soporte para formato de texto. Es posible que prefiera usar esto en lugar de una entrada de texto est\u00e1ndar o un \u00e1rea de texto (\u00bffeo?). Pero tenga en cuenta que <code>RichText<\/code>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 <code>save<\/code>funci\u00f3n.<\/p>\n<h3>Agregar un <code>RichText<\/code>componente<\/h3>\n<p>La forma m\u00e1s simple de <code>RichText<\/code>implementarlo es como lo har\u00edas con una entrada de texto:<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\nconst { RichText } = wp.blockEditor;\n\u00a0\nregisterBlockType('awp\/firstblock', {\n    ...\n    attributes: {\n        myRichText: {\n            type: 'string',\n            default: ''\n        }\n    },\n    edit: (props) =&gt; { \n        const { attributes, setAttributes } = props;\n        return (&lt;div&gt;\n                &lt;RichText \n                    value={attributes.myRichText}\n                    onChange={(newtext) =&gt; setAttributes({ myRichText: newtext })}\n                \/&gt; \n            &lt;\/div&gt;\n        );\n    },\n    ...<\/code><\/pre>\n<p>Desestructuramos el <code>RichText<\/code>componente del <code>wp.blockEditor<\/code>paquete, pero por lo dem\u00e1s, lo anterior es id\u00e9ntico a lo que hicimos con la entrada de texto est\u00e1ndar.<\/p>\n<h3>Manejo <code>save<\/code>con<code>RichText<\/code><\/h3>\n<p>Sin embargo, en la <code>save<\/code>funci\u00f3n, debe usar el <code>RichText<\/code>componente nuevamente para obtener el valor del atributo. Llamamos <code>RichText.Content<\/code>y configuramos el accesorio <code>value<\/code>a nuestro atributo:<\/p>\n<pre><code>save: (props) =&gt; { \n    const { attributes } = props;\n    return (&lt;div&gt;\n            &lt;RichText.Content \n                value={attributes.myRichText}\n            \/&gt;\n        &lt;\/div&gt;\n    );\n}<\/code><\/pre>\n<p>Esto generar\u00e1 lo que se haya escrito en el <code>RichText<\/code>editor directamente sin ning\u00fan c\u00f3digo HTML.<\/p>\n<p>Cuando trabaja con <code>RichText<\/code>usted, lo m\u00e1s probable es que desee controlar el contenedor HTML alrededor del texto, por ejemplo, a <code>&lt;p&gt;<\/code>o a <code>&lt;h2&gt;<\/code>, tanto en la interfaz como en el editor. Para eso podemos usar un accesorio llamado <code>tagName<\/code>.<\/p>\n<p>El componente <code>RichText<\/code>tambi\u00e9n permite varios otros accesorios. Puede definir un texto de marcador de posici\u00f3n que se muestra (desvanecido) cuando est\u00e1 vac\u00edo con la <code>placeholder<\/code>propiedad. El componente tambi\u00e9n le permite controlar qu\u00e9 opciones de formato permite el campo (qu\u00e9 botones muestra en la barra de herramientas).<\/p>\n<h3><code>RichText<\/code>con<code>tagName<\/code><\/h3>\n<p>Con el accesorio <code>tagName<\/code>, puede predefinir en qu\u00e9 etiqueta HTML se envuelve su salida. Cuando lo use <code>tagName<\/code>, debe usar el mismo <code>tagName<\/code>accesorio y valor en ambos <code>edit<\/code>y <code>save<\/code>.<\/p>\n<p>Digamos que desea poner el valor de su atributo en a <code>&lt;h2&gt;<\/code>, lo que en el editor forzar\u00e1 que cualquier entrada sea h2. En <code>edit<\/code>puedes hacer:<\/p>\n<pre><code>&lt;RichText \n    tagName=\"h2\"\n    placeholder=\"Write your heading here\"\n    value={attributes.myRichText}\n    onChange={(newtext) =&gt; setAttributes({ myRichText: newtext })}\n\/&gt;<\/code><\/pre>\n<p>Y en <code>save<\/code>:<\/p>\n<pre><code>&lt;RichText.Content \n    tagName=\"h2\"\n    value={attributes.myRichText}\n\/&gt;<\/code><\/pre>\n<p>Lo anterior ahora generar\u00e1 lo que se haya escrito en el <code>RichText<\/code>\u00e1rea dentro de una <code>&lt;h2&gt;<\/code>etiqueta.<\/p>\n<h3>Usando<code>source<\/code><\/h3>\n<p>Obviamente, puede combinar varios textos enriquecidos para un bloque, por ejemplo, uno para encabezado y otro para p\u00e1rrafo. Solo recuerda que cada uno necesitar\u00e1 su propio atributo. Por ejemplo:<\/p>\n<pre><code>attributes: {\n    myRichHeading: {\n        type: 'string'\n    },\n    myRichText: {\n        type: 'string'\n    }\n},\nedit: (props) =&gt; { \n    const { attributes, setAttributes } = props;\n    return (&lt;div&gt;\n            &lt;RichText \n                tagName=\"h2\"\n                placeholder=\"Write your heading here\"\n                value={attributes.myRichHeading}\n                onChange={(newtext) =&gt; setAttributes({ myRichHeading: newtext })}\n            \/&gt;\n            &lt;RichText\n                tagName=\"p\"\n                placeholder=\"Write your paragraph here\"\n                value={attributes.myRichText}\n                onChange={(newtext) =&gt; setAttributes({ myRichText: newtext })}\n            \/&gt;\n        &lt;\/div&gt;\n    );\n},\nsave: (props) =&gt; { \n    const { attributes } = props;\n    return (&lt;div&gt;\n            &lt;RichText.Content \n                tagName=\"h2\"\n                value={attributes.myRichHeading}\n            \/&gt;\n            &lt;RichText.Content \n                tagName=\"p\"\n                value={attributes.myRichText}\n            \/&gt;\n        &lt;\/div&gt;\n    );\n}<\/code><\/pre>\n<p>Sin embargo, ahora comenzar\u00e1 a encontrar algunos problemas. Aunque puede formatear texto en el editor, no se guardar\u00e1 nada (o parte) de su formato. Cuando vea la publicaci\u00f3n en la interfaz, simplemente aparecer\u00e1 como <code>h2<\/code>y un <code>p<\/code>, sin ning\u00fan formato que haya hecho (cursiva, negrita, enlace). Ni siquiera el bloque de comentarios de su bloque contiene el formato. Esto es lo complicado con <code>RichText<\/code>. Para solucionar esto necesitamos trabajar con el atributo property <code>source<\/code>.<\/p>\n<p>La <code>source<\/code>propiedad que permite a WordPress extraer e interpretar el contenido directamente del contenido de la publicaci\u00f3n. Si un atributo no est\u00e1 <code>source<\/code>configurado, se guardar\u00e1 y se extraer\u00e1 del bloque de comentarios HTML.<\/p>\n<p>Cuando trabajamos con <code>RichText<\/code>, generalmente establecemos, <code>source<\/code>que <code>html<\/code>usa la biblioteca de WordPress para analizar el marcado HTML. La propiedad <code>source<\/code>funciona junto con otra propiedad de atributo; <code>selector<\/code>que define de qu\u00e9 etiqueta HTML se debe extraer.<\/p>\n<p>Como ejemplo, establecemos <code>source<\/code>como <code>html<\/code>en nuestro p\u00e1rrafo <code>RichText<\/code>y establecemos <code>selector<\/code>como <code>p<\/code>(de lo contrario, el valor predeterminado es root o block the block).<\/p>\n<pre><code>attributes: {\n    ...\n    myRichText: {\n        type: 'string',\n        source: 'html',\n        selector: 'p'\n    }\n},<\/code><\/pre>\n<p>Ahora nuestro segundo <code>RichText<\/code>deber\u00eda guardar con \u00e9xito todo su formato de texto. Tambi\u00e9n notar\u00e1 que el bloque de comentarios ahora solo muestra el <code>myRichHeading<\/code>atributo en JSON. El atributo <code>myRichText<\/code>ha desaparecido por completo del bloque de comentarios. Esto se debe a que <code>source<\/code>WordPress ahora analiza el contenido de la publicaci\u00f3n en lugar del bloque de comentarios para el valor del atributo.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151357-61e4ca8ab1967.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151357-61e4ca8ab1967.png\" alt=\"Crear bloque personalizado de Gutenberg - Parte 4: Atributos\" ><\/a><\/p>\n<p>Para ser completamente honesto, no he trabajado tanto con el <code>source<\/code>atributo y recomendar\u00eda evitarlo si puede. La documentaci\u00f3n de WordPress explica algo m\u00e1s sobre la <a href=\"https:\/\/developer.wordpress.org\/block-editor\/developers\/block-api\/block-attributes\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fuente y los atributos<\/a> que desea comprobar por s\u00ed mismo.<\/p>\n<p>En esta publicaci\u00f3n, hemos aprendido los conceptos b\u00e1sicos sobre los atributos; c\u00f3mo definirlos, actualizarlos y generar sus valores. En los pr\u00f3ximos pasos, veremos m\u00e1s componentes diferentes y c\u00f3mo agregar configuraciones fuera del contenido del bloque en s\u00ed; en la barra de herramientas y la barra lateral del editor (llamada Inspector).<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En esta lecci\u00f3n de bloque de Gutenberg para principiantes, veremos c\u00f3mo definir atributos, obtener sus valores y actualizarlos.<\/p>\n","protected":false},"author":1,"featured_media":151358,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[810,935,935,1110,810,840,840,861,861],"tags":[1172],"class_list":["post-233952","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-complementos","category-gutenberg-2","category-n-a","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233952","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=233952"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233952\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/151358"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233952"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233952"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233952"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}