{"id":233794,"date":"2023-02-23T14:01:00","date_gmt":"2023-02-23T11:01:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233794"},"modified":"2022-11-11T12:27:05","modified_gmt":"2022-11-11T09:27:05","slug":"crear-bloque-de-gutenberg-personalizado-parte-2-bloque-de-registro","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/crear-bloque-de-gutenberg-personalizado-parte-2-bloque-de-registro\/","title":{"rendered":"Crear bloque de Gutenberg personalizado &#8211; Parte 2: bloque de registro"},"content":{"rendered":"\n<p>En esta parte escribiremos Javascript para registrar y configurar nuestro bloque personalizado. Al final registraremos el script con PHP y haremos el c\u00f3digo PHP necesario para que WordPress lo reconozca como un nuevo bloque.<\/p>\n<p>Primero una nota r\u00e1pida sobre c\u00f3mo acceder a las funciones y componentes de WordPress Gutenberg.<\/p>\n<h2><code>wp<\/code>El paquete global y la desestructuraci\u00f3n<\/h2>\n<p>Cuando estamos en un archivo Javascript en cola en el editor Gutenberg, tenemos acceso a un objeto\/paquete global: <code>wp<\/code>. Este es un objeto Javascript muy, muy grande y contiene un mont\u00f3n de componentes y funciones \u00fatiles que usaremos para crear bloques. Al escribir Javascript para bloques personalizados, se referir\u00e1 a <code>wp<\/code>bastante.<\/p>\n<p>Por lo tanto, es com\u00fan, tanto en Javascript moderno como en React, desestructurar lo que queremos usar de \u00e9l. B\u00e1sicamente, solo significa que definimos variables locales a partir de partes de una estructura m\u00e1s grande. Por ejemplo, la primera funci\u00f3n que usaremos es <code>registerBlockType()<\/code>la que existe dentro de <code>wp.blocks<\/code>. Podr\u00edamos invocar la funci\u00f3n as\u00ed:<\/p>\n<pre><code>wp.blocks.registerBlockType();<\/code><\/pre>\n<p>Pero es m\u00e1s f\u00e1cil desestructurarlo as\u00ed:<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\nregisterBlockType();<\/code><\/pre>\n<p>Ahora puede hacer referencia a la funci\u00f3n directamente sin prefijarla con su estructura. Se vuelve mucho m\u00e1s \u00fatil cuando nos referimos a funciones o componentes que repetiremos a menudo.<\/p>\n<p>Haremos reestructuraciones en esta serie y, a medida que avancemos en el tutorial, veremos cu\u00e1nto m\u00e1s legible y m\u00e1s corto se vuelve nuestro c\u00f3digo.<\/p>\n<h2>Registro de un nuevo bloque<\/h2>\n<p>La funci\u00f3n para registrar un nuevo bloque personalizado est\u00e1 <code>registerBlockType()<\/code>disponible en el <code>wp.blocks<\/code>paquete. Acepta dos par\u00e1metros; primero una cadena con el espacio de nombres y el nombre del bloque, y segundo un objeto con la configuraci\u00f3n completa del bloque.<\/p>\n<p>Gutenberg espera que todos los bloques tengan un espacio de nombres y un nombre, definido con una barra inclinada en el medio. El espacio de nombres es para garantizar que el nombre de su bloque no entre en conflicto con ning\u00fan otro bloque que pueda usar el mismo nombre. Todos los bloques en WordPress usan el espacio de nombres <code>core<\/code>. Por ejemplo, el bloque de p\u00e1rrafo est\u00e1ndar en WordPress tiene el nombre <code>core\/paragraph<\/code>. Si elige otro espacio de nombres, tambi\u00e9n puede crear un bloque llamado p\u00e1rrafo sin causar ning\u00fan problema.<\/p>\n<p>Decida un espacio de nombres de versi\u00f3n slug que sea \u00fanico para usted. Usar\u00e9 el espacio de nombres <code>awp<\/code>(versi\u00f3n corta de A White Pixel) en esta serie.<\/p>\n<p>Abra el archivo fuente que creamos en el \u00faltimo paso; <code>src\/block-awhitepixel-myfirstblock.js<\/code>, en un editor. Primero llamaremos <code>registerBlockType<\/code>desde desestructurados <code>wp.blocks<\/code>, con el nombre <code>awp\/firstblock<\/code>. Ajuste su nombre y espacio de nombres sobre la marcha.<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\n\u00a0\nregisterBlockType('awp\/firstblock', {\n    \/\/ Your block configuration and code here\n});<\/code><\/pre>\n<p>En el segundo par\u00e1metro, el objeto de configuraci\u00f3n del bloque, necesitamos definir algunas propiedades para que se registre correctamente. Recuerde que la configuraci\u00f3n del bloque es un objeto, lo que significa que debe escribir todo como pares clave + valor, separados por comas. Hay bastantes propiedades de configuraci\u00f3n posibles, as\u00ed que repasemos estas y veremos el c\u00f3digo final al final.<\/p>\n<h3>Requerido: t\u00edtulo<\/h3>\n<p>La primera propiedad requerida es <code>title<\/code>. Este es el nombre que aparecer\u00e1 cuando seleccione entre bloques. Establezca esta propiedad como cualquier nombre que desee en una cadena.<\/p>\n<p>A\u00f1adiremos lo siguiente como t\u00edtulo:<\/p>\n<pre><code>title: 'My first block',<\/code><\/pre>\n<p>PD: Revisaremos c\u00f3mo escribimos todas las cadenas en nuestro bloque para asegurarnos de que se puedan traducir en la parte 8. Pero por ahora lo mantendremos simple y simplemente escribiremos cadenas.<\/p>\n<h3>Requerido: categor\u00eda<\/h3>\n<p>La propiedad <code>category<\/code>define en qu\u00e9 categor\u00eda de bloque aparecer\u00e1 su bloque cuando seleccione bloques para insertarlos en el editor. Los valores posibles son <code>common<\/code>, <code>formatting<\/code>, <code>layout<\/code>, <code>widgets<\/code>, <code>embed<\/code>.<\/p>\n<p>Pong\u00e1moslo en <code>common<\/code>, la primera categor\u00eda de bloque.<\/p>\n<pre><code>category: 'common',<\/code><\/pre>\n<h3>Opcional: icono<\/h3>\n<p>Si ha usado Gutenberg, probablemente haya notado que todos los bloques tienen \u00edconos. Puede agregar un \u00edcono a su bloque con una cadena que se refiera a cualquiera de <a href=\"https:\/\/developer.wordpress.org\/resource\/dashicons\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">los Dashicons de WordPress<\/a>, o puede proporcionar un <code>svg<\/code>elemento personalizado.<\/p>\n<p>Elegir\u00e9 uno de los dashicons de WordPress, el emotic\u00f3n, <a href=\"https:\/\/developer.wordpress.org\/resource\/dashicons\/#smiley\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pero<\/a> puedes elegir el que quieras. Tenga en cuenta que omite incluir &quot;dashicons-&quot; en su nombre de clase de icono.<\/p>\n<pre><code>icon: 'smiley',<\/code><\/pre>\n<h3>Opcional: descripci\u00f3n<\/h3>\n<p>Puede proporcionar una descripci\u00f3n que se mostrar\u00e1 en la barra lateral de Configuraci\u00f3n (en el lado derecho) cuando el bloque est\u00e9 activo.<\/p>\n<p>Solo agregar\u00e9 un texto r\u00e1pido como ejemplo:<\/p>\n<pre><code>description: 'Learning in progress',<\/code><\/pre>\n<h3>Opcional: palabras clave<\/h3>\n<p>Gutenberg admite una funci\u00f3n de b\u00fasqueda al elegir tipos de bloques. Puede proporcionar una matriz de posibles coincidencias en la propiedad <code>keywords<\/code>. Sin <code>keywords<\/code>usted, solo encontrar\u00eda su bloque buscando su nombre.<\/p>\n<p>Agregar\u00e9 <code>example<\/code>y <code>test<\/code>para que podamos encontrar f\u00e1cilmente nuestro bloque personalizado cuando comencemos a escribir una de estas palabras clave.<\/p>\n<pre><code>keywords: ['example', 'test'],<\/code><\/pre>\n<h3>Opcional: atributos<\/h3>\n<p>La propiedad <code>attributes<\/code>es una propiedad muy importante que revisaremos con bastante frecuencia en esta serie de tutoriales. Aqu\u00ed es donde almacena sus datos estructurados y la informaci\u00f3n ingresada por el usuario para su bloque. Puedes imaginarlo como variables. No lo agregaremos por ahora, pero definitivamente volveremos a esto muy pronto.<\/p>\n<h3>(M\u00e1s o menos) obligatorio: editar y opcional: guardar<\/h3>\n<p>Dentro <code>edit<\/code>de <code>save<\/code>las propiedades es en realidad donde agregar\u00e1 todo su c\u00f3digo tanto para la salida del editor como para el procesamiento de la interfaz. Ambas propiedades esperan una funci\u00f3n que deber\u00eda devolver alg\u00fan resultado.<\/p>\n<p>La propiedad <code>edit<\/code>describe la estructura de su bloque dentro del editor. La <code>save<\/code>propiedad maneja b\u00e1sicamente dos cosas; la salida de su bloque en la interfaz, pero tambi\u00e9n la estructura de c\u00f3mo se guarda su bloque en la base de datos. Trabajar\u00e1 principalmente <code>edit<\/code>porque aqu\u00ed es donde agrega entradas para ingresar o elegir cosas y actualizar los datos del bloque. La <code>save<\/code>funci\u00f3n no debe actualizar ni editar los datos de ninguna manera, solo debe generar una salida.<\/p>\n<p>Gutenberg necesita poder reconstruir su bloque con todas sus configuraciones en el editor a partir de lo que se genera en la <code>save<\/code>funci\u00f3n (y atributos). Si Gutenberg alguna vez abre una publicaci\u00f3n en la que la salida del bloque guardado previamente difiere (aunque sea un poco) de lo que se defini\u00f3 al guardar, su bloque dejar\u00e1 de ser v\u00e1lido.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151978-61e4d21609214.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151978-61e4d21609214.png\" alt=\"Crear bloque de Gutenberg personalizado - Parte 2: bloque de registro\" ><\/a><\/p>\n<p>Puedo garantizarle que se encontrar\u00e1 con esto muchas veces al desarrollar bloques personalizados. Cuando esto sucede, debe eliminar el bloque (de los puntos en la barra de herramientas) y volver a agregarlo. Tambi\u00e9n recomiendo actualizar el navegador (F5 o CTRL+R).<\/p>\n<p><a href=\"https:\/\/developer.wordpress.org\/block-editor\/developers\/block-api\/block-edit-save\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress tiene una p\u00e1gina de documentaci\u00f3n<\/a> dedicada a las funciones de edici\u00f3n y guardado del bloque si desea obtener m\u00e1s informaci\u00f3n.<\/p>\n<p>En cuanto a nuestro primer bloque, generemos algo b\u00e1sico. Devolveremos lo mismo para ambos <code>edit<\/code>y <code>save<\/code>; un &quot;:)&quot; envuelto en <code>&lt;div&gt;<\/code>. Despu\u00e9s de todo, el \u00edcono del bloque es un emotic\u00f3n.<\/p>\n<pre><code>edit:() =&gt; { \n    return &lt;div&gt;:)&lt;\/div&gt; \n},\nsave:() =&gt; { \n    return &lt;div&gt;:)&lt;\/div&gt; \n}<\/code><\/pre>\n<h3>Otras propiedades<\/h3>\n<p>Hay propiedades m\u00e1s opcionales para <code>registerBlockType<\/code>; <code>parent<\/code>, <code>supports<\/code>, <code>transforms<\/code>, <code>example<\/code>y <code>styles<\/code>. Omitiremos estos por ahora, ya que la mayor\u00eda son para la construcci\u00f3n de bloques m\u00e1s avanzada o personalizada. Si est\u00e1 interesado en leer m\u00e1s sobre esto, eche un vistazo a <a href=\"https:\/\/developer.wordpress.org\/block-editor\/developers\/block-api\/block-registration\/#block-configuration\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la documentaci\u00f3n de WordPress<\/a>.<\/p>\n<h2>C\u00f3digo de bloque de registro final<\/h2>\n<p>Nuestro c\u00f3digo ahora se parece a esto.<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\n\u00a0\nregisterBlockType('awp\/firstblock', {\n    title: 'My first block',\n    category: 'common',\n    icon: 'smiley',\n    description: 'Learning in progress',\n    keywords: ['example', 'test'],\n    edit: () =&gt; { \n        return &lt;div&gt;:)&lt;\/div&gt; \n    },\n    save: () =&gt; { \n        return &lt;div&gt;:)&lt;\/div&gt; \n    }\n});<\/code><\/pre>\n<p>Con esto tenemos suficiente para que nuestro bloque sea registrado exitosamente como bloque personalizado. Ve\u00e1moslo en la pr\u00e1ctica dentro del editor Gutenberg.<\/p>\n<p>\u00bfTe acordaste de compilar tu Javascript? En el paso anterior aprendimos que no podemos cargar este archivo Javascript en Gutenberg; necesitamos la versi\u00f3n compilada. Por lo general, se desarrollar\u00eda <code>npm run start<\/code>ejecut\u00e1ndose en segundo plano, o simplemente puede ejecutar <code>npm run build<\/code>una vez ahora. Eso deber\u00eda compilar nuestro Javascript fuente y colocarlo donde lo defini\u00f3 para colocarlo y nombrarlo en su archivo <code>webpack.config.js<\/code>.<\/p>\n<h2>La parte PHP de registrar un bloque<\/h2>\n<p>Para cada bloque, debe registrar el archivo Javascript y esto es lo mismo que registrar\u00eda cualquier otro script en WordPress, utilizando <code>[wp_register_script](https:\/\/developer.wordpress.org\/reference\/functions\/wp_register_script\/)()<\/code>. Tenga en cuenta que registramos el script, no lo ponemos en cola. Esto se debe a que tambi\u00e9n necesitamos llamar a una funci\u00f3n de PHP para registrar cada bloque personalizado, y esa funci\u00f3n es responsable de poner en cola el script cuando sea necesario.<\/p>\n<p>Prefiero mantener el c\u00f3digo relacionado con Gutenberg en un archivo separado en mis temas. Pero puede, y lo haremos en este tutorial, simplemente escribir todo el c\u00f3digo PHP directamente dentro del tema <code>functions.php<\/code>por simplicidad.<\/p>\n<p>Recomiendo usar el <code>init<\/code>gancho para su funci\u00f3n, y no <code>enqueue_block_assets<\/code>. Podemos juntar tanto el registro del script como el registro del bloque.<\/p>\n<pre><code>add_action('init', function() {\n    wp_register_script('awp-myfirstblock-js', get_template_directory_uri(). '\/assets\/js\/gutenberg\/block-awhitepixel-myfirstblock.js');\n\u00a0\n    register_block_type('awp\/firstblock', [\n        'editor_script' =&gt; 'awp-myfirstblock-js',\n    ]);\n});<\/code><\/pre>\n<p>La funci\u00f3n de PHP que usaremos para registrar un nuevo bloque es <code>[register_block_type](https:\/\/developer.wordpress.org\/reference\/functions\/register_block_type\/)()<\/code>. De manera similar a Javascript, <code>registerBlockType()<\/code>acepta dos par\u00e1metros; el espacio de nombres y el nombre del bloque, y una matriz con argumentos. Aseg\u00farese de proporcionar exactamente el mismo espacio de nombres y nombre en PHP que en Javascript.<\/p>\n<p>En el segundo argumento hay algunos argumentos posibles (a algunos de los cuales volveremos m\u00e1s adelante en esta serie). Pero el m\u00e1s importante es <code>editor_script<\/code>donde proporciona el identificador (primer par\u00e1metro de <code>wp_register_script()<\/code>) del script registrado.<\/p>\n<p>\u00a1Y eso es!<\/p>\n<h2>Nuestro bloque en el editor de Gutenberg<\/h2>\n<p>Ahora, cuando actualice su editor en alguna publicaci\u00f3n, deber\u00eda encontrar nuestro bloque, ya sea abriendo la categor\u00eda Com\u00fan o buscando cualquiera de las palabras clave o el nombre que proporcion\u00f3.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151978-61e4d216d1cdb.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151978-61e4d216d1cdb.png\" alt=\"Crear bloque de Gutenberg personalizado - Parte 2: bloque de registro\" ><\/a><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151978-61e4d217e1762.gif\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151978-61e4d217e1762.gif\" alt=\"Crear bloque de Gutenberg personalizado - Parte 2: bloque de registro\" ><\/a><\/p>\n<p>Nuestro bloque representa un simple &quot;:)&quot; tanto en el editor como en la interfaz. A partir de ahora, no puede editar nada en el bloque, \u00a1pero eso es lo que aprenderemos en los pr\u00f3ximos pasos!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En esta lecci\u00f3n tutorial, escribiremos Javascript para registrar nuestro bloque personalizado. Al final registraremos el script y haremos el c\u00f3digo PHP necesario.<\/p>\n","protected":false},"author":1,"featured_media":151979,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,892,810,935,935,1110,810,840,840,861,861],"tags":[1172],"class_list":{"0":"post-233794","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-codigo","9":"category-complementos","10":"category-gutenberg-2","12":"category-n-a","14":"category-tutoriales","16":"category-wordpress-2","18":"tag-affiai-es"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233794","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=233794"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233794\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/151979"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233794"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233794"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233794"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}