{"id":233435,"date":"2023-02-14T14:32:00","date_gmt":"2023-02-14T11:32:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233435"},"modified":"2022-11-10T23:40:38","modified_gmt":"2022-11-10T20:40:38","slug":"crear-bloque-personalizado-de-gutenberg-parte-6-barras-de-herramientas","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/crear-bloque-personalizado-de-gutenberg-parte-6-barras-de-herramientas\/","title":{"rendered":"Crear bloque personalizado de Gutenberg &#8211; Parte 6: Barras de herramientas"},"content":{"rendered":"\n<p>En esta publicaci\u00f3n, aprenderemos c\u00f3mo agregar las barras de herramientas de WordPress a nuestro bloque, es decir, para alinear y alinear bloques. Tambi\u00e9n aprenderemos a agregar nuestras propias barras de herramientas con nuestros propios botones para realizar acciones personalizadas.<\/p>\n<h2>Agregar barras de herramientas<\/h2>\n<p>Para agregar algo a la barra de herramientas para nuestro bloque, necesitaremos envolver lo que queremos en \u00e9l dentro de un componente llamado <code>BlockControls<\/code>(desde <code>wp.blockEditor<\/code>). Dentro de este componente podemos agregar cualquiera de los componentes de WordPress para las barras de herramientas est\u00e1ndar que conocemos de otros bloques (por ejemplo, alineaci\u00f3n) o podemos agregar nuestra propia barra de herramientas.<\/p>\n<p>De forma predeterminada, un bloque tendr\u00e1 una barra de herramientas que contiene solo el icono del bloque (para la funcionalidad Transformar a) y el men\u00fa del bloque para, por ejemplo, eliminar el bloque. No podemos eliminarlos, pero podemos agregar nuestros propios botones y barras de herramientas en el medio.<\/p>\n<p>Sin embargo, algunos componentes de WordPress agregar\u00e1n por s\u00ed mismos sus propias barras de herramientas. A partir de ahora, nuestro bloque muestra una barra de herramientas para formatear texto que proviene del <code>RichText<\/code>componente que agregamos.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153353-61e50c7785e80.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-153353-61e50c7785e80.png\" alt=\"Crear bloque personalizado de Gutenberg - Parte 6: Barras de herramientas\" ><\/a><\/p>\n<h2>Agregar una barra de herramientas de alineaci\u00f3n de bloques<\/h2>\n<p>La barra de herramientas de alineaci\u00f3n de bloques existe en pr\u00e1cticamente todos los tipos de bloques de WordPress, as\u00ed que agreguemos eso a nuestro bloque tambi\u00e9n. Detr\u00e1s de escena existe un componente <code>BlockAlignmentToolbar<\/code>que podr\u00edamos agregar, sin embargo recomiendo no hacerlo. Usarlo requiere que manejes manualmente las clases para la alineaci\u00f3n de bloques y te asegures de que el bloque extienda su ancho en el editor al elegir &quot;Ancho ancho&quot; o &quot;Ancho completo&quot;. Afortunadamente, WordPress ha hecho que sea muy f\u00e1cil de implementar, completamente autom\u00e1tico.<\/p>\n<p>PD: El tema activo debe haber agregado activamente soporte de tema para estas dos alineaciones de bloques. Puede agregar soporte para estos al tener <code>add_theme_support('align-wide')<\/code>en el <code>after_setup_theme<\/code>gancho.<\/p>\n<p>Podemos agregar una nueva propiedad a la configuraci\u00f3n de nuestro objeto en <code>registerBlockType()<\/code>, llamada <code>supports<\/code>. Hay algunas otras caracter\u00edsticas, pero lo que nos interesa aqu\u00ed es <code>align<\/code>. Podemos configurar <code>align<\/code>para <code>true<\/code>agregar todas las alineaciones posibles, o podemos proporcionar una matriz de alineaciones precisas que permitimos para nuestro bloque.<\/p>\n<pre><code>...\nregisterBlockType('awp\/firstblock', {\n    ...\n    supports: {\n        align: true\n    },\n    edit: (props) =&gt; {\n        ...\n});<\/code><\/pre>\n<p>Lo que nos da esto en el editor:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153353-61e50c7967acd.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-153353-61e50c7967acd.png\" alt=\"Crear bloque personalizado de Gutenberg - Parte 6: Barras de herramientas\" ><\/a><\/p>\n<p>Si desea, por ejemplo, evitar que alguien use Wide Width o Full Width, puede proporcionar una matriz y excluir esos dos. Los nombres de las alineaciones de bloques son los siguientes: <code>left<\/code>, <code>right<\/code>, <code>center<\/code>, <code>wide<\/code>y <code>full<\/code>.<\/p>\n<pre><code>supports: {\n    align: ['left', 'right', 'center']\n},<\/code><\/pre>\n<h3>\u00bfNecesita alineaci\u00f3n predeterminada?<\/h3>\n<p>De forma predeterminada, el bloque no tiene alineaci\u00f3n de bloque. Si lo desea, puede establecer un valor predeterminado creando un atributo con la clave <code>align<\/code>, establezca el tipo en <code>string<\/code>y establezca el valor predeterminado all\u00ed. WordPress conectar\u00e1 autom\u00e1ticamente este atributo a la alineaci\u00f3n del bloque.<\/p>\n<pre><code>attributes: {\n    align: {\n        type: 'string',\n        default: 'center'\n    }\n},\nsupports: {\n    align: true\n},<\/code><\/pre>\n<p>Con esto cada vez que se crea un nuevo bloque de nuestro tipo, se centra la alineaci\u00f3n del bloque por defecto.<\/p>\n<h3>\u00bfDesorden de estilo de alineaci\u00f3n de bloques? no es nuestra culpa<\/h3>\n<p><strong>Nota:<\/strong> El estilo de bloque predeterminado de WordPress arruinar\u00e1 el flujo del contenido de su publicaci\u00f3n cuando use la alineaci\u00f3n de bloque izquierda y derecha. Lo mismo sucede con otros tipos de bloques de WordPress tambi\u00e9n y no es un problema exclusivo de nuestro bloque. Esto se produce al agregar float al elemento, lo que colapsa el elemento principal. Cr\u00e9ame, he intentado construir el bloque para evitar este problema. Lo \u00fanico que he encontrado que funciona correctamente sin alterar las otras alineaciones de bloques es agregar estilo al editor y ajustar el estilo flotante.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153353-61e50c7baa1f0.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-153353-61e50c7baa1f0.png\" alt=\"Crear bloque personalizado de Gutenberg - Parte 6: Barras de herramientas\" ><\/a><\/p>\n<p>De todos modos, WordPress ha hecho que sea bastante f\u00e1cil implementar la alineaci\u00f3n de bloques. Ahora veamos otras barras de herramientas que podemos usar.<\/p>\n<h2>Agregar una barra de herramientas de alineaci\u00f3n de texto<\/h2>\n<p>Si prefiere la barra de herramientas para la alineaci\u00f3n del texto, puede hacerlo en lugar de la alineaci\u00f3n de bloques: en esta barra de herramientas solo tenemos alineaci\u00f3n a la izquierda, al centro y a la derecha. De hecho, puede usar la alineaci\u00f3n de texto y la alineaci\u00f3n de bloques juntas; funcionan por separado. Para no confundir a los usuarios, por ejemplo, solo podr\u00eda agregar soporte para la alineaci\u00f3n de bloques de ancho y ancho completo, y usar la barra de herramientas de alineaci\u00f3n de texto para controlar la alineaci\u00f3n a la izquierda, al centro o a la derecha. Al hacer esto, <strong>evita el problema mencionado anteriormente<\/strong> con el flujo de bloques en el editor. Depende de usted c\u00f3mo quiere que funcione su bloque.<\/p>\n<p>WordPress tiene un componente para generar la barra de herramientas de alineaci\u00f3n de texto, sin embargo, no tiene un manejo autom\u00e1tico para agregar las clases correctas para alinear el contenido, tanto dentro del editor como en la interfaz (\u00a1al menos hasta donde he encontrado!). Necesitamos agregar y actualizar manualmente un atributo para la alineaci\u00f3n del texto.<\/p>\n<h3>Agregar <code>BlockControls<\/code>y<code>AlignmentToolbar<\/code><\/h3>\n<p>Agreguemos finalmente <code>BlockControls<\/code>a nuestra <code>edit<\/code>funci\u00f3n para nuestra salida en la barra de herramientas. El componente para la alineaci\u00f3n del texto es <code>AlignmentToolbar<\/code>del <code>wp.blockEditor<\/code>paquete.<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\nconst { RichText, InspectorControls, BlockControls, AlignmentToolbar } = wp.blockEditor;\nconst { ToggleControl, PanelBody, PanelRow, CheckboxControl, SelectControl, ColorPicker } = wp.components;\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    attributes: {\n        myRichHeading: {\n            type: 'string',\n        },\n        myRichText: {\n            type: 'string',\n            source: 'html',\n            selector: 'p'\n        },\n        textAlignment: {\n            type: 'string',\n        }\n    },\n    supports: {\n        align: ['wide', 'full']\n    },\n    edit: (props) =&gt; {\n        const { attributes, setAttributes } = props;\n        const alignmentClass = (attributes.textAlignment != null)? 'has-text-align-' + attributes.textAlignment: '';\n\u00a0\n        return (&lt;div className={alignmentClass}&gt;\n                &lt;InspectorControls&gt;\n                    ... \n                &lt;\/InspectorControls&gt;\n                &lt;BlockControls&gt;\n                    &lt;AlignmentToolbar\n                        value={attributes.textAlignment}\n                        onChange={(newalign) =&gt; setAttributes({ textAlignment: newalign })}\n                    \/&gt;\n                &lt;\/BlockControls&gt;\n                &lt;RichText \n                    tagName=\"h2\"\n                    placeholder=\"Write your heading here\"\n                    value={attributes.myRichHeading}\n                    onChange={(newtext) =&gt; setAttributes({ myRichHeading: newtext })}\n                \/&gt;\n                &lt;RichText\n                    tagName=\"p\"\n                    placeholder=\"Write your paragraph here\"\n                    value={attributes.myRichText}\n                    onChange={(newtext) =&gt; setAttributes({ myRichText: newtext })}\n                \/&gt;\n            &lt;\/div&gt;\n        );\n\u00a0\n    },\n    save: (props) =&gt; { \n        const { attributes } = props;\n\u00a0\n        const alignmentClass = (attributes.textAlignment != null)? 'has-text-align-' + attributes.textAlignment: '';\n        return (&lt;div className={alignmentClass}&gt;\n                &lt;RichText.Content \n                    tagName=\"h2\"\n                    value={attributes.myRichHeading}\n                \/&gt;\n                &lt;RichText.Content \n                    tagName=\"p\"\n                    value={attributes.myRichText}\n                \/&gt;\n                {attributes.activateLasers &amp;&amp; \n                    &lt;div className=\"lasers\"&gt;Lasers activated&lt;\/div&gt;\n                }\n            &lt;\/div&gt;\n        );\n    }\n});<\/code><\/pre>\n<p>Tenga en cuenta que exclu\u00ed el contenido de todo lo que creamos en <code>InspectorControls<\/code>el paso anterior para acortar el c\u00f3digo.<\/p>\n<p>Entre l\u00edneas <code>#37<\/code>se <code>#42<\/code>encuentra todo el contenido de nuestra barra de herramientas (aparte de la alineaci\u00f3n de bloques agregada autom\u00e1ticamente por la <code>supports<\/code>propiedad y el formato de texto agregado por nuestros <code>RichText<\/code>componentes). Usamos <code>BlockControls<\/code>para acceder a la barra de herramientas, y dentro a\u00f1adimos el <code>AlignmentToolbar<\/code>componente.<\/p>\n<p>Como hemos hecho varias veces con las entradas, proporcionamos un <code>value<\/code>accesorio para mostrar el valor guardado y un <code>onChange<\/code>accesorio para actualizar nuestro atributo al <code>AlignmentToolbar<\/code>componente. El atributo que usaremos para almacenar la alineaci\u00f3n de texto elegida se define como <code>textAlignment<\/code>y debe ser de tipo <code>string<\/code>. Como de costumbre, puede proporcionar un <code>default<\/code>para asegurarse de que los bloques reci\u00e9n creados obtengan una alineaci\u00f3n predeterminada.<\/p>\n<p>Para asegurarnos de que el bloque genere la informaci\u00f3n de alineaci\u00f3n y tambi\u00e9n tenga el estilo correcto (para que realmente veamos el cambio de alineaci\u00f3n del texto) tanto en el editor como en la interfaz, debemos configurar manualmente la clase correcta en el div de envoltura. En ambos <code>edit<\/code>y <code>save<\/code>defino una variable que verifica si <code>attributes.textAlignment<\/code>est\u00e1 configurada. Si es as\u00ed, construyo el nombre de la clase siguiendo los est\u00e1ndares de WordPress para alineaciones de texto, que es &quot;has-text-align-(left|center|right)&quot;. Con esta clase, WordPress aplicar\u00e1 su estilo a nuestro bloque y se asegurar\u00e1 de que nuestro bloque se alinee visualmente correctamente, tanto en el editor como en la interfaz.<\/p>\n<h3>Agregar barras de herramientas personalizadas con nuestros propios botones<\/h3>\n<p>Tambi\u00e9n puede agregar sus propios botones en la barra de herramientas para hacer lo que desee al hacer clic en ellos. Para hacer esto, querr\u00e1 agregar el componente <code>Toolbar<\/code>y dentro de este elemento agregar un <code>IconButton<\/code>(ambos en el <code>wp.components<\/code>paquete). Todo dentro <code>BlockControls<\/code>, por supuesto.<\/p>\n<p><strong>Nota<\/strong>: Seg\u00fan WordPress, el registro de cambios de Gutenberg <code>IconButton<\/code>est\u00e1 en desuso a favor del uso de <code>Button<\/code>. Sin embargo, parece que no puedo hacer que aparezca un \u00edcono usando el <code>Button<\/code>componente sin importar lo que haga, aunque se supone que lo admite. As\u00ed que a partir de ahora usar\u00e9 <code>IconButton<\/code>.<\/p>\n<p>Obviamente, puede combinar m\u00faltiples componentes de la barra de herramientas dentro de <code>BlockControls<\/code>. Con el siguiente c\u00f3digo, agregamos la barra de herramientas de alineaci\u00f3n de texto y nuestra barra de herramientas personalizada con un bot\u00f3n despu\u00e9s.<\/p>\n<pre><code>&lt;BlockControls&gt;\n    &lt;AlignmentToolbar\n        value={attributes.textAlignment}\n        onChange={(newalign) =&gt; setAttributes({ textAlignment: newalign })}\n    \/&gt;\n    &lt;Toolbar&gt;\n        &lt;IconButton\n            label=\"My very own custom button\"\n            icon=\"edit\"\n            className=\"my-custom-button\"\n            onClick={() =&gt; console.log('pressed button')}\n        \/&gt;\n    &lt;\/Toolbar&gt;\n&lt;\/BlockControls&gt;<\/code><\/pre>\n<p>El componente IconButton acepta un \u00edcono <a href=\"https:\/\/developer.wordpress.org\/resource\/dashicons\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dashicon de WordPress<\/a> o un SVG para el accesorio <code>icon<\/code>. Podemos proporcionar algunos otros accesorios como <code>className<\/code>y <code>label<\/code>(aparecer\u00e1 en la informaci\u00f3n sobre herramientas al pasar el cursor sobre el bot\u00f3n). El accesorio que m\u00e1s nos interesa es obviamente el <code>onClick<\/code>accesorio que se dispara cuando se hace clic en el bot\u00f3n. Aqu\u00ed podemos proporcionar una funci\u00f3n y b\u00e1sicamente hacer lo que queramos. Las posibilidades son infinitas y depende de lo que quieras hacer. En el c\u00f3digo anterior, simplemente registro algo en la consola cuando se hace clic en el bot\u00f3n. A medida que avanzamos en esta serie de tutoriales, probablemente obtendr\u00e1 algunas ideas sobre c\u00f3mo hacer que su bot\u00f3n personalizado haga lo que usted quiere que haga.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153353-61e50c7e57cd7.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-153353-61e50c7e57cd7.png\" alt=\"Crear bloque personalizado de Gutenberg - Parte 6: Barras de herramientas\" ><\/a><\/p>\n<p>Esto es lo que hemos hecho hasta ahora. En el pr\u00f3ximo paso de la serie, comenzaremos a buscar cosas m\u00e1s avanzadas y aprenderemos a crear nuestros propios componentes para utilizar el estado y otros beneficios.<\/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 publicaci\u00f3n, aprenderemos c\u00f3mo agregar las barras de herramientas de WordPress Gutenberg a nuestro bloque; alineaci\u00f3n de texto, alineaci\u00f3n de bloques y nuestras propias barras de herramientas personalizadas.<\/p>\n","protected":false},"author":1,"featured_media":153354,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,892,810,831,935,935,914,1110,914,810,831,840,840,861,861],"tags":[1172],"class_list":{"0":"post-233435","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-guia-para-principiantes","11":"category-gutenberg-2","13":"category-otro","14":"category-n-a","18":"category-tutoriales","20":"category-wordpress-2","22":"tag-affiai-es"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233435","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=233435"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233435\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/153354"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233435"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233435"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233435"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}