{"id":44710,"date":"2021-10-21T11:40:49","date_gmt":"2021-10-21T09:40:49","guid":{"rendered":"https:\/\/kinsta.com\/?p=105115"},"modified":"2025-12-16T22:05:59","modified_gmt":"2025-12-16T21:05:59","slug":"bloques-gutenberg","status":"publish","type":"post","link":"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/","title":{"rendered":"Construir Bloques Personalizados de Gutenberg: El Tutorial Definitivo de Desarrollo de Bloques"},"content":{"rendered":"<p>Mucha gente se queja de las dificultades para empezar a construir bloques y aplicaciones de Gutenberg. La curva de aprendizaje es empinada, principalmente debido a la dificultad de instalar y configurar el entorno de desarrollo. Adem\u00e1s, un s\u00f3lido conocimiento de JavaScript, Node.js, React y Redux son ingredientes imprescindibles para esta receta bastante compleja.<\/p>\n<p>El <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">manual oficial del editor de bloques de WordPress<\/a> proporciona a los desarrolladores una enorme cantidad de informaci\u00f3n, pero puede que te encuentres perdido en ese mar de detalles.<\/p>\n<p>Y vale la pena mencionar lo que Mat\u00edas Ventura, arquitecto principal del proyecto Gutenberg, dij\u00f3 en <a href=\"https:\/\/wptavern.com\/a-discussion-with-gutenberg-project-lead-matias-ventura-on-the-barrier-to-entry\">su entrevista en WP Tavern<\/a>:<\/p>\n<blockquote><p><em>Aunque hay gente que puede aprenderlo r\u00e1pidamente, sigue siendo una gran barrera para la gente. Creo que existen diversas claves; la documentaci\u00f3n podr\u00eda mejorar en gran medida, tanto en organizaci\u00f3n como en presentaci\u00f3n. Espero que podamos hacer mucho m\u00e1s en este sentido.<\/em><\/p><\/blockquote>\n<p>Con esto en mente, hemos decidido crear un tutorial paso a paso destinado a ayudar a nuestros lectores a iniciarse en el desarrollo de bloques de Gutenberg.<\/p>\n<p>\u00bfTe parece interesante? Vamos a sumergirnos en el tema.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Requisitos previos para el desarrollo de bloques de Gutenberg<\/h2>\n<p>Para este tutorial, las \u00fanicas habilidades requeridas son un buen conocimiento del desarrollo de plugins de WordPress y al menos una <a href=\"https:\/\/kinsta.com\/es\/blog\/mejores-practicas-html\/\">comprensi\u00f3n b\u00e1sica de HTML<\/a>, CSS, JavaScript y React.<\/p>\n<p>\u00bfEs un proyecto ambicioso? Por supuesto que s\u00ed.<\/p>\n<p>No fue f\u00e1cil encontrar el compromiso adecuado entre la exhaustividad y la sencillez, ni decidir qu\u00e9 temas incluir y cu\u00e1les dejar fuera.<\/p>\n<p>Esperemos que los lectores intermedios y avanzados nos perdonen por no profundizar en ciertos conceptos como <a href=\"https:\/\/reactjs.org\/docs\/state-and-lifecycle.html\">el estado de React<\/a>, el <a href=\"https:\/\/redux.js.org\/api\/store\">almac\u00e9n Redux<\/a>, los <a href=\"https:\/\/reactjs.org\/docs\/higher-order-components.html\">high order components<\/a>, etc. Estos temas requieren espacio y atenci\u00f3n adicionales y son probablemente demasiado avanzados para el desarrollo de bloques principiante (a menos que seas un desarrollador de React).<\/p>\n<p>Por la misma raz\u00f3n, no cubriremos algunos de los temas m\u00e1s avanzados relacionados con el desarrollo de bloques de Gutenberg, como los <a href=\"https:\/\/kinsta.com\/es\/blog\/bloques-dinamicos\/\">bloques din\u00e1micos<\/a> y los <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/metabox\/\">meta boxes<\/a>.<\/p>\n<p>Con los conocimientos que obtendr\u00e1s al final de este art\u00edculo, podr\u00e1s empezar a divertirte y ser productivo de inmediato.<\/p>\n<p>Una vez que te pongas en marcha con la construcci\u00f3n de bloques, estar\u00e1s preparado para mejorar tus habilidades y construir bloques Gutenberg a\u00fan m\u00e1s avanzados por tu cuenta.<\/p>\n\n<p>\u00a0<\/p>\n<h2>\u00bfQu\u00e9 es un bloque Gutenberg?<\/h2>\n<p>Desde que se lanz\u00f3 por primera vez en diciembre de 2018, el <a href=\"https:\/\/kinsta.com\/es\/blog\/gutenberg-wordpress-editor\/\">editor de bloques<\/a> ha mejorado mucho en todos los aspectos: <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/\">APIs m\u00e1s potentes<\/a>, una interfaz de usuario m\u00e1s avanzada, una usabilidad mejorada, una tonelada de bloques nuevos, las <a href=\"https:\/\/kinsta.com\/es\/blog\/wordpress-5-8\/#full-site-editing-features-in-wordpress-58\">primeras implementaciones de Full Site Editing<\/a> y mucho m\u00e1s.<\/p>\n<p>En resumen, aunque Gutenberg sigue en pleno desarrollo, ha recorrido un largo camino &#8211; y hoy, el editor de bloques es un candidato de pleno derecho como constructor de p\u00e1ginas y sitios fiables y funcionales.<\/p>\n<p>Desde el punto de vista del desarrollador, Gutenberg es una <a href=\"https:\/\/en.wikipedia.org\/wiki\/Single-page_application\">single-page application<\/a> (SPA) basada en React que permite a los usuarios de WordPress crear, editar y eliminar contenido en WordPress. Sin embargo, esto no debe hacer pensar en una versi\u00f3n mejorada del <a href=\"https:\/\/kinsta.com\/es\/blog\/editor-wordpress-tinymce\/\">editor de contenidos tradicional<\/a>.<\/p>\n<p>Queremos dejar esto claro:<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-plain\">\n        <p><strong>Gutenberg <em>no es <\/em>un editor WYSIWYG normal. M\u00e1s bien, redefine toda la experiencia de edici\u00f3n en WordPress.<\/strong><\/p>\n<\/aside>\n\n<p>En Gutenberg, el contenido se divide en bloques, que son \u00abladrillos\u00bb que los usuarios pueden utilizar para crear entradas y p\u00e1ginas o sus sitios web completos.<\/p>\n<p>Pero, \u00bfqu\u00e9 es t\u00e9cnicamente un bloque?<\/p>\n<p>Nos gusta <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-blocks\/\">la definici\u00f3n de WordPress<\/a>:<\/p>\n<blockquote><p><em>\u00abBloque\u00bb es el t\u00e9rmino abstracto utilizado para describir las unidades de marcado que, compuestas juntas, forman el contenido o el dise\u00f1o de una p\u00e1gina web. La idea combina conceptos de lo que en WordPress conseguimos hoy con los shortcodes, el HTML personalizado y el embed discovery en una \u00fanica y consistente API y experiencia de usuario.<\/em><\/p><\/blockquote>\n<p>Los t\u00edtulos, los p\u00e1rrafos, las columnas, las im\u00e1genes, las galer\u00edas y todos los elementos que componen la interfaz del editor, desde los paneles de la barra lateral hasta los controles de la barra de herramientas de los bloques, son componentes React.<\/p>\n<p>Entonces, \u00bfqu\u00e9 son los componentes React? W3Schools ofrece la <a href=\"https:\/\/www.w3schools.com\/react\/react_components.asp\">siguiente definici\u00f3n<\/a>:<\/p>\n<blockquote><p><em>Los componentes son fragmentos de c\u00f3digo independientes y reutilizables. Sirven para el mismo prop\u00f3sito que las funciones de JavaScript, pero funcionan de forma aislada y devuelven HTML a trav\u00e9s de una funci\u00f3n <code>render()<\/code>.<\/em><\/p><\/blockquote>\n<figure id=\"attachment_105117\" aria-describedby=\"caption-attachment-105117\" style=\"width: 2874px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105117 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/working-with-blocks.jpg\" alt=\"Trabajar con bloques Gutenberg en WordPress 5.8.\" width=\"2874\" height=\"1344\"><figcaption id=\"caption-attachment-105117\" class=\"wp-caption-text\">Trabajar con bloques Gutenberg en WordPress 5.8.<\/figcaption><\/figure>\n<p>Aunque la experiencia de edici\u00f3n que ofrece Gutenberg es nueva en comparaci\u00f3n con el editor cl\u00e1sico de WordPress, la forma en que WordPress almacena sus piezas de contenido en la base de datos no cambia en absoluto. Esto se debe a que Gutenberg es una aplicaci\u00f3n que funciona dentro de WordPress pero no cambia la forma en que el CMS funciona en su n\u00facleo.<\/p>\n<p>Las entradas (y esto incluye entradas, p\u00e1ginas y tipos de entradas personalizadas) creadas con Gutenberg siguen almacen\u00e1ndose en la tabla <code>wp_posts<\/code>, exactamente igual que con el editor cl\u00e1sico.<\/p>\n<p>Pero en un post creado con Gutenberg, encontrar\u00e1s trozos de informaci\u00f3n adicionales en la tabla que representan una diferencia fundamental entre los posts creados a trav\u00e9s del Editor Cl\u00e1sico vs Gutenberg.<\/p>\n<p>Estas piezas de informaci\u00f3n se parecen a los comentarios HTML, y tienen una funci\u00f3n espec\u00edfica: delimitar bloques:<\/p>\n<figure id=\"attachment_105118\" aria-describedby=\"caption-attachment-105118\" style=\"width: 1522px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105118 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/code-editor-view.jpg\" alt=\"Una entrada del blog en la vista del editor de c\u00f3digo.\" width=\"1522\" height=\"1054\"><figcaption id=\"caption-attachment-105118\" class=\"wp-caption-text\">Una entrada del blog en la vista del editor de c\u00f3digo.<\/figcaption><\/figure>\n<p>Los<strong> delimitadores de bloque <\/strong>le indican a WordPress qu\u00e9 bloque se va a mostrar en la pantalla. Tambi\u00e9n proporcionan valores para las propiedades del bloque en un objeto JSON. Esas propiedades dictan la forma en que el bloque debe ser renderizado en la pantalla:<\/p>\n<figure id=\"attachment_105119\" aria-describedby=\"caption-attachment-105119\" style=\"width: 1630px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105119 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/post-content.jpg\" alt=\"Una entrada de blog almacenada en la tabla wp_posts.\" width=\"1630\" height=\"1036\"><figcaption id=\"caption-attachment-105119\" class=\"wp-caption-text\">Una entrada de blog almacenada en la tabla <code>wp_posts<\/code>.<\/figcaption><\/figure>\n<h2>Configuraci\u00f3n del entorno de desarrollo de WordPress<\/h2>\n<p>La configuraci\u00f3n de un entorno de desarrollo JavaScript moderno requiere un s\u00f3lido conocimiento de tecnolog\u00edas avanzadas como <a href=\"https:\/\/webpack.js.org\/\">Webpack<\/a>, <a href=\"https:\/\/reactjs.org\/\">React<\/a> y <a href=\"https:\/\/facebook.github.io\/jsx\/\">JSX<\/a>, <a href=\"https:\/\/babeljs.io\/docs\/en\/index.html\">Babel<\/a>, <a href=\"https:\/\/eslint.org\/\">ESLint<\/a>, etc.<\/p>\n<p>\u00bfIntimidado? No lo est\u00e9s. La comunidad de WordPress ya ha acudido al rescate proporcionando potentes herramientas que te permiten evitar un engorroso proceso de configuraci\u00f3n manual.<\/p>\n<p>Para simplificar las cosas, no cubriremos la <a href=\"https:\/\/kinsta.com\/es\/blog\/transpilacion-php\/\">transpilaci\u00f3n<\/a> en este art\u00edculo (que, sin embargo, recomendamos que te familiarices con ella una vez que hayas aprendido los fundamentos del desarrollo en bloque). En su lugar, presentaremos dos herramientas alternativas que puedes utilizar para configurar r\u00e1pida y f\u00e1cilmente un entorno de desarrollo de JavaScript moderno en pocos minutos. Depende de ti elegir la que te resulte m\u00e1s conveniente para tu proyecto.<\/p>\n<p>Configurar un entorno de desarrollo de JavaScript para construir bloques de Gutenberg es un proceso de tres pasos:<\/p>\n<ol>\n<li><a href=\"#node-npm\">Instalar Node.js y npm<\/a><\/li>\n<li><a href=\"#dev-environment\">Configurar el entorno de desarrollo<\/a><\/li>\n<li><a href=\"#block-plugin\">Configurar el plugin de bloques<\/a><\/li>\n<\/ol>\n<p>Empecemos.<\/p>\n<h3 id=\"node-npm\">1. Instalar Node.js y npm<\/h3>\n<p>Antes de instalar tu entorno de desarrollo y registrar tu primer bloque, necesitar\u00e1s instalar <a href=\"https:\/\/sevalla.com\/application-hosting\/\">Node.js<\/a> y el gestor de paquetes Node (npm).<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p><a href=\"https:\/\/nodejs.org\/en\/\">Node.js<\/a> es un runtime de JavaScript construido sobre el motor de JavaScript V8 de Chrome. <a href=\"https:\/\/www.npmjs.com\/\">npm<\/a>, com\u00fanmente conocido como el gestor de paquetes Node, es considerado \u00abel mayor registro de software del mundo\u00bb<\/p>\n<\/aside>\n\n<p>Puedes <a href=\"https:\/\/kinsta.com\/es\/blog\/como-instalar-node-js\/\">instalar Node.js y npm<\/a> <a href=\"https:\/\/docs.npmjs.com\/downloading-and-installing-node-js-and-npm\">de diferentes maneras<\/a>. Pero primero, es posible que quieras comprobar si el software ya est\u00e1 instalado en tu m\u00e1quina.<\/p>\n<p>Para ello, inicia el terminal y ejecute el siguiente comando:<\/p>\n<pre><code class=\"language-bash\">node -v<\/code><\/pre>\n<p>Si el resultado es <code>command not found<\/code>, entonces Node.js no est\u00e1 instalado en tu ordenador, y puedes proceder con la instalaci\u00f3n.<\/p>\n<p>Para este art\u00edculo, hemos elegido la opci\u00f3n de instalaci\u00f3n m\u00e1s sencilla, que es el <a href=\"https:\/\/nodejs.org\/en\/download\/\">instalador de Node<\/a>. Lo \u00fanico que tienes que hacer es descargar la versi\u00f3n correspondiente a tu sistema operativo e iniciar el asistente de instalaci\u00f3n:<\/p>\n<figure id=\"attachment_105120\" aria-describedby=\"caption-attachment-105120\" style=\"width: 1974px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105120 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/nodejs-downloads.jpg\" alt=\"P\u00e1gina de descargas de Node.js.\" width=\"1974\" height=\"1550\"><figcaption id=\"caption-attachment-105120\" class=\"wp-caption-text\">P\u00e1gina de descargas de Node.js.<\/figcaption><\/figure>\n<p>Una vez que hayas instalado Node.js, ejecuta el comando <code>node -v<\/code> en tu terminal de nuevo. Tambi\u00e9n puedes ejecutar el comando <code>npm -v<\/code> para confirmar que tienes el paquete.<\/p>\n<p>Ahora est\u00e1s equipado con las siguientes herramientas:<\/p>\n<ul>\n<li>El corredor de paquetes <code>npx<\/code> Node.js (<a href=\"https:\/\/nodejs.dev\/learn\/the-npx-nodejs-package-runner\">ver docs<\/a>). Esto te permite ejecutar un comando <code>npm<\/code> sin instalarlo primero.<\/li>\n<li>El gestor de paquetes <code>npm<\/code> Node.js (<a href=\"https:\/\/docs.npmjs.com\/\">ver docs<\/a>). Se utiliza para instalar dependencias y ejecutar scripts.<\/li>\n<\/ul>\n<p>El siguiente paso es instalar el entorno de desarrollo.<\/p>\n<h3 id=\"dev-environment\">2. Configurar el entorno de desarrollo<\/h3>\n<p>Una vez que tengas las \u00faltimas versiones de Node.js y npm en tu m\u00e1quina local, necesitar\u00e1s un entorno de desarrollo para WordPress.<\/p>\n<p>Puedes utilizar un entorno de desarrollo local como DevKinsta o utilizar la herramienta oficial de WordPress. Vamos a echar un vistazo a ambas opciones.<\/p>\n<h4 id=\"devkinsta\">Opci\u00f3n 1: Entorno de desarrollo local (DevKinsta)<\/h4>\n<p>Con solo unos pocos clics, puedes <a href=\"https:\/\/kinsta.com\/es\/ebooks\/wordpress\/wordpress-desarrollo-local\/\">instalar WordPress localmente<\/a> usando <a href=\"https:\/\/kinsta.com\/es\/devkinsta\/\">DevKinsta<\/a>, nuestra moderna herramienta de desarrollo local de WordPress. O puedes optar por otra herramienta de desarrollo local, como <a href=\"https:\/\/kinsta.com\/es\/blog\/instalar-wordpress-localmente\/#how-to-install-wordpress-locally-on-mac-using-mamp\">MAMP<\/a> o <a href=\"https:\/\/kinsta.com\/es\/blog\/instalar-wordpress-localmente\/#how-to-install-wordpress-locally-using-xampp\">XAMPP<\/a>:<\/p>\n<figure id=\"attachment_105122\" aria-describedby=\"caption-attachment-105122\" style=\"width: 2502px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105122 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/dev-kinsta-create-new-site.jpg\" alt=\"Cree un nuevo sitio web de WordPress en DevKinsta.\" width=\"2502\" height=\"1252\"><figcaption id=\"caption-attachment-105122\" class=\"wp-caption-text\">Crea un nuevo sitio web de WordPress en DevKinsta.<\/figcaption><\/figure>\n<h4 id=\"wp-env\">Opci\u00f3n 2: wp-env<\/h4>\n<p>Tambi\u00e9n puedes optar por la <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env\"><code>wp-env<\/code>herramienta<\/a> oficial, que proporciona un entorno de desarrollo local de WordPress que puedes lanzar directamente desde la l\u00ednea de comandos. Noah Alen <a href=\"https:\/\/make.wordpress.org\/core\/2020\/03\/03\/wp-env-simple-local-environments-for-wordpress\/\">lo define as\u00ed<\/a>:<\/p>\n<blockquote><p><em>Los entornos locales de WordPress son ahora tan sencillos como ejecutar un \u00fanico comando. <code>wp-env<\/code> es una herramienta de configuraci\u00f3n cero para entornos locales de WordPress sin complicaciones. Proporciona decisiones sobre las opciones para que los usuarios puedan poner en marcha r\u00e1pidamente WordPress sin perder tiempo. De hecho, el objetivo es hacer que estos entornos sean f\u00e1cilmente accesibles para todos, ya seas un desarrollador, un dise\u00f1ador, un gestor o cualquier otra persona.<\/em><\/p><\/blockquote>\n<p>Si decides probarlo, la instalaci\u00f3n de <code>wp-env<\/code> requiere un esfuerzo m\u00ednimo. Solo tienes que seguir estos pasos:<\/p>\n<h5>Paso 1: Confirmar la instalaci\u00f3n de Docker y Node.js<\/h5>\n<p>Para cumplir con los requisitos t\u00e9cnicos, primero tendr\u00e1s que tener <a href=\"https:\/\/www.docker.com\/\">Docker<\/a> y Node.js instalados en tu ordenador. Esto se debe a que <code>wp-env<\/code> crea una instancia Docker que ejecuta un sitio web de WordPress. Cualquier cambio realizado en el c\u00f3digo se refleja inmediatamente en la instancia de WordPress.<\/p>\n<h5>\u00a0Paso 2: Instalar <code>@wordpress\/env<\/code> desde la l\u00ednea de comandos<\/h5>\n<p>Con Docker y Node.js funcionando en tu ordenador, puedes pasar a instalar el <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/#wordpress-development-site\">entorno de desarrollo<\/a> de WordPress.<\/p>\n<p>Puede instalar <code>wp-env<\/code> de forma global o local. Para hacerlo de forma global, tendr\u00e1s que ejecutar el siguiente comando desde el directorio de plugins (m\u00e1s informaci\u00f3n sobre esto en el cuadro de aviso \u00abImportante\u00bb m\u00e1s abajo):<\/p>\n<pre><code class=\"language-bash\">npm install -g @wordpress\/env<\/code><\/pre>\n<p>Vamos a desglosar eso:<\/p>\n<ul>\n<li><code>npm install<\/code> <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/commands\/npm-install\">instala el paquete<\/a>.<\/li>\n<li>La opci\u00f3n <code>-g<\/code> a\u00f1adida al comando <a href=\"https:\/\/docs.npmjs.com\/downloading-and-installing-packages-globally\">instala el paquete especificado de forma global<\/a>.<\/li>\n<li><code>@wordpress\/env<\/code> es el <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env\">paquete que vas a instalar<\/a>.<\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Por defecto, en Mac o Linux los <a href=\"https:\/\/nodejs.dev\/learn\/where-does-npm-install-the-packages\">paquetes de nodos se instalan<\/a> en <strong>\/usr\/local\/lib\/node_modules<\/strong>.<\/p>\n<p>Si el usuario actual no tiene privilegios de escritura en ese directorio, se encontrar\u00e1 con un error EACCES. Obt\u00e9n m\u00e1s informaci\u00f3n sobre c\u00f3mo <a href=\"https:\/\/docs.npmjs.com\/resolving-eacces-permissions-errors-when-installing-packages-globally\">resolver los errores de permisos EACCES al instalar paquetes de forma global.<\/a><\/p>\n<\/aside>\n\n<p>Para confirmar que <code>wp-env<\/code> se ha instalado correctamente, ejecuta el siguiente comando:<\/p>\n<pre><code class=\"language-bash\">wp-env --version<\/code><\/pre>\n<p>Deber\u00edas ver la versi\u00f3n actual de <code>wp-env<\/code>, lo que significa que ahora puedes lanzar el entorno utilizando el siguiente comando <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env#user-content-usage\">desde la carpeta de su plugin<\/a>:<\/p>\n<pre><code class=\"language-bash\">wp-env start<\/code><\/pre>\n<p>Puedes acceder al panel de control de WordPress utilizando la siguiente direcci\u00f3n:<\/p>\n<ul>\n<li>http:\/\/localhost:8888\/wp-admin\/<\/li>\n<\/ul>\n<p>Las credenciales por defecto son las siguientes:<\/p>\n<ul>\n<li>Nombre de usuario: <code>admin<\/code><\/li>\n<li>Contrase\u00f1a: <code>password<\/code><\/li>\n<\/ul>\n<h3 id=\"block-plugin\">Configurar el plugin de bloqueo<\/h3>\n<p>Ahora necesitas un plugin de bloques de inicio sobre el que construir. Pero en lugar de crear manualmente un plugin de desarrollo de bloques con todos los archivos y carpetas necesarios, puedes simplemente ejecutar una herramienta de desarrollo que te proporcione todos los archivos y configuraciones que necesitas para empezar a desarrollar bloques.<\/p>\n<p>De nuevo, tienes un par de opciones para elegir. Veamos cada una de ellas.<\/p>\n<h4 id=\"create-block\">Opci\u00f3n 1: Configurar un plugin de bloque con @wordpress\/create-block<\/h4>\n<p><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-create-block\/\">@wordpress\/create-block<\/a> es la herramienta oficial de configuraci\u00f3n cero para crear bloques Gutenberg:<\/p>\n<blockquote><p><em>Create Block es una forma oficial de crear bloques para registrar un bloque para un plugin de WordPress. Ofrece una configuraci\u00f3n de construcci\u00f3n moderna sin configuraci\u00f3n. Genera c\u00f3digo PHP, JS, CSS y todo lo que necesitas para iniciar el proyecto.<\/em><\/p>\n<p>Se inspira en gran medida en <a href=\"https:\/\/create-react-app.dev\/docs\/getting-started\/\">create-react-app<\/a>. Un gran reconocimiento a <a href=\"https:\/\/github.com\/gaearon\">@gaearon<\/a>, a todo el equipo de Facebook y a la comunidad React.<\/p><\/blockquote>\n<p>Una vez que tu entorno local est\u00e9 en funcionamiento, puedes configurar un bloque inicial simplemente ejecutando el <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/create-block\">comando<\/a> <code>npx @wordpress\/create-block<\/code>, y te proporcionar\u00e1 todos los archivos y carpetas que necesita para <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/wp-plugin\/\">crear el andamiaje del plugin<\/a> y registrar un nuevo bloque.<\/p>\n<p>Hagamos una prueba para ver c\u00f3mo funciona.<\/p>\n<p>Desde tu herramienta de l\u00ednea de comandos, navega hasta el directorio <strong>\/wp-content\/plugins\/ <\/strong>y ejecuta el siguiente comando:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block my-first-block<\/code><\/pre>\n<p>Cuando te le pida que confirma, introduce <code>y<\/code> para continuar:<\/p>\n<figure id=\"attachment_105124\" aria-describedby=\"caption-attachment-105124\" style=\"width: 1136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105124 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-block-my-first-block.jpg\" alt=\"Creaci\u00f3n de un bloque con @wordpress\/create-block.\" width=\"1136\" height=\"170\"><figcaption id=\"caption-attachment-105124\" class=\"wp-caption-text\">Creaci\u00f3n de un bloque con @wordpress\/create-block.<\/figcaption><\/figure>\n<p>El proceso dura unos instantes. Cuando se haya completado, deber\u00edas obtener la siguiente respuesta:<\/p>\n<figure id=\"attachment_105125\" aria-describedby=\"caption-attachment-105125\" style=\"width: 1134px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105125 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/wordpress-create-block-completed.jpg\" alt=\"Se ha creado el plugin de bloques.\" width=\"1134\" height=\"680\"><figcaption id=\"caption-attachment-105125\" class=\"wp-caption-text\">Se ha creado el plugin de bloques.<\/figcaption><\/figure>\n<p>\u00a1Y ya est\u00e1!<\/p>\n<p>Ahora inicia tu entorno de desarrollo de WordPress y dir\u00edgete a la pantalla de <strong>plugins <\/strong>en el panel de control de WordPress. Un nuevo plugin llamado \u00abMy First Block\u00bb deber\u00eda haber sido a\u00f1adido a tu lista de plugins:<\/p>\n<figure id=\"attachment_105126\" aria-describedby=\"caption-attachment-105126\" style=\"width: 1956px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105126 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/my-first-block-plugin.jpg\" alt=\"El plugin del bloque se ha instalado con \u00e9xito.\" width=\"1956\" height=\"1168\"><figcaption id=\"caption-attachment-105126\" class=\"wp-caption-text\">El plugin del bloque se ha instalado con \u00e9xito.<\/figcaption><\/figure>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Si est\u00e1s usando la herramienta <code>wp-env<\/code> y ejecutas <code>wp-env start<\/code> desde el directorio que contiene el plugin, \u00e9ste montar\u00e1 y activar\u00e1 autom\u00e1ticamente el plugin. Si ejecuta <code>wp-env start<\/code> desde cualquier otro directorio, se crear\u00e1 un entorno gen\u00e9rico de WordPress (ver tambi\u00e9n <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/#wordpress-development-site\">Sitio de Desarrollo de WordPress<\/a>)<\/p>\n<\/aside>\n\n<p>Activa el plugin si es necesario, crea una nueva entrada de blog, despl\u00e1zate por el insertador de bloques hasta la secci\u00f3n de <strong>Widgets <\/strong>y selecciona tu nuevo bloque:<\/p>\n<figure id=\"attachment_134071\" aria-describedby=\"caption-attachment-134071\" style=\"width: 2190px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134071 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/example-block.jpg\" alt=\"Un ejemplo de bloque creado con @wordpress\/create-block.\" width=\"2190\" height=\"1034\"><figcaption id=\"caption-attachment-134071\" class=\"wp-caption-text\">Un ejemplo de bloque creado con @wordpress\/create-block.<\/figcaption><\/figure>\n<p>Ahora vuelve al terminal y cambia el directorio actual a <strong>mi-primer-bloque<\/strong>:<\/p>\n<pre><code class=\"language-bash\">cd my-first-block<\/code><\/pre>\n<p>A continuaci\u00f3n, ejecuta el siguiente comando:<\/p>\n<pre><code class=\"language-bash\">npm start<\/code><\/pre>\n<p>Esto te permite ejecutar el plugin en modo de desarrollo. Para crear el c\u00f3digo de producci\u00f3n, debes utilizar el siguiente comando:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n<h4 id=\"create-guten-block\">Opci\u00f3n 2: Configurar un plugin de bloque con create-guten-block<\/h4>\n<p><a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block\"><code>create-guten-block<\/code><\/a> es una herramienta de desarrollo de terceros para construir bloques Gutenberg:<\/p>\n<blockquote><p><em><code>create-guten-block<\/code> es un dev-toolkit de configuraci\u00f3n cero (#0CJS) para desarrollar bloques de WordPress Gutenberg en cuesti\u00f3n de minutos sin configurar React, webpack, ES6\/7\/8\/Next, ESLint, Babel, etc.<\/em><\/p><\/blockquote>\n<p>Al igual que la herramienta oficial de <code>create-block<\/code>, <code>create-guten-block<\/code> se basa en <a href=\"https:\/\/create-react-app.dev\/docs\/getting-started\">create-react-app<\/a> y puede ayudarte a generar tu primer plugin de bloques sin problemas.<\/p>\n<p>El kit de herramientas proporciona todo lo necesario para crear un moderno plugin de WordPress, <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block#whats-included\">incluyendo lo siguiente<\/a>:<\/p>\n<blockquote><p>\u00a0<\/p>\n<ul>\n<li>Soporte de sintaxis React, JSX y ES6.<\/li>\n<li>proceso de construcci\u00f3n de webpack para desarrollo\/producci\u00f3n detr\u00e1s de la escena.<\/li>\n<li>Extras del lenguaje m\u00e1s all\u00e1 de ES6 como el operador de propagaci\u00f3n de objetos.<\/li>\n<li>CSS autoprefijado, por lo que no se necesita -webkit u otros prefijos.<\/li>\n<li>Un script de construcci\u00f3n para empaquetar JS, CSS e im\u00e1genes para la producci\u00f3n con mapas de origen.<\/li>\n<li>Actualizaciones sin problemas para las herramientas anteriores con una sola dependencia cgb-scripts.<\/li>\n<\/ul>\n<p>\u00a0<\/p><\/blockquote>\n<p>Ten en cuenta la siguiente advertencia:<\/p>\n<blockquote><p><em>La contrapartida es que estas herramientas est\u00e1n preconfiguradas para funcionar de una manera espec\u00edfica. Si tu proyecto necesita m\u00e1s personalizaci\u00f3n, puedes <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block#--npm-run-eject\">\u00abexpulsar\u00bb<\/a> y personalizarlo, pero entonces tendr\u00e1s que mantener esta configuraci\u00f3n.<\/em><\/p><\/blockquote>\n<p>Una vez que tengas a mano un sitio web local de WordPress, inicie tu herramienta de l\u00ednea de comandos, navega hasta la carpeta <strong>\/wp-content\/plugins <\/strong>de su instalaci\u00f3n y ejecuta el siguiente comando:<\/p>\n<pre><code class=\"language-bash\">npx create-guten-block my-first-block<\/code><\/pre>\n<p>Tendr\u00e1s que esperar uno o dos minutos mientras se crea la estructura del proyecto y se descargan las dependencias:<\/p>\n<figure id=\"attachment_105147\" aria-describedby=\"caption-attachment-105147\" style=\"width: 1136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105147 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-guten-block.jpg\" alt=\" Creaci\u00f3n de un bloque Gutenberg con create-guten-block.\" width=\"1136\" height=\"290\"><figcaption id=\"caption-attachment-105147\" class=\"wp-caption-text\">Creaci\u00f3n de un bloque Gutenberg con create-guten-block.<\/figcaption><\/figure>\n<p>Cuando el proceso se haya completado, deber\u00edas ver la siguiente pantalla:<\/p>\n<figure id=\"attachment_105132\" aria-describedby=\"caption-attachment-105132\" style=\"width: 1130px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105132 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-guten-block-complete.jpg\" alt=\"Bloque Gutenberg creado con \u00e9xito con create-guten-block.\" width=\"1130\" height=\"673\"><figcaption id=\"caption-attachment-105132\" class=\"wp-caption-text\">Bloque Gutenberg creado con \u00e9xito con create-guten-block.<\/figcaption><\/figure>\n<p>La siguiente imagen muestra la estructura del proyecto con el terminal ejecutado en <a href=\"https:\/\/kinsta.com\/es\/blog\/mejores-editores-texto\/#visual-studio-code\">Visual Studio Code<\/a>:<\/p>\n<figure id=\"attachment_105133\" aria-describedby=\"caption-attachment-105133\" style=\"width: 2350px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105133 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-guten-block-plugin-in-visual-studio-code.jpg\" alt=\"El plugin de bloques en Visual Studio Code.\" width=\"2350\" height=\"1484\"><figcaption id=\"caption-attachment-105133\" class=\"wp-caption-text\">El plugin de bloques en Visual Studio Code.<\/figcaption><\/figure>\n<p>Ahora vuelve a tu panel de control de WordPress. Deber\u00eda aparecer un nuevo elemento en la pantalla de plugins: es el plugin <strong>my-first-block<\/strong>:<\/p>\n<figure id=\"attachment_105134\" aria-describedby=\"caption-attachment-105134\" style=\"width: 2136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105134 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/plugins-screen.jpg\" alt=\"La pantalla de Plugins con un nuevo plugin creado con create-guten-block.\" width=\"2136\" height=\"1155\"><figcaption id=\"caption-attachment-105134\" class=\"wp-caption-text\">La pantalla de Plugins con un nuevo plugin creado con create-guten-block.<\/figcaption><\/figure>\n<p>Activa el plugin y vuelve a la terminal. Cambia el directorio actual a <strong>mi-primer-bloque<\/strong>, luego ejecuta <code>npm start<\/code>:<\/p>\n<pre><code class=\"language-bash\">cd my-first-block\nnpm start<\/code><\/pre>\n<p>Deber\u00edas obtener la siguiente respuesta:<\/p>\n<figure id=\"attachment_105128\" aria-describedby=\"caption-attachment-105128\" style=\"width: 1129px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105128 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/npm-started.jpg\" alt=\"npm comenz\u00f3.\" width=\"1129\" height=\"390\"><figcaption id=\"caption-attachment-105128\" class=\"wp-caption-text\">npm comenz\u00f3.<\/figcaption><\/figure>\n<p>De nuevo, esto te permite ejecutar el plugin en modo de desarrollo. Para crear el c\u00f3digo de producci\u00f3n, debes utilizar:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n<p>Activa el plugin y crea un nuevo post o p\u00e1gina, luego explora tus bloques y selecciona tu flamante bloque Gutenberg:<\/p>\n<figure id=\"attachment_105136\" aria-describedby=\"caption-attachment-105136\" style=\"width: 2458px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105136 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/first-block-created-with-create-guten-block.jpg\" alt=\"Un nuevo bloque creado con create-guten-block.\" width=\"2458\" height=\"1220\"><figcaption id=\"caption-attachment-105136\" class=\"wp-caption-text\">Un nuevo bloque creado con create-guten-block.<\/figcaption><\/figure>\n<p>Para una visi\u00f3n m\u00e1s profunda o en caso de errores, consulta la <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block\">documentaci\u00f3n proporcionada por Ahmad Awais<\/a>.<\/p>\n<h2>Un recorrido por el andamiaje del bloque inicial<\/h2>\n<p>Cualquiera de las dos herramientas de desarrollo <code>create-block<\/code> o <code>create-guten-block<\/code> que elijas, ahora tendr\u00e1s un andamiaje de bloques que puedes usar como punto de partida para construir un plugin de bloques.<\/p>\n<p>Pero, \u00bfqu\u00e9 es exactamente un <a href=\"https:\/\/make.wordpress.org\/core\/2020\/02\/28\/new-wordpress-create-block-package-for-block-scaffolding\/\">andamio de bloques<\/a>?<\/p>\n<blockquote><p><em>El andamio de bloques es un t\u00e9rmino abreviado que describe la estructura de directorios de soporte que necesita WordPress para reconocer un bloque. Normalmente ese directorio incluye archivos como <strong>index.php<\/strong>, <strong>index.js<\/strong>, <strong>style.css <\/strong>y otros, que a su vez contienen llamadas como <code>register_block_type<\/code>.<\/em><\/p><\/blockquote>\n<p>Hemos optado por la herramienta oficial de <strong>creaci\u00f3n de bloques<\/strong>, ya que se <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/\">utiliza en el manual del editor de bloques<\/a>. Pero incluso si te decides por una herramienta de terceros como <code>create-guten-block<\/code>, tu experiencia no ser\u00e1 muy diferente.<\/p>\n<p>Dicho esto, vamos a profundizar en la <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\"><code>create-block<\/code> herramienta<\/a>.<\/p>\n<h3>Una mirada m\u00e1s cercana a la herramienta de creaci\u00f3n de bloques<\/h3>\n<p>Como hemos mencionado anteriormente, <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/create-block\">Create Block<\/a> es la herramienta oficial de l\u00ednea de comandos para crear bloques de Gutenberg. Ejecutar <code>@wordpress\/create-block<\/code> en tu terminal genera los archivos PHP, JS y SCSS y el c\u00f3digo necesario para registrar un nuevo tipo de bloque:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block [options] [slug]<\/code><\/pre>\n<ul>\n<li><code>[slug]<\/code> (opcional) &#8211; se utiliza para asignar el slug del bloque e instalar el plugin<\/li>\n<li><code>[options]<\/code> (opcional) &#8211; opciones disponibles<\/li>\n<\/ul>\n<p>Por defecto, se asigna una plantilla <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/esnext-js\/\">ESNext<\/a>. Esto significa que obtendr\u00e1s la <a href=\"https:\/\/www.freecodecamp.org\/news\/es5-to-esnext-heres-every-feature-added-to-javascript-since-2015-d0c255e13c6e\/\">siguiente versi\u00f3n de JavaScript<\/a>, con la adici\u00f3n de la <a href=\"https:\/\/en.wikipedia.org\/wiki\/JSX_(JavaScript)\">sintaxis JSX<\/a>.<\/p>\n<p>Si omites el nombre del bloque, el comando se ejecuta en modo interactivo, lo que te permite personalizar varias opciones antes de generar los archivos:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block<\/code><\/pre>\n<figure id=\"attachment_133845\" aria-describedby=\"caption-attachment-133845\" style=\"width: 1684px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133845 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-block-interactive-mode-1.jpg\" alt=\"Ejecutando Crear Bloque en modo interactivo\" width=\"1684\" height=\"1005\"><figcaption id=\"caption-attachment-133845\" class=\"wp-caption-text\">Ejecutando Crear Bloque en modo interactivo<\/figcaption><\/figure>\n<p>La imagen siguiente muestra la estructura de archivos de un plugin de bloque creado con la herramienta oficial Create Block:<\/p>\n<figure id=\"attachment_133848\" aria-describedby=\"caption-attachment-133848\" style=\"width: 1404px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133848 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-structure.jpg\" alt=\"Archivos y carpetas de un plugin de bloque creado con @wordpress\/create-block.\" width=\"1404\" height=\"960\"><figcaption id=\"caption-attachment-133848\" class=\"wp-caption-text\">Archivos y carpetas de un plugin de bloque creado con @wordpress\/create-block.<\/figcaption><\/figure>\n<p>Dicho esto, vamos a repasar los principales archivos y carpetas de nuestro nuevo plugin de bloques.<\/p>\n<h3 id=\"plugin-file\">El archivo del plugin<\/h3>\n<p>Con el archivo principal del plugin se <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#php-server-side\">registra el bloque en el servidor<\/a>:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\/**\n * Plugin Name:       Kinsta Academy Block\n * Plugin URI:        https:\/\/kinsta.com\/\n * Description:       An example block for Kinsta Academy students\n * Requires at least: 5.9\n * Requires PHP:      7.0\n * Version:           0.1.0\n * Author:            Kinsta Students\n * License:           GPL-2.0-or-later\n * License URI:       https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\n * Text Domain:       ka-example-block\n *\n * @package           ka-example-block\n *\/\n\n\/**\n * Registers the block using the metadata loaded from the `block.json` file.\n * Behind the scenes, it registers also all assets so they can be enqueued\n * through the block editor in the corresponding context.\n *\n * @see https:\/\/developer.wordpress.org\/reference\/functions\/register_block_type\/\n *\/\nfunction ka_example_block_ka_example_block_block_init() {\n\tregister_block_type( __DIR__ . '\/build' );\n}\nadd_action( 'init', 'ka_example_block_ka_example_block_block_init' );<\/code><\/pre>\n<p>La funci\u00f3n <code>register_block_type<\/code> <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_block_type\/\">registra un tipo de bloque en el servidor<\/a> utilizando los metadatos almacenados en el archivo <strong>block.json<\/strong>.<\/p>\n<p>La funci\u00f3n toma dos par\u00e1metros:<\/p>\n<ul>\n<li>El nombre del tipo de bloque incluyendo el espacio de nombres, o una ruta a la carpeta donde se encuentra el archivo <strong>block.json<\/strong>, o un objeto <code>WP_Block_Type<\/code> completo<\/li>\n<li>Una matriz de argumentos de tipo de bloque<\/li>\n<\/ul>\n<p>En el c\u00f3digo anterior, la <a href=\"https:\/\/www.php.net\/manual\/en\/language.constants.magic.php\">constante m\u00e1gica<\/a> <code>__DIR__<\/code> devuelve la carpeta actual. Eso significa que el archivo <strong>block.json<\/strong> reside en la subcarpeta <em>\/build<\/em>.<\/p>\n<h3 id=\"package-json\">El archivo package.json<\/h3>\n<p>El <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json\">archivo package.json<\/a> define las propiedades y scripts de JavaScript para tu proyecto. Aqu\u00ed es donde puedes instalar las dependencias de tu proyecto.<\/p>\n<p>Para entender mejor para qu\u00e9 sirve este archivo, \u00e1brelo con tu <a href=\"https:\/\/kinsta.com\/es\/blog\/editores-html-gratuitos\/\">editor de c\u00f3digo favorito<\/a>:<\/p>\n<pre><code class=\"language-json\">{\n\t\"name\": \"ka-example-block\",\n\t\"version\": \"0.1.0\",\n\t\"description\": \"An example block for Kinsta Academy students\",\n\t\"author\": \"Kinsta Students\",\n\t\"license\": \"GPL-2.0-or-later\",\n\t\"homepage\": \"https:\/\/kinsta.com\/\",\n\t\"main\": \"build\/index.js\",\n\t\"scripts\": {\n\t\t\"build\": \"wp-scripts build\",\n\t\t\"format\": \"wp-scripts format\",\n\t\t\"lint:css\": \"wp-scripts lint-style\",\n\t\t\"lint:js\": \"wp-scripts lint-js\",\n\t\t\"packages-update\": \"wp-scripts packages-update\",\n\t\t\"plugin-zip\": \"wp-scripts plugin-zip\",\n\t\t\"start\": \"wp-scripts start\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@wordpress\/scripts\": \"^24.1.0\"\n\t},\n\t\"dependencies\": {\n\t\t\"classnames\": \"^2.3.2\"\n\t}\n}<\/code><\/pre>\n<p>La <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/using-npm\/scripts\">propiedad<\/a> <code>scripts<\/code> es un <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\">diccionario que contiene comandos<\/a> que se ejecutan en varios momentos del <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json\">ciclo de vida de un paquete<\/a> utilizando <code>npm run [cmd]<\/code>.<\/p>\n<p>En este art\u00edculo vamos a utilizar los <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/wp-plugin\/#package-json\">siguientes comandos<\/a>:<\/p>\n<ul>\n<li><code>npm run build<\/code> \u2014 crea una compilaci\u00f3n de producci\u00f3n (comprimida)<\/li>\n<li><code>npm run start<\/code> o <code>npm start<\/code> \u2014 crea una compilaci\u00f3n de desarrollo (sin comprimir)<\/li>\n<\/ul>\n<p>Las <code>dependencies<\/code> y las <code>devDependencies<\/code> son dos objetos que asignan <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json#dependencies\">un nombre de paquete a una versi\u00f3n<\/a>. Las <code>dependencies<\/code> son necesarias en producci\u00f3n, mientras que las <code>devDependences<\/code> solo son necesarias para el desarrollo local (<a href=\"https:\/\/docs.npmjs.com\/specifying-dependencies-and-devdependencies-in-a-package-json-file\">leer m\u00e1s<\/a>).<\/p>\n<p>La \u00fanica dependencia de desarrollo por defecto es el paquete <code>@wordpress\/scripts<\/code> que se <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\">define como<\/a> \u00abuna colecci\u00f3n de scripts reutilizables adaptados al desarrollo de WordPress\u00bb.<\/p>\n<h3 id=\"block-json\">El archivo block.json<\/h3>\n<p>A partir de WordPress 5.8, el <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/\">archivo de metadatos<\/a> <strong>block.json <\/strong>es la <a href=\"https:\/\/kinsta.com\/es\/blog\/wordpress-5-8\/#block-api-enhancements\">forma can\u00f3nica de registrar los tipos de bloque<\/a>.<\/p>\n<p>Tener un archivo <strong>block.json <\/strong>proporciona varios beneficios, incluyendo <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#benefits-using-the-metadata-file\">un mejor rendimiento<\/a> y una mejor visibilidad en el <a href=\"https:\/\/wordpress.org\/plugins\/\">directorio de plugins de WordPress<\/a>:<\/p>\n<blockquote><p><em>Desde el punto de vista del rendimiento, cuando los temas admiten activos de carga lenta, los bloques registrados con <strong>block.json <\/strong>tendr\u00e1n una cola de espera de activos optimizada de forma inmediata. Los activos CSS y JavaScript del frontend que aparecen en las propiedades de <\/em><em><code>style<\/code> <\/em><em>o de <\/em><em><code>script<\/code> <\/em><em>solo se pondr\u00e1n en cola cuando el bloque est\u00e9 presente en la p\u00e1gina, lo que reducir\u00e1 el tama\u00f1o de la misma.<\/em><\/p><\/blockquote>\n<p>La ejecuci\u00f3n del comando <code>@wordpress\/create-block<\/code> genera el siguiente archivo <strong>block.json<\/strong>:<\/p>\n<pre><code class=\"language-json\">{\n\t\"$schema\": \"https:\/\/schemas.wp.org\/trunk\/block.json\",\n\t\"apiVersion\": 2,\n\t\"name\": \"ka-example-block\/ka-example-block\",\n\t\"version\": \"0.1.0\",\n\t\"title\": \"Kinsta Academy Block\",\n\t\"category\": \"widgets\",\n\t\"icon\": \"superhero-alt\",\n\t\"description\": \"An example block for Kinsta Academy students\",\n\t\"supports\": {\n\t\t\"html\": false\n\t},\n\t\"textdomain\": \"ka-example-block\",\n\t\"editorScript\": \"file:.\/index.js\",\n\t\"editorStyle\": \"file:.\/index.css\",\n\t\"style\": \"file:.\/style-index.css\"\n}<\/code><\/pre>\n<p>Aqu\u00ed est\u00e1 la lista completa de <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#block-api\">propiedades por defecto<\/a>:<\/p>\n<ul>\n<li><code>apiVersion<\/code> \u2014la versi\u00f3n de la API utilizada por el bloque (la versi\u00f3n actual es la 2)<\/li>\n<li><code>name<\/code> \u2014 un identificador \u00fanico para un bloque que incluye un espacio de nombres<\/li>\n<li><code>version<\/code> &#8211; la versi\u00f3n actual de un bloque<\/li>\n<li><code>title<\/code> &#8211; un t\u00edtulo para mostrar un bloque<\/li>\n<li><code>category<\/code> \u2014una categor\u00eda de bloque<\/li>\n<li><code>icon<\/code> &#8211; un slug de <a href=\"https:\/\/developer.wordpress.org\/resource\/dashicons\/\">Dashicon<\/a> o un icono SVG personalizado<\/li>\n<li><code>description<\/code> &#8211; una breve descripci\u00f3n visible en el inspector de bloques<\/li>\n<li><code>supports<\/code> &#8211; un conjunto de opciones para controlar las caracter\u00edsticas utilizadas en el editor<\/li>\n<li><code>textdomain<\/code>\u00a0&#8211; el plugin text-domain<\/li>\n<li><code>editorScript<\/code> \u2014 definici\u00f3n de script del editor<\/li>\n<li><code>editorStyle<\/code> \u2014 definici\u00f3n del estilo del editor<\/li>\n<li><code>style<\/code> \u2014 proporciona estilos alternativos para un bloque<\/li>\n<\/ul>\n<p>Adem\u00e1s de las propiedades enumeradas anteriormente, puedes (y probablemente lo har\u00e1s) definir un objeto de <code>attributes<\/code> que proporcione informaci\u00f3n sobre los datos almacenados por tu bloque. En tu <strong>block.json <\/strong>puedes establecer cualquier n\u00famero de atributos en pares <em>clave\/valor<\/em>, donde la clave es el nombre del atributo y el valor es la definici\u00f3n del mismo.<\/p>\n<p>Observa el siguiente ejemplo de definici\u00f3n de atributos:<\/p>\n<pre><code class=\"language-json\">\"attributes\": {\n\t\"content\": {\n\t\t\"type\": \"array\",\n\t\t\"source\": \"children\",\n\t\t\"selector\": \"p\"\n\t},\n\t\"align\": {\n\t\t\"type\": \"string\",\n\t\t\"default\": \"none\"\n\t},\n\t\"link\": { \n\t\t\"type\": \"string\", \n\t\t\"default\": \"https:\/\/kinsta.com\" \n\t}\n},<\/code><\/pre>\n<p><a href=\"#block-json-at-work\">M\u00e1s adelante<\/a> profundizaremos en el archivo <strong>block.json<\/strong>, pero tambi\u00e9n puedes consultar el Manual del Editor de Bloques para obtener informaci\u00f3n m\u00e1s detallada sobre los <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/\">metadatos<\/a> y <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">atributos de<\/a> <strong>block.json<\/strong>.<\/p>\n<h3 id=\"src-folder\">La carpeta src<\/h3>\n<p>La carpeta <code>src<\/code> es donde ocurre el desarrollo. En esa carpeta, encontrar\u00e1s los siguientes archivos:<\/p>\n<ul>\n<li><strong>index.js<\/strong><\/li>\n<li><strong>edit.js<\/strong><\/li>\n<li><strong>save.js<\/strong><\/li>\n<li><strong>editor.scss<\/strong><\/li>\n<li><strong>style.scss<\/strong><\/li>\n<\/ul>\n<h4>index.js<\/h4>\n<p>El archivo <strong>index.js <\/strong>es tu punto de partida. Aqu\u00ed importar\u00e1s las dependencias y registrar\u00e1s el tipo de bloque en el servidor:<\/p>\n<pre><code class=\"language-js\">import { registerBlockType } from '@wordpress\/blocks';\n\nimport '.\/style.scss';\n\nimport Edit from '.\/edit';\nimport save from '.\/save';\nimport metadata from '.\/block.json';\n\nregisterBlockType( metadata.name, {\n\t\/**\n\t * @see .\/edit.js\n\t *\/\n\tedit: Edit,\n\n\t\/**\n\t * @see .\/save.js\n\t *\/\n\tsave,\n} );<\/code><\/pre>\n<p>La primera sentencia importa la funci\u00f3n <code>registerBlockType<\/code> del <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-blocks\/\">paquete<\/a>\u00a0<code>@wordpress\/blocks<\/code>. Las siguientes declaraciones <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/import\">de importaci\u00f3n<\/a> importan la hoja de estilos junto con las funciones\u00a0<code>Edit<\/code> y <code>save<\/code>, y un objeto de metadatos del archivo <em>block.json<\/em>.<\/p>\n<p>La funci\u00f3n <code>registerBlockType<\/code> <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-registration\/\">registra el componente en el cliente<\/a>. La funci\u00f3n toma dos par\u00e1metros: un nombre de bloque y un objeto de configuraci\u00f3n de bloque.<\/p>\n<p>La funci\u00f3n <code>Edit<\/code> proporciona la interfaz del bloque tal y como se muestra en el editor de bloques, mientras que la funci\u00f3n <code>save<\/code> proporciona la estructura que se serializar\u00e1 y guardar\u00e1 en la base de datos (<a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/\">leer m\u00e1s<\/a>).<\/p>\n<h4>edit.js<\/h4>\n<p><strong>edit.js <\/strong>es donde construir\u00e1s la interfaz de administraci\u00f3n del bloque:<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps } from '@wordpress\/block-editor';\nimport '.\/editor.scss';\n\nexport default function Edit() {\n\treturn (\n\t\t&lt;p {...useBlockProps()}&gt;\n\t\t\t{__('My First Block \u2013 hello from the editor!', 'my-first-block')}\n\t\t&lt;\/p&gt;\n\t);\n}<\/code><\/pre>\n<p>En primer lugar, importa la funci\u00f3n <code>__<\/code> del paquete <code>@wordpress\/i18n<\/code> (este paquete contiene una versi\u00f3n JavaScript de las funciones de traducci\u00f3n), el <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">hook<\/a> <a href=\"https:\/\/make.wordpress.org\/core\/2020\/11\/18\/block-api-version-2\/\"><code>useBlockProps<\/code><\/a> <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">React<\/a> y el archivo <code>editor.scss<\/code>.<\/p>\n<p>A continuaci\u00f3n, exporta el componente React (lee m\u00e1s sobre las declaraciones de <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/import\">importaci\u00f3n<\/a> y <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/export\">exportaci\u00f3n<\/a>).<\/p>\n<h4>save.js<\/h4>\n<p>El archivo <strong>save.js <\/strong>es donde construimos la estructura de bloques que se guardar\u00e1 en la base de datos:<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps } from '@wordpress\/block-editor';\n\nexport default function save() {\n\treturn (\n\t\t&lt;p {...useBlockProps.save()}&gt;\n\t\t\t{__(\n\t\t\t\t'My First Block \u2013 hello from the saved content!',\n\t\t\t\t'my-first-block'\n\t\t\t)}\n\t\t&lt;\/p&gt;\n\t);\n}<\/code><\/pre>\n<h4>editor.scss y style.scss<\/h4>\n<p>Adem\u00e1s de los scripts, en las carpetas <strong>src <\/strong>residen dos archivos <a href=\"https:\/\/sass-lang.com\/\">SASS<\/a>. El archivo <strong>editor.scss <\/strong>contiene los estilos aplicados al bloque en el contexto del editor, mientras que el archivo <strong>style.scss <\/strong>contiene los estilos del bloque para su visualizaci\u00f3n <a href=\"https:\/\/developer.wordpress.org\/block-editor\/contributors\/code\/coding-guidelines\/#scss-file-naming-conventions-for-blocks\">en el frontend<\/a> as\u00ed como en el editor. Profundizaremos en estos archivos en la segunda parte de esta gu\u00eda.<\/p>\n<h3 id=\"node_modules-build\">Las carpetas node_modules y build<\/h3>\n<p>La carpeta <code>node_modules<\/code> contiene los m\u00f3dulos de node y sus dependencias. No vamos a profundizar en los paquetes de node ya que est\u00e1 fuera del alcance de este art\u00edculo, pero puedes leer m\u00e1s en <a href=\"https:\/\/nodejs.dev\/learn\/where-does-npm-install-the-packages\">este art\u00edculo sobre d\u00f3nde instala npm los paquetes<\/a>.<\/p>\n<p>La carpeta de <code>build<\/code> contiene los archivos JS y CSS resultantes del proceso de construcci\u00f3n. Puedes profundizar en el proceso de compilaci\u00f3n en las gu\u00edas de <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/esnext-js\/\">sintaxis de ESNext<\/a> y de <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/js-build-setup\/\">configuraci\u00f3n de la compilaci\u00f3n de JavaScript<\/a>.<\/p>\n<h2>El proyecto: Construir tu primer bloque Gutenberg<\/h2>\n<p>Es hora de ensuciarse las manos. Esta secci\u00f3n te ense\u00f1ar\u00e1 c\u00f3mo crear un plugin que proporcione un bloque de CTA llamado Kinsta Academy Block.<\/p>\n<p>El bloque constar\u00e1 de dos columnas, con una imagen a la izquierda y un p\u00e1rrafo de texto a la derecha. Debajo del texto se colocar\u00e1 un bot\u00f3n con un enlace personalizable:<\/p>\n<figure id=\"attachment_137853\" aria-describedby=\"caption-attachment-137853\" style=\"width: 1502px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-137853 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/custom-block-final-2.jpg\" alt=\"El tipo de bloque que aprender\u00e1s a construir en esta gu\u00eda.\" width=\"1502\" height=\"808\"><figcaption id=\"caption-attachment-137853\" class=\"wp-caption-text\">El tipo de bloque que aprender\u00e1s a construir en esta gu\u00eda.<\/figcaption><\/figure>\n<p>Este es solo un ejemplo sencillo, pero nos permite cubrir los fundamentos del desarrollo de bloques Gutenberg. Una vez que tengas claro lo b\u00e1sico, puedes seguir adelante y crear bloques de Gutenberg m\u00e1s y m\u00e1s complejos con la ayuda del <a href=\"https:\/\/developer.wordpress.org\/block-editor\/\">Manual del Editor de Bloques<\/a> y cualquier otro de los vastos recursos disponibles por ah\u00ed.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>El c\u00f3digo de los ejemplos proporcionados en este tutorial tambi\u00e9n est\u00e1 <a href=\"https:\/\/gist.github.com\/carlodaniele\/5f3dba8fff19d8ea836bdef5a2be7556\">disponible en Gist<\/a> para tu referencia.<\/p>\n<\/aside>\n\n<p>Asumiendo que tienes la \u00faltima versi\u00f3n de WordPress corriendo en tu entorno de desarrollo local, esto es lo que vas a aprender de aqu\u00ed en adelante:<\/p>\n<ul>\n<li><a href=\"#set-up-the-plugin\">C\u00f3mo configurar el plugin Starter Block<\/a><\/li>\n<li><a href=\"#block-json-at-work\">block.json en el trabajo<\/a><\/li>\n<li><a href=\"#using-richtext-component\">Uso de los componentes incorporados: El componente RichText<\/a><\/li>\n<li><a href=\"#adding-block-toolbar-controls\">A\u00f1adir controles a la barra de herramientas del bloque<\/a><\/li>\n<li><a href=\"#settings-sidebar\">Personalizaci\u00f3n de la barra lateral de configuraci\u00f3n del bloque<\/a><\/li>\n<li><a href=\"#external-link\">A\u00f1adir y personalizar un enlace externo<\/a><\/li>\n<li><a href=\"#multiple-block-styles\">A\u00f1adir varios estilos de bloque<\/a><\/li>\n<li><a href=\"#innerblocks-component\">Anidaci\u00f3n de bloques con el componente InnerBlocks<\/a><\/li>\n<li><a href=\"#additional-improvements\">Mejoras adicionales<\/a><\/li>\n<\/ul>\n<p>Preparados&#8230; listos&#8230; \u00a1ya!<\/p>\n<h3 id=\"set-up-the-plugin\">C\u00f3mo configurar el plugin Starter Block<\/h3>\n<p>Inicia tu herramienta de l\u00ednea de comandos y navega hasta la carpeta <strong>\/wp-content\/plugins<\/strong>:<\/p>\n<figure id=\"attachment_105130\" aria-describedby=\"caption-attachment-105130\" style=\"width: 1224px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105130 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/new-terminal-at-folder.jpg\" alt=\"Nuevo terminal en la carpeta en Mac OS.\" width=\"1224\" height=\"958\"><figcaption id=\"caption-attachment-105130\" class=\"wp-caption-text\">Nuevo terminal en la carpeta en Mac OS.<\/figcaption><\/figure>\n<p>Ahora, ejecuta el siguiente comando:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block<\/code><\/pre>\n<p>Este comando genera los archivos PHP, SCSS y JS para registrar un bloque en modo interactivo, permiti\u00e9ndole a\u00f1adir los datos necesarios para su bloque f\u00e1cilmente. Para nuestro ejemplo utilizaremos los siguientes datos:<\/p>\n<ul>\n<li><strong>Variante de la Plantilla<\/strong>: static<\/li>\n<li><strong>Slug del bloque<\/strong>: ka-example-block<\/li>\n<li><strong>Nombre del espacio interno<\/strong>: ka-example-block<\/li>\n<li><strong>T\u00edtulo de visualizaci\u00f3n del bloque<\/strong>: Kinsta Academy Block<\/li>\n<li><strong>Descripci\u00f3n breve del bloque<\/strong>: Un bloque de ejemplo para los estudiantes de la Academia Kinsta<\/li>\n<li><strong>Dashicon<\/strong>: superhero-alt<\/li>\n<li><strong>Nombre de la categor\u00eda<\/strong>: widgets<\/li>\n<li><strong>\u00bfQuieres personalizar el plugin de WordPress?<\/strong>: s\u00ed<\/li>\n<li><strong>La p\u00e1gina de inicio del plugin<\/strong>: https:\/\/kinsta.com\/<\/li>\n<li><strong>Versi\u00f3n actual del plugin<\/strong>: 0.1.0<\/li>\n<li><strong>Autor del plugin<\/strong>: tu nombre<\/li>\n<li><strong>Licencia<\/strong>: &#8211;<\/li>\n<li><strong>Enlace al texto de la licencia<\/strong>: &#8211;<\/li>\n<li><strong>Ruta de dominio personalizada para las traducciones<\/strong>: &#8211;<\/li>\n<\/ul>\n<p>La instalaci\u00f3n del plugin y de todas las dependencias lleva un par de minutos. Cuando el proceso se complete, ver\u00e1s la siguiente respuesta:<\/p>\n<figure id=\"attachment_134076\" aria-describedby=\"caption-attachment-134076\" style=\"width: 1136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134076 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/example-block-installed.jpg\" alt=\"El bloque de afiliados ha sido instalado y registrado para su desarrollo.\" width=\"1136\" height=\"682\"><figcaption id=\"caption-attachment-134076\" class=\"wp-caption-text\">El bloque de afiliados ha sido instalado y registrado para su desarrollo.<\/figcaption><\/figure>\n<p>Ahora, ejecuta el siguiente comando desde la carpeta <strong>\/wp-content\/plugins<\/strong>:<\/p>\n<pre><code class=\"language-bash\">cd ka-example-block<\/code><\/pre>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Si est\u00e1s ejecutando tu entorno de WordPress, primero debes lanzar Docker Desktop, y luego ejecutar <code>wp-env start<\/code> desde la carpeta de tu plugin.<\/p>\n<p>A continuaci\u00f3n, puedes iniciar <em>http:\/\/localhost:8888\/wp-login <\/em>desde tu navegador web y utilizar el <strong>nombre de usuario: admin <\/strong>y la <strong>contrase\u00f1a: password <\/strong>para acceder a tu panel de control de WordPress.<\/p>\n<\/aside>\n\n<figure id=\"attachment_105184\" aria-describedby=\"caption-attachment-105184\" style=\"width: 2508px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105184 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/visual-studio-code-terminal.jpg\" alt=\"Ejecuci\u00f3n de comandos desde el terminal de c\u00f3digo de Visual Studio.\" width=\"2508\" height=\"1612\"><figcaption id=\"caption-attachment-105184\" class=\"wp-caption-text\">Ejecuci\u00f3n de comandos desde el terminal de c\u00f3digo de Visual Studio.<\/figcaption><\/figure>\n<p>Finalmente, desde la carpeta de tu plugin (<strong>ka-example-block <\/strong>en nuestro ejemplo), puedes comenzar el desarrollo con:<\/p>\n<pre><code class=\"language-bash\">npm start<\/code><\/pre>\n<p>Ahora abre la pantalla de plugins para encontrar y activar el plugin <strong>Kinsta Academy Block<\/strong>:<\/p>\n<figure id=\"attachment_133866\" aria-describedby=\"caption-attachment-133866\" style=\"width: 2214px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133866 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/plugins-screen.jpg\" alt=\"Activar el bloque de ejemplo\" width=\"2214\" height=\"1254\"><figcaption id=\"caption-attachment-133866\" class=\"wp-caption-text\">Activar el bloque de ejemplo<\/figcaption><\/figure>\n<p>Crea una nueva publicaci\u00f3n, abre el insertador de bloques y despl\u00e1zate hasta la categor\u00eda de <strong>Dise\u00f1o<\/strong>. Haz clic para a\u00f1adir el bloque de la Academia Kinsta:<\/p>\n<figure id=\"attachment_133869\" aria-describedby=\"caption-attachment-133869\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133869 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/starter-block.jpg\" alt=\"Un bloque inicial construido con @wordpress\/create-block.\" width=\"2216\" height=\"1242\"><figcaption id=\"caption-attachment-133869\" class=\"wp-caption-text\">Un bloque inicial construido con @wordpress\/create-block.<\/figcaption><\/figure>\n<h3 id=\"block-json-at-work\">block.json a trabajar<\/h3>\n<p>Como mencionamos anteriormente, el registro del bloque del lado del servidor tiene lugar en el archivo principal <strong>.php<\/strong>. Sin embargo, no vamos a definir la configuraci\u00f3n en el archivo <strong>.php<\/strong>. En su lugar, utilizaremos el archivo <strong>block.json<\/strong>.<\/p>\n<p>Por lo tanto, abre de nuevo <strong>block.json <\/strong>y echa un vistazo a la configuraci\u00f3n por defecto:<\/p>\n<pre><code class=\"language-json\">{\n\t\"$schema\": \"https:\/\/schemas.wp.org\/trunk\/block.json\",\n\t\"apiVersion\": 2,\n\t\"name\": \"ka-example-block\/ka-example-block\",\n\t\"version\": \"0.1.0\",\n\t\"title\": \"Kinsta Academy Block\",\n\t\"category\": \"widgets\",\n\t\"icon\": \"superhero-alt\",\n\t\"description\": \"An example block for Kinsta Academy students\",\n\t\"supports\": {\n\t\t\"html\": false\n\t},\n\t\"textdomain\": \"ka-example-block\",\n\t\"editorScript\": \"file:.\/index.js\",\n\t\"editorStyle\": \"file:.\/index.css\",\n\t\"style\": \"file:.\/style-index.css\"\n}<\/code><\/pre>\n<h4>Guiones y estilos<\/h4>\n<p>Las propiedades <code>editorScript<\/code>, <code>editorStyle<\/code>, y <code>style<\/code> proporcionan las rutas relativas a los scripts y estilos del frontend y del backend.<\/p>\n<p>No tienes que registrar manualmente los scripts y estilos definidos aqu\u00ed porque \u00e9stos son registrados y puestos en cola autom\u00e1ticamente por WordPress. Para comprobarlo, inicia el inspector del navegador y abra la pesta\u00f1a <strong>Red<\/strong>:<\/p>\n<figure id=\"attachment_133870\" aria-describedby=\"caption-attachment-133870\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133870 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/chrome-devtools-network.jpg\" alt=\"Inspecci\u00f3n de recursos en Chrome DevTools.\" width=\"2216\" height=\"1256\"><figcaption id=\"caption-attachment-133870\" class=\"wp-caption-text\">Inspecci\u00f3n de recursos en Chrome DevTools.<\/figcaption><\/figure>\n<p>Como puedes ver en la imagen de arriba, nuestro script <strong>index.js <\/strong>que reside en la carpeta de <strong>construcci\u00f3n <\/strong>se ha puesto en cola regularmente <strong>sin tener que a\u00f1adir ning\u00fan c\u00f3digo PHP<\/strong>.<\/p>\n<h4>Etiquetas UI<\/h4>\n<p>Las propiedades <code>title<\/code> y <code>description<\/code> proporcionan las etiquetas necesarias para identificar el bloque en el editor:<\/p>\n<figure id=\"attachment_133871\" aria-describedby=\"caption-attachment-133871\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133871 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-labels.jpg\" alt=\"Nombre del bloque y descripci\u00f3n en la barra lateral del bloque.\" width=\"2216\" height=\"742\"><figcaption id=\"caption-attachment-133871\" class=\"wp-caption-text\">Nombre del bloque y descripci\u00f3n en la barra lateral del bloque.<\/figcaption><\/figure>\n<h4>Palabras clave<\/h4>\n<p>Como hemos mencionado anteriormente, puedes configurar con precisi\u00f3n los ajustes de los bloques mediante <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-registration\/\">propiedades<\/a> y <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">atributos<\/a>. Por ejemplo, puedes a\u00f1adir una o m\u00e1s <code>keywords<\/code> para ayudar a los usuarios a buscar bloques:<\/p>\n<pre><code class=\"language-json\">\"keywords\": [\n\"kinsta\", \n\"academy\", \n\"superhero\"\n],<\/code><\/pre>\n<p>Si ahora introduces \u00abkinsta\u00bb, \u00abacademy\u00bb o \u00absuperhero\u00bb en el insertador r\u00e1pido, el editor te sugerir\u00e1 el bloque de la Academia Kinsta:<\/p>\n<figure id=\"attachment_133969\" aria-describedby=\"caption-attachment-133969\" style=\"width: 2086px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133969 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-keywords.jpg\" alt=\"B\u00fasqueda de un bloque mediante una palabra clave en el insertador r\u00e1pido.\" width=\"2086\" height=\"944\"><figcaption id=\"caption-attachment-133969\" class=\"wp-caption-text\">B\u00fasqueda de un bloque mediante una palabra clave en el insertador r\u00e1pido.<\/figcaption><\/figure>\n<h4>Localizaci\u00f3n<\/h4>\n<p>Si te preguntas c\u00f3mo se produce la localizaci\u00f3n de las cadenas en el archivo JSON, aqu\u00ed tienes <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/30293\">la respuesta<\/a>:<\/p>\n<blockquote><p><em>En JavaScript, puede utilizar el m\u00e9todo <code>registerBlockTypeFromMetadata<\/code> del paquete <code>@wordpress\/blocks<\/code> <\/em><em>para registrar un tipo de bloque utilizando los metadatos cargados desde el archivo <strong>block.json<\/strong>. Todas las propiedades localizadas se envuelven autom\u00e1ticamente en llamadas a la funci\u00f3n <code>_x<\/code>(del paquete <code>@wordpress\/i18n<\/code>), <\/em><em>de forma similar a como funciona en PHP con <code>register_block_type_from_metadata<\/code>. El \u00fanico requisito es establecer la propiedad <code>textdomain<\/code>en el archivo <strong>block.json<\/strong>.<\/em><\/p><\/blockquote>\n<p>Aqu\u00ed estamos utilizando la funci\u00f3n <code>registerBlockType<\/code> en lugar de <code>registerBlockTypeFromMetadata<\/code>, ya que esta \u00faltima <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/32030\">ha quedado obsoleta<\/a> desde <a href=\"https:\/\/make.wordpress.org\/core\/2021\/05\/27\/whats-new-in-gutenberg-10-7-26-may\/\">Gutenberg 10.7<\/a>, pero el mecanismo es el mismo.<\/p>\n<h3 id=\"using-richtext-component\">Uso de los componentes incorporados: El componente RichText<\/h3>\n<p>Los elementos que conforman un bloque de Gutenberg son componentes de React, y puedes acceder a estos componentes a trav\u00e9s de la variable global <code>wp<\/code>. Por ejemplo, intenta escribir <code>wp.editor<\/code> en la consola de tu navegador. Esto te dar\u00e1 la lista completa de los componentes incluidos en el m\u00f3dulo <code>wp.editor<\/code>.<\/p>\n<p>Despl\u00e1zate por la lista y adivina para qu\u00e9 sirven los componentes por sus nombres.<\/p>\n<p>Del mismo modo, puede comprobar la lista de componentes incluidos en el m\u00f3dulo <code>wp.components<\/code>:<\/p>\n<figure id=\"attachment_133970\" aria-describedby=\"caption-attachment-133970\" style=\"width: 2288px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133970 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/wp-components.jpg\" alt=\"Componentes de WP Editor.\" width=\"2288\" height=\"1392\"><figcaption id=\"caption-attachment-133970\" class=\"wp-caption-text\">Componentes de WP Editor.<\/figcaption><\/figure>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>La <strong>programaci\u00f3n modular <\/strong>es una t\u00e9cnica de dise\u00f1o de software que hace hincapi\u00e9 en la separaci\u00f3n de la funcionalidad de un programa en <strong>m\u00f3dulos <\/strong>independientes e intercambiables, de forma que cada uno de ellos contenga todo lo necesario para ejecutar solo un aspecto de la funcionalidad deseada (Fuente: <a href=\"https:\/\/en.wikipedia.org\/wiki\/Modular_programming\">Wikipedia<\/a>).<\/p>\n<\/aside>\n\n<p>Ahora vuelve al archivo <strong>edit.js <\/strong>y echa un vistazo al script:<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps } from '@wordpress\/block-editor';\nimport '.\/editor.scss';\n\nexport default function Edit() {\n\treturn (\n\t\t&lt;p { ...useBlockProps() }&gt;\n\t\t\t{ __(\n\t\t\t\t'Kinsta Academy Block \u2013 hello from the editor!',\n\t\t\t\t'ka-example-block'\n\t\t\t) }\n\t\t&lt;\/p&gt;\n\t);\n}<\/code><\/pre>\n<p>Este c\u00f3digo genera un bloque est\u00e1tico con un texto simple y no editable. Pero podemos cambiar las cosas f\u00e1cilmente:<\/p>\n<figure id=\"attachment_133971\" aria-describedby=\"caption-attachment-133971\" style=\"width: 1400px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133971 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/starter-block-in-code-editor.jpg\" alt=\"El bloque de inicio en el editor de c\u00f3digo.\" width=\"1400\" height=\"772\"><figcaption id=\"caption-attachment-133971\" class=\"wp-caption-text\">El bloque de inicio en el editor de c\u00f3digo.<\/figcaption><\/figure>\n<p>Para hacer que el texto sea editable tendr\u00e1s que sustituir la etiqueta <code>&lt;p&gt;<\/code> actual por un componente que haga que el <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Guide\/HTML\/Editable_content\">contenido de entrada sea editable<\/a>. Para ello, Gutenberg proporciona el componente integrado <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\">RichText<\/a>.<\/p>\n<p>A\u00f1adir un componente incorporado a tu bloque es un proceso de 5 pasos:<\/p>\n<ol>\n<li><a href=\"#import-components\">Importar los componentes necesarios de un paquete de WordPress<\/a><\/li>\n<li><a href=\"#jsx-elements\">Incluir los elementos correspondientes en tu c\u00f3digo JSX<\/a><\/li>\n<li><a href=\"#define-attributes\">Definir los atributos necesarios en el archivo block.json<\/a><\/li>\n<li><a href=\"#define-event-handlers\">Definir los manejadores de eventos<\/a><\/li>\n<li><a href=\"#save-data\">Guardar datos<\/a><\/li>\n<\/ol>\n<h4 id=\"import-components\">Paso 1: Importar los componentes necesarios de un paquete de WordPress<\/h4>\n<p>Ahora abre el archivo <strong>edit.js <\/strong>y cambia la siguiente declaraci\u00f3n de <code>import<\/code>:<\/p>\n<pre><code class=\"language-js\">import { useBlockProps } from '@wordpress\/block-editor';<\/code><\/pre>\n<p>\u2026a:<\/p>\n<pre><code class=\"language-js\">import { useBlockProps, RichText } from '@wordpress\/block-editor';<\/code><\/pre>\n<p>De esta manera, est\u00e1s importando la funci\u00f3n <code>useBlockProps<\/code> y el componente <code>RichText<\/code> del paquete <code>@wordpress\/block-editor<\/code>.<\/p>\n<h5>useBlockProps<\/h5>\n<p>El hook <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\"><code>useBlockProps<\/code><\/a> de React marca el <a href=\"https:\/\/make.wordpress.org\/core\/2020\/11\/18\/block-api-version-2\/\">elemento envolvente del bloque<\/a>:<\/p>\n<blockquote><p><em>Cuando se utiliza la versi\u00f3n 2 de la API, se debe utilizar el nuevo gancho <code>useBlockProps<\/code> en la funci\u00f3n de <code>edit<\/code> para marcar el elemento envolvente del bloque. El gancho insertar\u00e1 los atributos y manejadores de eventos necesarios para habilitar el comportamiento del bloque. Cualquier atributo que desee pasar al elemento del bloque debe pasarse a trav\u00e9s de <code>useBlockProps<\/code> y el valor devuelto debe extenderse al elemento.<\/em><\/p><\/blockquote>\n<p>Para simplificar, <code>useBlockProps<\/code> asigna autom\u00e1ticamente atributos y clases al elemento envolvente (el elemento <code>p<\/code> en nuestro ejemplo):<\/p>\n<figure id=\"attachment_133973\" aria-describedby=\"caption-attachment-133973\" style=\"width: 2614px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133973 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/useblockprops.jpg\" alt=\"Elementos y clases generados por useBlockProps.\" width=\"2614\" height=\"966\"><figcaption id=\"caption-attachment-133973\" class=\"wp-caption-text\">Elementos y clases generados por useBlockProps.<\/figcaption><\/figure>\n<p>Si se elimina <code>useBlockProps<\/code> del elemento envolvente, se tendr\u00eda una simple cadena de texto sin acceso a la funcionalidad y el estilo del bloque:<\/p>\n<figure id=\"attachment_133974\" aria-describedby=\"caption-attachment-133974\" style=\"width: 2614px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133974 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/without-useblockprops.jpg\" alt=\"El mismo bloque sin useBlockProps.\" width=\"2614\" height=\"1016\"><figcaption id=\"caption-attachment-133974\" class=\"wp-caption-text\">El mismo bloque sin useBlockProps.<\/figcaption><\/figure>\n<p>Como <a href=\"#additional-improvements\">explicaremos m\u00e1s adelante<\/a>, tambi\u00e9n puedes pasar <code>useBlockProps<\/code> un objeto de propiedades para personalizar la salida.<\/p>\n<h5>RichText<\/h5>\n<p>El componente RichText proporciona una entrada <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Guide\/HTML\/Editable_content\">con contenido editable<\/a>, permitiendo a los usuarios editar y formatear el contenido.<\/p>\n<p>Encontrar\u00e1s el componente documentado en GitHub en <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\">gutenberg\/packages\/block-editor\/src\/components\/rich-text\/README.md<\/a>.<\/p>\n<h4 id=\"jsx-elements\">Paso 2: Incluir los elementos correspondientes en tu c\u00f3digo JSX<\/h4>\n<pre><code class=\"language-jsx\">...\n\nconst blockProps = useBlockProps();\n\nreturn (\n\t&lt;RichText \n\t\t{ ...blockProps }\n\t\ttagName=\"p\"\n\t\tonChange={ onChangeContent }\n\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\tvalue={ attributes.content }\n\t\tplaceholder={ __( 'Write your text...' ) }\n\t\/&gt;\n);<\/code><\/pre>\n<p>Comentemos el c\u00f3digo l\u00ednea por l\u00ednea:<\/p>\n<ul>\n<li><code>tagName<\/code> \u2014 funci\u00f3n llamada cuando el contenido del elemento cambia<\/li>\n<li><code>onChange<\/code> \u2014 funci\u00f3n llamada cuando el contenido del elemento cambia<\/li>\n<li><code>allowedFormats<\/code> \u2014 una matriz de formatos permitidos. Por defecto, se permiten todos los formatos<\/li>\n<li><code>value<\/code> \u2014 la cadena HTML para hacerla editable<\/li>\n<li><code>placeholder<\/code> \u2014 texto que se mostrar\u00e1 cuando el elemento est\u00e9 vac\u00edo<\/li>\n<\/ul>\n<h4 id=\"define-attributes\">Paso 3: Definir los atributos necesarios en el archivo block.json<\/h4>\n<p>Los <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">atributos<\/a> proporcionan informaci\u00f3n sobre los datos almacenados por un bloque, como el contenido enriquecido, el color de fondo, las URL, etc.<\/p>\n<p>Puede establecer un n\u00famero arbitrario de atributos dentro de un objeto de <code>attributes<\/code> en pares clave\/valor, donde la clave es el nombre del atributo y el valor es la definici\u00f3n del atributo.<\/p>\n<p>Ahora abre el archivo <strong>block.json <\/strong>y a\u00f1ade los siguientes <code>attributes<\/code> prop:<\/p>\n<pre><code class=\"language-json\">\"attributes\": {\n\t\"content\": {\n\t\t\"type\": \"string\",\n\t\t\"source\": \"html\",\n\t\t\"selector\": \"p\"\n\t}\n},<\/code><\/pre>\n<p>El atributo de <code>content<\/code> permite almacenar el texto escrito por el usuario en el campo editable:<\/p>\n<ul>\n<li><code>type<\/code> indica el tipo de datos almacenados por el atributo. El tipo es obligatorio a menos que se defina una propiedad <code>enum<\/code>.<\/li>\n<li><code>source<\/code> define c\u00f3mo se extrae el valor del atributo del contenido de la entrada. En nuestro ejemplo, es el contenido HTML. Ten en cuenta que si no proporciona una propiedad de fuente, los datos se almacenan en el delimitador de bloque (<a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/#value-source\">leer m\u00e1s<\/a>).<\/li>\n<li><code>selector<\/code> es una etiqueta HTML o cualquier otro selector, como un nombre de clase o un atributo id.<\/li>\n<\/ul>\n<p>Pasaremos a la funci\u00f3n <code>Edit<\/code> un objeto de propiedades. As\u00ed que, vuelve al archivo <strong>edit.js <\/strong>y haz el siguiente cambio:<\/p>\n<pre><code class=\"language-js\">export default function Edit( { attributes, setAttributes } ) { ... }<\/code><\/pre>\n<h4 id=\"define-event-handlers\">Paso 4: Definir los manejadores de eventos<\/h4>\n<p>El elemento <code>RichText<\/code> tiene un atributo <code>onChange<\/code>, que proporciona una funci\u00f3n para llamar cuando el contenido del elemento cambia.<\/p>\n<p>Definamos esa funci\u00f3n y veamos todo el script <strong>edit.js<\/strong>:<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps, RichText } from '@wordpress\/block-editor';\nimport '.\/editor.scss';\n\nexport default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\n\tconst onChangeContent = ( newContent ) =&gt; {\n\t\tsetAttributes( { content: newContent } )\n\t}\n\n\treturn (\n\t\t&lt;RichText \n\t\t\t{ ...blockProps }\n\t\t\ttagName=\"p\"\n\t\t\tonChange={ onChangeContent }\n\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\tvalue={ attributes.content }\n\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Ahora guarda el archivo y vuelve a tu panel de control de WordPress, crea una nueva entrada o p\u00e1gina y a\u00f1ade tu bloque personalizado:<\/p>\n<figure id=\"attachment_134001\" aria-describedby=\"caption-attachment-134001\" style=\"width: 2618px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134001 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/rich-text-component.jpg\" alt=\"La salida del componente RichText en el Editor de bloques.\" width=\"2618\" height=\"960\"><figcaption id=\"caption-attachment-134001\" class=\"wp-caption-text\">La salida del componente RichText en el Editor de bloques.<\/figcaption><\/figure>\n<p>A\u00f1ade algo de texto y cambia a la vista de c\u00f3digo. Este es el aspecto que deber\u00eda tener su c\u00f3digo:<\/p>\n<pre><code class=\"language-html\">&lt;!-- wp:ka-example-block\/ka-example-block --&gt;\n&lt;p class=\"wp-block-ka-example-block-ka-example-block\"&gt;Kinsta Academy Block \u2013 hello from the saved content!&lt;\/p&gt;\n&lt;!-- \/wp:ka-example-block\/ka-example-block --&gt;<\/code><\/pre>\n<p>Como puedes ver, si cambias al Editor de C\u00f3digo, el contenido de tu bloque ha cambiado. Eso es porque tienes que modificar el archivo <strong>save.js <\/strong>para almacenar la entrada del usuario en la base de datos cuando se guarda la entrada.<\/p>\n<h4 id=\"save-data\">Paso 5: Guardar los datos<\/h4>\n<p>Ahora abre el archivo <strong>save.js <\/strong>y cambia el script como sigue:<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps, RichText } from '@wordpress\/block-editor';\n\nexport default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ attributes.content } \n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Eso es lo que estamos haciendo aqu\u00ed:<\/p>\n<ul>\n<li>Importa el componente <code>RichText<\/code> paquete <code>block-editor<\/code>.<\/li>\n<li>Pasa varias propiedades a trav\u00e9s de un argumento de objeto a la funci\u00f3n de <code>save<\/code> (en este ejemplo, solo estamos pasando la <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#attributes\"><code>attributes<\/code> propiedad<\/a>)<\/li>\n<li>Devuelve el contenido del componente <code>RichText<\/code><\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Cada vez que cambies la funci\u00f3n de guardar, deber\u00e1s eliminar cualquier instancia de bloque en el lienzo del editor e incluirla de nuevo para que funcione correctamente. M\u00e1s informaci\u00f3n sobre la <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#validation\">validaci\u00f3n de bloques<\/a>.<\/p>\n<\/aside>\n\n<figure id=\"attachment_134002\" aria-describedby=\"caption-attachment-134002\" style=\"width: 1770px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134002 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-content-in-the-code-editor.jpg\" alt=\"El contenido del bloque se ha guardado en la base de datos\" width=\"1770\" height=\"1000\"><figcaption id=\"caption-attachment-134002\" class=\"wp-caption-text\">El contenido del bloque se ha guardado en la base de datos<\/figcaption><\/figure>\n<p>Puedes leer m\u00e1s sobre el componente <code>RichText<\/code> en el <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/richtext\/\">Manual del Editor de Bloques<\/a> y encontrar la <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/HEAD\/packages\/block-editor\/src\/components\/rich-text\/README.md\">lista completa de accesorios en Github<\/a><\/p>\n<p>Ahora vamos a dar un paso m\u00e1s. En la siguiente secci\u00f3n, aprender\u00e1s a a\u00f1adir controles a la barra de herramientas del bloque.<\/p>\n<h3 id=\"adding-block-toolbar-controls\">A\u00f1adir controles a la barra de herramientas del bloque<\/h3>\n<p>La <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">barra de herramientas del bloque<\/a> contiene un conjunto de controles que permiten a los usuarios manipular partes del contenido del bloque. Para cada control de la barra de herramientas, encontrar\u00e1 un componente:<\/p>\n<figure id=\"attachment_134007\" aria-describedby=\"caption-attachment-134007\" style=\"width: 1212px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134007 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/paragraph-toolbar.jpg\" alt=\"La barra de herramientas del bloque de p\u00e1rrafo principal.\" width=\"1212\" height=\"242\"><figcaption id=\"caption-attachment-134007\" class=\"wp-caption-text\">La barra de herramientas del bloque de p\u00e1rrafo principal.<\/figcaption><\/figure>\n<p>Por ejemplo, puedes a\u00f1adir un control de alineaci\u00f3n de texto para tu bloque. Todo lo que necesitas hacer es importar dos componentes del paquete <code>@wordpress\/block-editor<\/code>.<\/p>\n<p>Seguiremos los mismos pasos que en el ejemplo anterior:<\/p>\n<ol>\n<li>Importar los componentes necesarios de los paquetes de WordPress<\/li>\n<li>Incluir los elementos correspondientes en tu c\u00f3digo JSX<\/li>\n<li>Definir los atributos necesarios en el archivo <strong>block.json<\/strong><\/li>\n<li>Definir manejadores de eventos<\/li>\n<li>Guardar datos<\/li>\n<\/ol>\n<h4>Paso 1: Importar los componentes BlockControls y AlignmentControl de @wordpress\/block-editor<\/h4>\n<p>Para a\u00f1adir un control de alineaci\u00f3n a la barra de herramientas del bloque, necesitas dos componentes:<\/p>\n<ul>\n<li><code>BlockControls<\/code> muestra una barra de herramientas din\u00e1mica de controles (no documentada).<\/li>\n<li><code>AlignmentControl<\/code> presenta un men\u00fa desplegable que muestra las opciones de alineaci\u00f3n del bloque seleccionado (<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/alignment-control\/README.md\">m\u00e1s informaci\u00f3n<\/a>)<\/li>\n<\/ul>\n<p>Abre el archivo <strong>edit.js <\/strong>y edite la declaraci\u00f3n de <code>import<\/code> como se muestra a continuaci\u00f3n:<\/p>\n<pre><code class=\"language-js\">import { \n\tuseBlockProps, \n\tRichText, \n\tAlignmentControl, \n\tBlockControls \n} from '@wordpress\/block-editor';<\/code><\/pre>\n<h4>Paso 2: A\u00f1adir elementos BlockControls y AlignmentControl<\/h4>\n<p>Dir\u00edgete a la funci\u00f3n <code>Edit<\/code> e inserta el elemento <code>&lt;BlockControls \/&gt;<\/code>; al mismo nivel que <code>&lt;RichText \/&gt;<\/code>;. A continuaci\u00f3n, a\u00f1ade y <code>&lt;AlignmentControl \/&gt;<\/code>; dentro de <code>&lt;BlockControls \/&gt;<\/code>; :<\/p>\n<pre><code class=\"language-jsx\">export default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\treturn (\n\t\t&lt;&gt;\n\t\t\t&lt;BlockControls&gt;\n\t\t\t\t&lt;AlignmentControl\n\t\t\t\t\tvalue={ attributes.align }\n\t\t\t\t\tonChange={ onChangeAlign }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/BlockControls&gt;\n\t\t\t&lt;RichText \n\t\t\t\t{ ...blockProps }\n\t\t\t\ttagName=\"p\"\n\t\t\t\tonChange={ onChangeContent }\n\t\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\t\tvalue={ attributes.content }\n\t\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\t\tstyle={ { textAlign: attributes.align } }\n\t\t\t\/&gt;\n\t\t&lt;\/&gt;\n\t);\n}<\/code><\/pre>\n<p>En el c\u00f3digo anterior, <code>&lt;&gt;<\/code> y <code>&lt;\/&gt;<\/code> son la sintaxis corta para declarar <a href=\"https:\/\/reactjs.org\/docs\/fragments.html#short-syntax\">fragmentos de React<\/a>, que es como devolvemos m\u00faltiples elementos en React.<\/p>\n<p>En este ejemplo, <code>AlignmentControl<\/code> tiene dos atributos:<\/p>\n<ul>\n<li><code>value<\/code> proporciona el valor actual del elemento<\/li>\n<li><code>onChange<\/code> proporciona un <a href=\"https:\/\/reactjs.org\/docs\/handling-events.html\">controlador de eventos<\/a> que se ejecuta cuando el valor cambia<\/li>\n<\/ul>\n<p>Tambi\u00e9n hemos definido atributos adicionales para el elemento <code>RichText<\/code> (consulta la <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\">lista completa de atributos con ejemplos<\/a>)<\/p>\n<h4>Paso 3: Definir el atributo align en block.json<\/h4>\n<p>Ahora ve al archivo <strong>block.json <\/strong>y a\u00f1ade el atributo <code>align<\/code>:<\/p>\n<pre><code class=\"language-json\">\"align\": {\n\t\"type\": \"string\",\n\t\"default\": \"none\"\n}<\/code><\/pre>\n<p>Cuando termines, vuelve al editor de bloques, actualiza la p\u00e1gina y selecciona el bloque. Deber\u00edas ver un mensaje de error dentro de tu bloque.<\/p>\n<figure id=\"attachment_134008\" aria-describedby=\"caption-attachment-134008\" style=\"width: 1770px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134008 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-showing-an-error-message.jpg\" alt=\"El bloque muestra un mensaje de error\" width=\"1770\" height=\"818\"><figcaption id=\"caption-attachment-134008\" class=\"wp-caption-text\">El bloque muestra un mensaje de error<\/figcaption><\/figure>\n<p>El motivo es que a\u00fan no hemos definido nuestro controlador de eventos.<\/p>\n<h4>Paso 4: Definir los manejadores de eventos<\/h4>\n<p>Ahora define <code>onChangeAlign<\/code>:<\/p>\n<pre><code class=\"language-js\">const onChangeAlign = ( newAlign ) =&gt; {\n\tsetAttributes( { \n\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t} )\n}<\/code><\/pre>\n<p>Si <code>newAlign<\/code> est\u00e1 <code>undefined<\/code>, entonces establecemos <code>newAlign<\/code> como <code>none<\/code>. En caso contrario, utilizamos <code>newAlign<\/code>.<\/p>\n<p>Nuestro script <strong>edit.js <\/strong>deber\u00eda estar completo (por ahora):<\/p>\n<pre><code class=\"language-jsx\">export default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\tconst onChangeContent = ( newContent ) =&gt; {\n\t\tsetAttributes( { content: newContent } )\n\t}\n\tconst onChangeAlign = ( newAlign ) =&gt; {\n\t\tsetAttributes( { \n\t\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t\t} )\n\t}\n\treturn (\n\t\t&lt;&gt;\n\t\t\t&lt;BlockControls&gt;\n\t\t\t\t&lt;AlignmentControl\n\t\t\t\t\tvalue={ attributes.align }\n\t\t\t\t\tonChange={ onChangeAlign }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/BlockControls&gt;\n\t\t\t&lt;RichText \n\t\t\t\t{ ...blockProps }\n\t\t\t\ttagName=\"p\"\n\t\t\t\tonChange={ onChangeContent }\n\t\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\t\tvalue={ attributes.content }\n\t\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\t\tstyle={ { textAlign: attributes.align } }\n\t\t\t\/&gt;\n\t\t&lt;\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Ahora puedes volver al editor y alinear el contenido del bloque. Tu bloque deber\u00eda mostrar con orgullo una Barra de Herramientas de Alineaci\u00f3n.<\/p>\n<figure id=\"attachment_134009\" aria-describedby=\"caption-attachment-134009\" style=\"width: 1772px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134009 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/alignment-toolbar.jpg\" alt=\"Nuestro bloque tiene ahora una Barra de Herramientas de Alineaci\u00f3n\" width=\"1772\" height=\"702\"><figcaption id=\"caption-attachment-134009\" class=\"wp-caption-text\">Nuestro bloque tiene ahora una Barra de Herramientas de Alineaci\u00f3n<\/figcaption><\/figure>\n<p>Pero si guardas la entrada, ver\u00e1s que el contenido de tu bloque no est\u00e1 alineado en el front end como lo est\u00e1 en el editor de bloques. Eso es porque tenemos que modificar la funci\u00f3n de <code>save<\/code> para almacenar el contenido y los atributos del bloque en la base de datos.<\/p>\n<h4>Paso 5: Guardar los datos<\/h4>\n<p>Abre <strong>save.js <\/strong>y cambia la funci\u00f3n de\u00a0 <code>save<\/code> como sigue:<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ attributes.content } \n\t\t\tstyle={ { textAlign: attributes.align } }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Por \u00faltimo, para hacer el c\u00f3digo m\u00e1s legible, puede extraer las propiedades individuales del objeto <code>attribute<\/code> utilizando la <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Operators\/Destructuring_assignment\">sintaxis de asignaci\u00f3n de desestructuraci\u00f3n<\/a>:<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\tconst { content, align } = attributes;\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ content } \n\t\t\tstyle={ { textAlign: align } }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Puedes hacer lo mismo en el archivo <strong>edit.js<\/strong>.<\/p>\n<p>Ahora guarda el archivo y cambia al Editor de C\u00f3digo. El c\u00f3digo del bloque deber\u00eda tener el siguiente aspecto:<\/p>\n<pre><code class=\"language-html\">&lt;!-- wp:ka-example-block\/ka-example-block {\"align\":\"right\"} --&gt;\n&lt;p class=\"wp-block-ka-example-block-ka-example-block\" style=\"text-align:right\"&gt;This is my first editable &lt;strong&gt;Gutenberg&lt;\/strong&gt; &lt;em&gt;block&lt;\/em&gt; \ud83d\ude0e&lt;\/p&gt;\n&lt;!-- \/wp:ka-example-block\/ka-example-block --&gt;<\/code><\/pre>\n<figure id=\"attachment_134010\" aria-describedby=\"caption-attachment-134010\" style=\"width: 1446px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134010 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-toolbar-controls.jpg\" alt=\"Comprobaci\u00f3n de los controles de la barra de herramientas del bloque\" width=\"1446\" height=\"498\"><figcaption id=\"caption-attachment-134010\" class=\"wp-caption-text\">Comprobaci\u00f3n de los controles de la barra de herramientas del bloque<\/figcaption><\/figure>\n<p>\u00a1Y eso es todo! Acabas de a\u00f1adir un control de alineaci\u00f3n a la barra de herramientas del bloque \ud83e\udd13<\/p>\n<p>Puede leer m\u00e1s sobre <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">los controles de la barra de herramientas del bloque<\/a> en el Manual del Editor de Bloques.<\/p>\n<h3 id=\"settings-sidebar\">Personalizaci\u00f3n de la barra lateral de configuraci\u00f3n del bloque<\/h3>\n<p>Tambi\u00e9n puedes a\u00f1adir controles a la <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">barra lateral de configuraci\u00f3n<\/a> del bloque (o incluso crear una nueva barra lateral para su aplicaci\u00f3n).<\/p>\n<p>La API proporciona un <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/inspector-controls\/README.md\"><code>InspectorControls<\/code> componente<\/a> para ello.<\/p>\n<p>El manual del editor de bloques explica <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/#settings-sidebar\">c\u00f3mo utilizar la barra lateral de configuraci\u00f3n<\/a>:<\/p>\n<blockquote><p><em>La barra lateral de ajustes se utiliza para mostrar los ajustes menos utilizados o los que requieren m\u00e1s espacio en la pantalla. La barra lateral de configuraci\u00f3n debe utilizarse <strong>\u00fanicamente para los ajustes a nivel de bloque<\/strong>.<\/em><\/p>\n<p><em>Si tiene ajustes que solo afectan al contenido seleccionado dentro de un bloque (por ejemplo, el ajuste de \u00abnegrita\u00bb para el texto seleccionado dentro de un p\u00e1rrafo): <\/em>no lo coloques dentro de la barra lateral de ajustes.<em> La barra lateral de configuraci\u00f3n se muestra incluso cuando se edita un bloque en modo HTML, por lo que solo deber\u00eda contener ajustes a nivel de bloque.<\/em><\/p><\/blockquote>\n<p>Otra vez:<\/p>\n<ol>\n<li>Importar los componentes necesarios de los paquetes de WordPress<\/li>\n<li>Incluir los elementos correspondientes en tu c\u00f3digo JSX<\/li>\n<li>Definir los atributos necesarios en el archivo block.json<\/li>\n<li>Definir manejadores de eventos<\/li>\n<li>Guardar datos<\/li>\n<\/ol>\n<h4>Paso 1. Importar los componentes InspectorControls y PanelColorSettings de @wordpress\/block-editor<\/h4>\n<p>Puedes a\u00f1adir varios controles para que los usuarios puedan personalizar aspectos concretos del bloque. Por ejemplo, puedes proporcionar un panel de control del color. Para ello, tendr\u00e1s que importar los componentes <code>InspectorControls<\/code> y <code>PanelColorSettings<\/code> m\u00f3dulo <code>block-editor<\/code>:<\/p>\n<pre><code class=\"language-js\">import { \n\tuseBlockProps, \n\tRichText, \n\tAlignmentControl, \n\tBlockControls,\n\tInspectorControls,\n\tPanelColorSettings\n} from '@wordpress\/block-editor';<\/code><\/pre>\n<h4>Paso 2: Incluir los elementos correspondientes en tu c\u00f3digo JSX<\/h4>\n<p>Ahora puede a\u00f1adir los elementos correspondientes al JSX devuelto por la funci\u00f3n <code>Edit<\/code>:<\/p>\n<pre><code class=\"language-jsx\">export default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\n\tconst { content, align, backgroundColor, textColor } = attributes;\n\n\tconst onChangeContent = ( newContent ) =&gt; {\n\t\tsetAttributes( { content: newContent } )\n\t}\n\tconst onChangeAlign = ( newAlign ) =&gt; {\n\t\tsetAttributes( { \n\t\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t\t} )\n\t}\n\treturn (\n\t\t&lt;&gt;\n\t\t\t&lt;InspectorControls&gt;\n\t\t\t\t&lt;PanelColorSettings \n\t\t\t\t\ttitle={ __( 'Color settings', 'ka-example-block' ) }\n\t\t\t\t\tinitialOpen={ false }\n\t\t\t\t\tcolorSettings={ [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t  value: textColor,\n\t\t\t\t\t\t  onChange: onChangeTextColor,\n\t\t\t\t\t\t  label: __( 'Text color', 'ka-example-block' )\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t  value: backgroundColor,\n\t\t\t\t\t\t  onChange: onChangeBackgroundColor,\n\t\t\t\t\t\t  label: __( 'Background color', 'ka-example-block' )\n\t\t\t\t\t\t}\n\t\t\t\t\t] }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/InspectorControls&gt;\n\t\t\t&lt;BlockControls&gt;\n\t\t\t\t&lt;AlignmentControl\n\t\t\t\t\tvalue={ align }\n\t\t\t\t\tonChange={ onChangeAlign }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/BlockControls&gt;\n\t\t\t&lt;RichText \n\t\t\t\t{ ...blockProps }\n\t\t\t\ttagName=\"p\"\n\t\t\t\tonChange={ onChangeContent }\n\t\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\t\tvalue={ content }\n\t\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\t\tstyle={ { textAlign: align, backgroundColor: backgroundColor, color: textColor } }\n\t\t\t\/&gt;\n\t\t&lt;\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Observa que tambi\u00e9n hemos actualizado el atributo de <code>style<\/code> del elemento <code>RichText<\/code>:<\/p>\n<pre><code class=\"language-jsx\">&lt;RichText \n\t { ...blockProps }\n\t tagName=\"p\"\n\t onChange={ onChangeContent }\n\t allowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t value={ content }\n\t placeholder={ __( 'Write your text...', 'my-affiliate-block' ) }\n\t style={ { textAlign: align, backgroundColor: backgroundColor, color: textColor } }\n\/&gt;<\/code><\/pre>\n<h4>Paso 3: Definir los atributos necesarios en block.json<\/h4>\n<p>Ahora define los atributos <code>backgroundColor<\/code> y <code>textColor<\/code> en el archivo <strong>block.json<\/strong>:<\/p>\n<pre><code class=\"language-json\">\"attributes\": {\n\t\"content\": {\n\t\t\"type\": \"string\",\n\t\t\"source\": \"html\",\n\t\t\"selector\": \"p\"\n\t},\n\t\"align\": {\n\t\t\"type\": \"string\",\n\t\t\"default\": \"none\"\n\t},\n\t\"backgroundColor\": {\n\t\t\"type\": \"string\"\n\t},\t \n\t\"textColor\": {\n\t\t\"type\": \"string\"\n\t}\n},<\/code><\/pre>\n<h4>Paso 4: Definir los manejadores de eventos<\/h4>\n<p>Ahora necesitas definir dos funciones para actualizar <code>backgroundColor<\/code> y <code>textColor<\/code> en la entrada del usuario:<\/p>\n<pre><code class=\"language-js\">const onChangeBackgroundColor = ( newBackgroundColor ) =&gt; {\n\tsetAttributes( { backgroundColor: newBackgroundColor } )\n}\nconst onChangeTextColor = ( newTextColor ) =&gt; {\n\tsetAttributes( { textColor: newTextColor } )\n}<\/code><\/pre>\n<h4>Paso 5: Guardar los datos<\/h4>\n<p>Un \u00faltimo paso: Abre el archivo <strong>save.js <\/strong>y cambia el script de la siguiente manera:<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\tconst { content, align, backgroundColor, textColor } = attributes;\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ content } \n\t\t\tstyle={ { textAlign: align, backgroundColor: backgroundColor, color: textColor } }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Guarda el archivo y comprueba el bloque en el editor. Es posible que te encuentres con una sorpresa no deseada: un mensaje de error que te avisa de que el bloque tiene un contenido inesperado o no v\u00e1lido.<\/p>\n<figure id=\"attachment_134011\" aria-describedby=\"caption-attachment-134011\" style=\"width: 1396px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134011 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/unexpected-or-invalid-content.jpg\" alt=\"Mensaje de error de contenido inesperado o no v\u00e1lido\" width=\"1396\" height=\"542\"><figcaption id=\"caption-attachment-134011\" class=\"wp-caption-text\">Mensaje de error de contenido inesperado o no v\u00e1lido<\/figcaption><\/figure>\n<p>Esto ocurre porque el archivo <strong>save.js<\/strong> se ha modificado y el c\u00f3digo guardado en la base de datos no coincide con el c\u00f3digo utilizado en el editor.<\/p>\n<p>Para solucionarlo, actualiza la p\u00e1gina, elimina cualquier instancia de tu bloque y a\u00f1\u00e1delo de nuevo a tu entrada:<\/p>\n<figure id=\"attachment_134012\" aria-describedby=\"caption-attachment-134012\" style=\"width: 1962px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134012 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/color-settings-panel.jpg\" alt=\"El panel de configuraci\u00f3n del Color en la Barra Lateral de Configuraci\u00f3n del bloque\" width=\"1962\" height=\"1020\"><figcaption id=\"caption-attachment-134012\" class=\"wp-caption-text\">El panel de configuraci\u00f3n del Color en la Barra Lateral de Configuraci\u00f3n del bloque<\/figcaption><\/figure>\n<p>Realiza los cambios, guarda la entrada y visual\u00edzala en el front end. Ahora los cambios que hiciste en el editor de bloques deber\u00edan reflejarse en el front site.<\/p>\n<figure id=\"attachment_134013\" aria-describedby=\"caption-attachment-134013\" style=\"width: 1918px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134013 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/custom-settings-applied.jpg\" alt=\"El bloque personalizado ahora funciona correctamente en el front end\" width=\"1918\" height=\"628\"><figcaption id=\"caption-attachment-134013\" class=\"wp-caption-text\">El bloque personalizado ahora funciona correctamente en el front end<\/figcaption><\/figure>\n<h3 id=\"external-link\">A\u00f1adir y personalizar un enlace externo<\/h3>\n<p>En esta secci\u00f3n, a\u00f1adir\u00e1s nuevos componentes a tu tipo de bloque:<\/p>\n<ul>\n<li>Un componente <code>ExternalLink<\/code> permite a los usuarios a\u00f1adir un enlace personalizable a tu bloque personalizado<\/li>\n<li>Varios controles en la barra lateral que permiten a los usuarios personalizar la configuraci\u00f3n de los enlaces<\/li>\n<\/ul>\n<h4>Paso 1. Importar componentes desde @wordpress\/componentes<\/h4>\n<p>Ahora necesitas importar varios componentes de <code>@wordpress\/components<\/code>. Abre tu archivo edit.js y a\u00f1ade la siguiente declaraci\u00f3n de <code>import<\/code>:<\/p>\n<pre><code class=\"language-js\">import {\n\tTextControl,\n\tPanelBody,\n\tPanelRow,\n\tToggleControl,\n\tExternalLink\n} from '@wordpress\/components';<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/panel\/README.md#panelbody\"><code>PanelBody<\/code><\/a> a\u00f1ade un contenedor plegable a la barra lateral de configuraci\u00f3n.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/panel\/README.md#panelrow\"><code>PaneRow<\/code><\/a> produce un contenedor gen\u00e9rico para los controles de la barra lateral.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/text-control\/README.md\"><code>TextControl<\/code><\/a> proporciona un control de entrada de texto.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/toggle-control\/README.md\"><code>ToggleControl<\/code><\/a> proporciona una palanca que permite a los usuarios activar\/desactivar una opci\u00f3n espec\u00edfica<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/external-link\/README.md\"><code>ExternalLink<\/code><\/a> es un componente sencillo para a\u00f1adir un enlace externo.<\/li>\n<\/ul>\n<h4>Paso 2. Incluir los elementos correspondientes en su c\u00f3digo JSX<\/h4>\n<p>En primer lugar, a\u00f1adir\u00e1s el elemento <code>ExternalLink<\/code> al mismo nivel que <code>RichText<\/code> en un contenedor <code>div<\/code>:<\/p>\n<pre><code class=\"language-jsx\">&lt;div { ...blockProps }&gt;\n\t&lt;RichText \n\t\t...\n\t\/&gt;\n\t&lt;ExternalLink \n\t\thref={ kaLink }\n\t\tclassName=\"ka-button\"\n\t\trel={ hasLinkNofollow ? \"nofollow\" : \"\" }\n\t&gt;\n\t\t\t{ linkLabel }\n\t&lt;\/ExternalLink&gt;\n\n&lt;\/div&gt;<\/code><\/pre>\n<p>\u00a0<\/p>\n<p>El componente <code>ExternalLink<\/code> no est\u00e1 documentado, as\u00ed que nos remitimos al <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/external-link\/index.js\">propio componente<\/a> para obtener la lista de atributos disponibles. Aqu\u00ed estamos usando los atributos <code>href<\/code>, <code>className<\/code> y <code>rel<\/code>.<\/p>\n<p>Por defecto, el valor del atributo <code>rel<\/code> est\u00e1 establecido en <code>noopener noreferrer<\/code>. Nuestro c\u00f3digo a\u00f1adir\u00e1 la <a href=\"https:\/\/kinsta.com\/es\/blog\/links-nofollow-wordpress\/\"><code>nofollow<\/code> palabra clave al<\/a> atributo <code>rel<\/code> de la etiqueta <code>a<\/code> resultante cuando el control de alternancia est\u00e9 <strong>activado<\/strong>.<\/p>\n<p>Ahora puedes a\u00f1adir la configuraci\u00f3n de los enlaces a la barra lateral del bloque.<\/p>\n<p>En primer lugar, a\u00f1adir\u00e1s un elemento <code>PanelBody<\/code> dentro de <code>InspectorControls<\/code> al mismo nivel que <code>PanelColorSettings<\/code>:<\/p>\n<pre><code class=\"language-jsx\">&lt;InspectorControls&gt;\n\t&lt;PanelColorSettings \n\t...\n\t\/&gt;\n\t&lt;PanelBody \n\t\ttitle={ __( 'Link Settings' )}\n\t\tinitialOpen={true}\n\t&gt;\n\t...\n\t&lt;\/PanelBody&gt;\n&lt;\/InspectorControls&gt;<\/code><\/pre>\n<p>Esto es lo que estamos haciendo con esto:<\/p>\n<ol>\n<li>El atributo <code>title<\/code> proporciona el t\u00edtulo del panel.<\/li>\n<li><code>initialOpen<\/code> establece si el panel est\u00e1 abierto inicialmente o no.<\/li>\n<\/ol>\n<p>A continuaci\u00f3n, a\u00f1adiremos dos elementos <code>PanelRow<\/code> dentro de <code>PanelBody<\/code>, y un elemento <code>TextControl<\/code> dentro de cada <code>PanelRow<\/code>:<\/p>\n<pre><code class=\"language-jsx\">&lt;PanelBody \n\ttitle={ __( 'Link Settings', 'ka-example-block' )}\n\tinitialOpen={true}\n&gt;\n\t&lt;PanelRow&gt;\n\t\t&lt;fieldset&gt;\n\t\t\t&lt;TextControl\n\t\t\t\tlabel={__( 'KA link', 'ka-example-block' )}\n\t\t\t\tvalue={ kaLink }\n\t\t\t\tonChange={ onChangeKaLink }\n\t\t\t\thelp={ __( 'Add your Academy link', 'ka-example-block' )}\n\t\t\t\/&gt;\n\t\t&lt;\/fieldset&gt;\n\t&lt;\/PanelRow&gt;\n\t&lt;PanelRow&gt;\n\t\t&lt;fieldset&gt;\n\t\t\t&lt;TextControl\n\t\t\t\tlabel={__( 'Link label', 'ka-example-block' )}\n\t\t\t\tvalue={ linkLabel }\n\t\t\t\tonChange={ onChangeLinkLabel }\n\t\t\t\thelp={ __( 'Add link label', 'ka-example-block' )}\n\t\t\t\/&gt;\n\t\t&lt;\/fieldset&gt;\n\t&lt;\/PanelRow&gt;\n&lt;\/PanelBody&gt;<\/code><\/pre>\n<p>El c\u00f3digo anterior deber\u00eda ser bastante sencillo. Los dos controles de texto permiten a los usuarios establecer la etiqueta del enlace y la URL.<\/p>\n<p>Tambi\u00e9n a\u00f1adiremos un <code>PanelRow<\/code> adicional con un <code>ToggleControl<\/code> para activar\/desactivar una opci\u00f3n espec\u00edfica, como por ejemplo, incluir o no un atributo:<\/p>\n<pre><code class=\"language-jsx\">&lt;PanelRow&gt;\n\t&lt;fieldset&gt;\n\t\t&lt;ToggleControl\n\t\t\tlabel=\"Add rel = nofollow\"\n\t\t\thelp={\n\t\t\t\thasLinkNofollow\n\t\t\t\t\t? 'Has rel nofollow.'\n\t\t\t\t\t: 'No rel nofollow.'\n\t\t\t}\n\t\t\tchecked={ hasLinkNofollow }\n\t\t\tonChange={ toggleNofollow }\n\t\t\/&gt;\n\t&lt;\/fieldset&gt;\n&lt;\/PanelRow&gt;<\/code><\/pre>\n<h4>Paso 3: Definir los atributos necesarios en block.json<\/h4>\n<p>Ahora define los atributos <code>kaLink<\/code>, <code>linkLabel<\/code> y <code>hasLinkNofollow<\/code> en el archivo <strong>block.json<\/strong>:<\/p>\n<pre><code class=\"language-json\">\"kaLink\": {\n\t\"type\": \"string\",\n\t\"default\": \"\"\n},\n\"linkLabel\": {\n\t\"type\": \"string\",\n\t\"default\": \"Check it out!\"\n},\n\"hasLinkNofollow\": {\n\t\"type\": \"boolean\",\n\t\"default\": false\n}<\/code><\/pre>\n<p>No hay nada m\u00e1s que a\u00f1adir aqu\u00ed. Pasemos a definir las <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Events\/Event_handlers\">funciones de manejo de eventos<\/a>.<\/p>\n<h4>Paso 4: Definir los manejadores de eventos<\/h4>\n<p>Get back to the <strong>edit.js<\/strong> file, add the new attributes to the attributes object, and add the following functions:<\/p>\n<pre><code class=\"language-js\">const { content, align, backgroundColor, textColor, kaLink, linkLabel, hasLinkNofollow } = attributes;\n\nconst onChangeKaLink = ( newKaLink ) =&gt; {\n\tsetAttributes( { kaLink: newKaLink === undefined ? '' : newKaLink } )\n}\n\nconst onChangeLinkLabel = ( newLinkLabel ) =&gt; {\n\tsetAttributes( { linkLabel: newLinkLabel === undefined ? '' : newLinkLabel } )\n}\n\nconst toggleNofollow = () =&gt; {\n\tsetAttributes( { hasLinkNofollow: ! hasLinkNofollow } )\n}<\/code><\/pre>\n<p>Estas funciones actualizan los valores de los atributos correspondientes a la entrada del usuario.<\/p>\n<h4>Paso 5: Guardar los datos<\/h4>\n<p>Por \u00faltimo, tenemos que actualizar la funci\u00f3n de <code>save<\/code> en <strong>save.js<\/strong>:<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\t\n\tconst { content, align, backgroundColor, textColor, kaLink, linkLabel, hasLinkNofollow } = attributes;\n\n\tconst blockProps = useBlockProps.save( {\n\t\tclassName: `has-text-align-${ align }`\n\t} );\n\t\n\treturn (\n\t\t&lt;div \n\t\t\t{ ...blockProps }\n\t\t\tstyle={ { backgroundColor: backgroundColor } }\n\t\t&gt;\n\t\t\t&lt;RichText.Content \n\t\t\t\ttagName=\"p\" \n\t\t\t\tvalue={ content } \n\t\t\t\tstyle={ { color: textColor } }\n\t\t\t\/&gt;\n\t\t\t&lt;p&gt;\n\t\t\t\t&lt;a \n\t\t\t\t\thref={ kaLink }\n\t\t\t\t\tclassName=\"ka-button\"\n\t\t\t\t\trel={ hasLinkNofollow ? \"nofollow\" : \"noopener noreferrer\" }\n\t\t\t\t&gt;\n\t\t\t\t\t{ linkLabel }\n\t\t\t\t&lt;\/a&gt;\n\t\t\t&lt;\/p&gt;\n\t\t&lt;\/div&gt;\n\t);\n}<\/code><\/pre>\n<p>Ten en cuenta que aqu\u00ed hemos utilizado un elemento <code>a<\/code> normal en lugar de <code>ExternalLink<\/code>.<\/p>\n<p>Puedes ver el resultado en la imagen de abajo.<\/p>\n<figure id=\"attachment_134015\" aria-describedby=\"caption-attachment-134015\" style=\"width: 1964px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134015 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/link-settings.jpg\" alt=\"El panel de Configuraci\u00f3n de enlaces en la Barra lateral de Configuraci\u00f3n del bloque\" width=\"1964\" height=\"1146\"><figcaption id=\"caption-attachment-134015\" class=\"wp-caption-text\">El panel de Configuraci\u00f3n de enlaces en la Barra lateral de Configuraci\u00f3n del bloque<\/figcaption><\/figure>\n<p>Ahora guarda los datos y reinicia tu entorno.<\/p>\n<h3 id=\"multiple-block-styles\">A\u00f1adir varios estilos de bloque<\/h3>\n<p>En una secci\u00f3n anterior, aprendiste a a\u00f1adir un control de barra de herramientas de bloque que permite a los usuarios alinear la entrada del usuario. Podemos a\u00f1adir m\u00e1s controles de estilo a la barra de herramientas de bloque, pero tambi\u00e9n podemos proporcionar un conjunto de estilos de bloque predefinidos que el usuario puede elegir con un solo clic.<\/p>\n<p>Para ello, vamos a utilizar una \u00fatil funci\u00f3n de la API de bloques: <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#block-styles\">Estilos de bloque<\/a>.<\/p>\n<p>Todo lo que tienes que hacer es definir la propiedad de <code>styles<\/code> <strong>block.json <\/strong>y declarar los estilos correspondientes en tus hojas de estilo.<\/p>\n<p>Por ejemplo, puedes a\u00f1adir la siguiente serie de estilos:<\/p>\n<pre><code class=\"language-json\">\"styles\": [\n\t{\n\t\t\"name\": \"default\",\n\t\t\"label\": \"Default\",\n\t\t\"isDefault\": true\n\t},\n\t{\n\t\t\"name\": \"border\",\n\t\t\"label\": \"Border\"\n\t}\n],<\/code><\/pre>\n<p>Con esto, acabas de a\u00f1adir un estilo por defecto y un estilo adicional llamado <code>border<\/code>. Ahora vuelve al editor de bloques:<\/p>\n<figure id=\"attachment_134064\" aria-describedby=\"caption-attachment-134064\" style=\"width: 1874px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134064 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-styles.jpg\" alt=\"Dos estilos de bloque preconstruidos.\" width=\"1874\" height=\"1034\"><figcaption id=\"caption-attachment-134064\" class=\"wp-caption-text\">Dos estilos de bloque preconstruidos.<\/figcaption><\/figure>\n<p>Los estilos estar\u00e1n disponibles para el usuario haciendo clic en el <a href=\"https:\/\/kinsta.com\/es\/blog\/wordpress-5-8\/#normalized-block-toolbars\">conmutador de bloques<\/a> y buscando el <strong>panel de Estilos <\/strong>en la <strong>barra lateral de configuraci\u00f3n de bloques<\/strong>.<\/p>\n<p>Selecciona un estilo y compruebe las clases aplicadas al elemento <code>p<\/code>. Haz clic con el bot\u00f3n derecho del rat\u00f3n en el bloque e <strong>inspecciona<\/strong>. Se ha a\u00f1adido una nueva clase con un nombre estructurado de la siguiente manera:<\/p>\n<pre><code class=\"language-css\">is-style-{style-name}<\/code><\/pre>\n<p>Si ha marcado el estilo \u00abBorde\u00bb, se a\u00f1adir\u00e1 una clase <code>is-style-border<\/code> al elemento <code>p<\/code>. Si ha marcado el estilo \u00abPredeterminado\u00bb, se a\u00f1adir\u00e1 una clase <code>is-style-default<\/code> en su lugar.<\/p>\n<p>Ahora solo tienes que declarar las propiedades CSS. Abre el archivo <strong>editor.scss <\/strong>y sustituye los estilos actuales por los siguientes:<\/p>\n<pre><code class=\"language-css\">.wp-block-ka-example-block-ka-example-block {\n    padding: 4px;\n}<\/code><\/pre>\n<p>Ahora puedes hacer lo mismo con <strong>style.scss<\/strong>. Como mencionamos anteriormente, los estilos definidos en <strong>style.scss<\/strong> se aplican tanto en el front end como en el editor:<\/p>\n<pre><code class=\"language-css\">.wp-block-ka-example-block-ka-example-block {\n\t&.is-style-default{\n\t\tborder: 0;\n        background-color: #FFE2C7;\n\t}\n\t&.is-style-border{\n\t\tborder: 2px solid #000;\n        border-radius: 16px;\n        background-color: #F6F6F6;\n\t}\n}<\/code><\/pre>\n<p>Y ya est\u00e1. Actualiza la p\u00e1gina y divi\u00e9rtete con tus nuevos estilos de bloques:<\/p>\n<figure id=\"attachment_134067\" aria-describedby=\"caption-attachment-134067\" style=\"width: 1876px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134067 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-styles-compared.jpg\" alt=\"Estilos de bloque comparados\" width=\"1876\" height=\"960\"><figcaption id=\"caption-attachment-134067\" class=\"wp-caption-text\">Estilos de bloque comparados<\/figcaption><\/figure>\n<h3 id=\"innerblocks-component\">Anidaci\u00f3n de bloques Gutenberg con el componente InnerBlocks<\/h3>\n<p>Although fully functional, our custom block is still not very appealing. Para hacerlo m\u00e1s atractivo para el p\u00fablico, podr\u00edamos a\u00f1adir una imagen.<\/p>\n<p>Esto puede a\u00f1adir una capa de complejidad a nuestro bloque, pero, afortunadamente, no es necesario reinventar el mundo porque Gutenberg proporciona un componente espec\u00edfico que puedes utilizar para crear una estructura de <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/nested-blocks-inner-blocks\/\">bloques anidados<\/a>.<\/p>\n<p>El componente <code>InnerBlocks<\/code> se <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/inner-blocks\/README.md\">define como sigue<\/a>:<\/p>\n<blockquote><p><em><code>InnerBlocks<\/code> <\/em><em>exporta un par de componentes que pueden utilizarse en las implementaciones de bloques para permitir el contenido de bloques anidados.<\/em><\/p><\/blockquote>\n<p>En primer lugar, tendr\u00e1s que crear un nuevo archivo <strong>.js <\/strong>en la carpeta <strong>src<\/strong>. En nuestro ejemplo, llamaremos a este archivo <strong>container.js<\/strong>.<\/p>\n<p>Ahora tendr\u00e1s que importar el nuevo recurso en el archivo <strong>index.js<\/strong>:<\/p>\n<pre><code class=\"language-js\">import '.\/container';<\/code><\/pre>\n<p>Vuelve a <strong>container.js <\/strong>e importa los componentes necesarios:<\/p>\n<pre><code class=\"language-js\">import { registerBlockType } from \"@wordpress\/blocks\";\nimport { __ } from \"@wordpress\/i18n\";\nimport {\n\tuseBlockProps, \n\tInnerBlocks \n} from \"@wordpress\/block-editor\";<\/code><\/pre>\n<p>El siguiente paso es definir una plantilla que proporcione la estructura dentro de la cual se colocar\u00e1n los bloques. En el siguiente ejemplo, definimos una plantilla que consta de dos columnas que contienen un bloque de imagen principal y nuestro bloque personalizado:<\/p>\n<pre><code class=\"language-js\">const TEMPLATE = [ [ 'core\/columns', { backgroundColor: 'yellow', verticalAlignment: 'center' }, [\n\t[ 'core\/column', { templateLock: 'all' }, [\n\t\t[ 'core\/image' ],\n\t] ],\n\t[ 'core\/column', { templateLock: 'all' }, [\n\t\t[ 'ka-example-block\/ka-example-block', { placeholder: 'Enter side content...' } ],\n\t] ],\n] ] ];<\/code><\/pre>\n<p>La plantilla est\u00e1 estructurada como una <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/docs\/reference-guides\/block-api\/block-templates.md\">matriz de blockTypes<\/a> (nombre del bloque y atributos opcionales).<\/p>\n<p>En el c\u00f3digo anterior, hemos utilizado varios atributos para configurar los bloques Columnas y Columnas. En concreto, el atributo <code>templateLock: 'all'<\/code> bloquea los bloques Column para que el usuario no pueda a\u00f1adir, reordenar o eliminar los bloques existentes. <code>templateLock<\/code> puede tomar uno de los siguientes valores:<\/p>\n<ul>\n<li><code>all<\/code> \u2014 <code>InnerBlocks<\/code> est\u00e1 bloqueado, y no se pueden a\u00f1adir, reordenar o eliminar bloques.<\/li>\n<li><code>insert<\/code> \u2014 Los bloques s\u00f3lo pueden ser reordenados o eliminados.<\/li>\n<li><code>false<\/code> \u2014 &#8211; La plantilla no est\u00e1 bloqueada.<\/li>\n<\/ul>\n<p>La plantilla se asigna entonces al elemento <code>InnerBlocks<\/code>:<\/p>\n<pre><code class=\"language-jsx\">&lt;InnerBlocks\n\ttemplate={ TEMPLATE }\n\ttemplateLock=\"all\"\n\/&gt;<\/code><\/pre>\n<p>Para evitar cualquier problema de compatibilidad, tambi\u00e9n hemos a\u00f1adido un atributo <code>templateLock<\/code> al componente <code>InnerBlocks<\/code> (v\u00e9anse tambi\u00e9n el problema #<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/issues\/17262\">17262<\/a> y el pull #<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/26128\">26128<\/a>).<\/p>\n<p>Aqu\u00ed est\u00e1 nuestro archivo <strong>container.js <\/strong>final:<\/p>\n<pre><code class=\"language-jsx\">registerBlockType('ka-example-block\/ka-example-container-block', {\n\ttitle: __( 'KA Container block', 'ka-example-block' ),\n\tcategory: 'design',\n\n\tedit( { className } ) {\n\t\t\n\t\treturn(\n\t\t\t&lt;div className={ className }&gt;\n\t\t\t\t&lt;InnerBlocks\n\t\t\t\t\ttemplate={ TEMPLATE }\n\t\t\t\t\ttemplateLock=\"all\"\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/div&gt;\n\t\t)\n\t},\n\n\tsave() {\n\t\tconst blockProps = useBlockProps.save();\n\t\treturn(\n\t\t\t&lt;div { ...blockProps }&gt;\n\t\t\t\t&lt;InnerBlocks.Content \/&gt;\n\t\t\t&lt;\/div&gt;\n\t\t)\n\t},\n});<\/code><\/pre>\n<figure id=\"attachment_134068\" aria-describedby=\"caption-attachment-134068\" style=\"width: 2060px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134068 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-final.jpg\" alt=\"El bloque final en el editor de bloques\" width=\"2060\" height=\"1326\"><figcaption id=\"caption-attachment-134068\" class=\"wp-caption-text\">El bloque final en el editor de bloques<\/figcaption><\/figure>\n<h3 id=\"additional-improvements\">Mejoras adicionales<\/h3>\n<p>Nuestro bloque es totalmente funcional, pero podr\u00edamos mejorarlo un poco con algunos peque\u00f1os cambios.<\/p>\n<p>Hemos asignado el atributo <code>backgroundColor<\/code> al p\u00e1rrafo generado por el componente <code>RichText<\/code>. Sin embargo, podemos preferir asignar el color de fondo al <code>div<\/code> contenedor:<\/p>\n<p>Por lo tanto, cambie el archivo <strong>edit.js <\/strong>y los <code>div<\/code>s <strong>save.js <\/strong>como sigue:<\/p>\n<pre><code class=\"language-jsx\">&lt;div \n\t{ ...blockProps }\n\tstyle={ { backgroundColor: backgroundColor } }\n&gt;\n...\n&lt;\/div&gt;<\/code><\/pre>\n<p>Esto permitir\u00e1 al usuario cambiar el fondo de todo el bloque.<\/p>\n<p>Por otro lado, un cambio m\u00e1s relevante tiene que ver con el m\u00e9todo <code>useBlockProps<\/code>. En el c\u00f3digo original, definimos la constante <code>blockProps<\/code> como sigue:<\/p>\n<pre><code class=\"language-js\">const blockProps = useBlockProps();<\/code><\/pre>\n<p>Pero podemos utilizar el <code>useBlockProps<\/code> de forma m\u00e1s efectiva <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">pasando un conjunto de propiedades<\/a>. Por ejemplo, podemos importar <code>classnames<\/code> del m\u00f3dulo <code>classnames<\/code> y establecer el nombre de la clase envolvente en consecuencia.<\/p>\n<p>En el siguiente ejemplo, asignamos un nombre de clase basado en el valor del atributo <code>align<\/code> (<strong>edit.js<\/strong>).<\/p>\n<pre><code class=\"language-js\">import classnames from 'classnames';\n\n...\n\nexport default function Edit( { attributes, setAttributes } ) {\n\t...\n\t\n\tconst onChangeAlign = ( newAlign ) =&gt; {\n\t\tsetAttributes( { \n\t\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t\t} )\n\t}\n\n\tconst blockProps = useBlockProps( {\n\t\tclassName: `has-text-align-${ align }`\n\t} );\n\t...\n}<\/code><\/pre>\n<p>Haremos el mismo cambio en el archivo <strong>save.js<\/strong>:<\/p>\n<pre><code class=\"language-js\">import classnames from 'classnames';\n\n...\n\nexport default function save( { attributes } ) {\n\t...\n\tconst { content, align, backgroundColor, textColor, kaLink, linkLabel, hasLinkNofollow } = attributes;\n\n\tconst blockProps = useBlockProps.save( {\n\t\tclassName: `has-text-align-${ align }`\n\t} );\n\t...\n}<\/code><\/pre>\n<p>Y eso es todo. Ahora puede <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-scripts\/#build\">ejecutar la construcci\u00f3n para la producci\u00f3n<\/a>:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n\n<h2>Resumen<\/h2>\n<p>Y aqu\u00ed estamos, \u00a1al final de este incre\u00edble viaje! Empezamos con la configuraci\u00f3n del entorno de desarrollo y terminamos creando un tipo de bloque completo.<\/p>\n<p>Como mencionamos en la introducci\u00f3n, un conocimiento s\u00f3lido de Node.js, Webpack, Babel y React son esenciales para crear bloques avanzados de Gutenberg y posicionarse en el mercado como desarrollador profesional de Gutenberg.<\/p>\n<p>Sin embargo, no es necesario tener una experiencia establecida en React para empezar a divertirse con el desarrollo de bloques. El desarrollo de bloques podr\u00eda darte motivaci\u00f3n y objetivos para adquirir habilidades cada vez m\u00e1s amplias en las tecnolog\u00edas que hay detr\u00e1s de los bloques de Gutenberg.<\/p>\n<p>Esta gu\u00eda, por lo tanto, est\u00e1 lejos de ser completa. Es simplemente una introducci\u00f3n a una amplia variedad de temas que te ayudar\u00e1n a empezar a construir tus primeros bloques de Gutenberg.<\/p>\n<p>Por ello, te recomendamos que profundices tus conocimientos leyendo detenidamente la documentaci\u00f3n y las gu\u00edas en l\u00ednea. Entre los muchos recursos disponibles ah\u00ed fuera, te recomendamos los siguientes:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">Tutorial oficial de creaci\u00f3n de un bloque<\/a> para principiantes<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/\">Tutorial oficial de bloques<\/a> para desarrolladores intermedios<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/creating-dynamic-blocks\/\">Bloques din\u00e1micos<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/es\/blog\/bloques-dinamicos\/\">How to Create Dynamic Blocks for Gutenberg<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/metabox\/\">Meta Cajas<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/plugin-sidebar-0\/\">Creaci\u00f3n de una barra lateral para su plugin<\/a><\/li>\n<\/ul>\n<p>Si est\u00e1s empezando con el desarrollo de WordPress, es posible que quieras entender los conceptos b\u00e1sicos del desarrollo del frontend. Aqu\u00ed hay una lista r\u00e1pida de recursos que pueden ayudarte a empezar:<\/p>\n<ul>\n<li><a href=\"https:\/\/kinsta.com\/es\/ebooks\/wordpress\/wordpress-desarrollo-local\/\">C\u00f3mo instalar WordPress localmente<\/a> (ebook gratuito)<\/li>\n<li><a href=\"https:\/\/kinsta.com\/es\/ebooks\/wordpress\/wordpress-hosting-administrado\/\">El valor real del alojamiento gestionado de WordPress<\/a> (ebook gratuito)<\/li>\n<li><a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-javascript\/\">\u00bfQu\u00e9 es JavaScript?<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/es\/blog\/html-vs-html5\/\">HTML frente a HTML5<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/es\/blog\/css-wordpress\/\">C\u00f3mo editar el CSS en WordPress<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-php\/\">\u00bfQu\u00e9 es PHP?<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/es\/blog\/wordpress-hooks\/\">El curso de capacitaci\u00f3n sobre ganchos de WordPress: C\u00f3mo utilizar acciones, filtros y ganchos personalizados<\/a><\/li>\n<\/ul>\n<p>Y recuerda que el c\u00f3digo completo de los ejemplos de esta gu\u00eda est\u00e1 <a href=\"https:\/\/gist.github.com\/carlodaniele\/5f3dba8fff19d8ea836bdef5a2be7556\">disponible en Gist<\/a>.<\/p>\n<p>Ahora es tu turno: \u00bfHas desarrollado alg\u00fan bloque de Gutenberg? \u00bfCu\u00e1les son las principales dificultades que has experimentado hasta ahora? Cu\u00e9ntanos tu experiencia en los comentarios!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mucha gente se queja de las dificultades para empezar a construir bloques y aplicaciones de Gutenberg. La curva de aprendizaje es empinada, principalmente debido a la &#8230;<\/p>\n","protected":false},"author":36,"featured_media":44712,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[861,856,486],"topic":[1345],"class_list":["post-44710","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-block-editor","tag-development","tag-gutenberg","topic-desarrollo-wordpress"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Construcci\u00f3n de Bloques Personalizados de Gutenberg: El Tutorial Definitivo<\/title>\n<meta name=\"description\" content=\"Construir bloques Gutenberg puede parecer complicado al principio. \u00a1Pero no lo es! Esta gu\u00eda en profundidad te mostrar\u00e1 c\u00f3mo crear tu primer bloque de WP.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Construir Bloques Personalizados de Gutenberg: El Tutorial Definitivo de Desarrollo de Bloques\" \/>\n<meta property=\"og:description\" content=\"Construir bloques Gutenberg puede parecer complicado al principio. \u00a1Pero no lo es! Esta gu\u00eda en profundidad te mostrar\u00e1 c\u00f3mo crear tu primer bloque de WP.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinsta.es\/\" \/>\n<meta property=\"article:published_time\" content=\"2021-10-21T09:40:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-16T21:05:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/10\/bloques-gutenberg.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Carlo Daniele\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Construir bloques Gutenberg puede parecer complicado al principio. \u00a1Pero no lo es! Esta gu\u00eda en profundidad te mostrar\u00e1 c\u00f3mo crear tu primer bloque de WP.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/10\/bloques-gutenberg.png\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"54 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Construir Bloques Personalizados de Gutenberg: El Tutorial Definitivo de Desarrollo de Bloques\",\"datePublished\":\"2021-10-21T09:40:49+00:00\",\"dateModified\":\"2025-12-16T21:05:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/\"},\"wordCount\":9274,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/10\/bloques-gutenberg.png\",\"keywords\":[\"Block Editor\",\"development\",\"Gutenberg\"],\"articleSection\":[\"Desarrollo de WordPress\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/\",\"url\":\"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/\",\"name\":\"Construcci\u00f3n de Bloques Personalizados de Gutenberg: El Tutorial Definitivo\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/10\/bloques-gutenberg.png\",\"datePublished\":\"2021-10-21T09:40:49+00:00\",\"dateModified\":\"2025-12-16T21:05:59+00:00\",\"description\":\"Construir bloques Gutenberg puede parecer complicado al principio. \u00a1Pero no lo es! Esta gu\u00eda en profundidad te mostrar\u00e1 c\u00f3mo crear tu primer bloque de WP.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/10\/bloques-gutenberg.png\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/10\/bloques-gutenberg.png\",\"width\":1024,\"height\":512,\"caption\":\"Construyendo bloques personalizados de Gutenberg: El Tutorial Definitivo de Desarrollo de Bloques\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Desarrollo WordPress\",\"item\":\"https:\/\/kinsta.com\/es\/secciones\/desarrollo-wordpress\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Construir Bloques Personalizados de Gutenberg: El Tutorial Definitivo de Desarrollo de Bloques\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/es\/#website\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluciones de alojamiento premium, r\u00e1pidas y seguras\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/es\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinsta.es\/\",\"https:\/\/x.com\/Kinsta_ES\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"caption\":\"Carlo Daniele\"},\"description\":\"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.\",\"sameAs\":[\"https:\/\/frammentidicodice.com\/\",\"https:\/\/x.com\/carlodaniele\"],\"url\":\"https:\/\/kinsta.com\/es\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Construcci\u00f3n de Bloques Personalizados de Gutenberg: El Tutorial Definitivo","description":"Construir bloques Gutenberg puede parecer complicado al principio. \u00a1Pero no lo es! Esta gu\u00eda en profundidad te mostrar\u00e1 c\u00f3mo crear tu primer bloque de WP.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/","og_locale":"es_ES","og_type":"article","og_title":"Construir Bloques Personalizados de Gutenberg: El Tutorial Definitivo de Desarrollo de Bloques","og_description":"Construir bloques Gutenberg puede parecer complicado al principio. \u00a1Pero no lo es! Esta gu\u00eda en profundidad te mostrar\u00e1 c\u00f3mo crear tu primer bloque de WP.","og_url":"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinsta.es\/","article_published_time":"2021-10-21T09:40:49+00:00","article_modified_time":"2025-12-16T21:05:59+00:00","og_image":[{"width":1024,"height":512,"url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/10\/bloques-gutenberg.png","type":"image\/png"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"Construir bloques Gutenberg puede parecer complicado al principio. \u00a1Pero no lo es! Esta gu\u00eda en profundidad te mostrar\u00e1 c\u00f3mo crear tu primer bloque de WP.","twitter_image":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/10\/bloques-gutenberg.png","twitter_creator":"@carlodaniele","twitter_site":"@Kinsta_ES","twitter_misc":{"Escrito por":"Carlo Daniele","Tiempo de lectura":"54 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Construir Bloques Personalizados de Gutenberg: El Tutorial Definitivo de Desarrollo de Bloques","datePublished":"2021-10-21T09:40:49+00:00","dateModified":"2025-12-16T21:05:59+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/"},"wordCount":9274,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/10\/bloques-gutenberg.png","keywords":["Block Editor","development","Gutenberg"],"articleSection":["Desarrollo de WordPress"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/","url":"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/","name":"Construcci\u00f3n de Bloques Personalizados de Gutenberg: El Tutorial Definitivo","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/10\/bloques-gutenberg.png","datePublished":"2021-10-21T09:40:49+00:00","dateModified":"2025-12-16T21:05:59+00:00","description":"Construir bloques Gutenberg puede parecer complicado al principio. \u00a1Pero no lo es! Esta gu\u00eda en profundidad te mostrar\u00e1 c\u00f3mo crear tu primer bloque de WP.","breadcrumb":{"@id":"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/#primaryimage","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/10\/bloques-gutenberg.png","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/10\/bloques-gutenberg.png","width":1024,"height":512,"caption":"Construyendo bloques personalizados de Gutenberg: El Tutorial Definitivo de Desarrollo de Bloques"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/es\/blog\/bloques-gutenberg\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/es\/"},{"@type":"ListItem","position":2,"name":"Desarrollo WordPress","item":"https:\/\/kinsta.com\/es\/secciones\/desarrollo-wordpress\/"},{"@type":"ListItem","position":3,"name":"Construir Bloques Personalizados de Gutenberg: El Tutorial Definitivo de Desarrollo de Bloques"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/es\/#website","url":"https:\/\/kinsta.com\/es\/","name":"Kinsta\u00ae","description":"Soluciones de alojamiento premium, r\u00e1pidas y seguras","publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/es\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinsta.es\/","https:\/\/x.com\/Kinsta_ES","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","caption":"Carlo Daniele"},"description":"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.","sameAs":["https:\/\/frammentidicodice.com\/","https:\/\/x.com\/carlodaniele"],"url":"https:\/\/kinsta.com\/es\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/44710","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/comments?post=44710"}],"version-history":[{"count":16,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/44710\/revisions"}],"predecessor-version":[{"id":81477,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/44710\/revisions\/81477"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/44710\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/44710\/translations\/fr"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/44710\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/44710\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/44710\/translations\/pt"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/44710\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/44710\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/44710\/translations\/jp"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/44710\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/44710\/translations\/se"},{"href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/44710\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media\/44712"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media?parent=44710"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/tags?post=44710"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/topic?post=44710"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}