{"id":228136,"date":"2022-10-12T10:42:00","date_gmt":"2022-10-12T07:42:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228136"},"modified":"2022-11-09T00:54:43","modified_gmt":"2022-11-08T21:54:43","slug":"agregue-select2-como-inspectorcontrol-en-wordpress-gutenberg","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/agregue-select2-como-inspectorcontrol-en-wordpress-gutenberg\/","title":{"rendered":"Agregue Select2 como InspectorControl en WordPress Gutenberg"},"content":{"rendered":"\n<p>Para un proyecto en el que estaba trabajando, quer\u00eda usar Select2 como Gutenberg <code>InpectorControl<\/code>para permitirme aplicar configuraciones a un bloque. Este tutorial tambi\u00e9n le brindar\u00e1 la base que necesita para obtener cualquier componente React de terceros en el Editor Gutenberg de WordPress.<\/p>\n<p>Select2 es un reemplazo s\u00faper \u00fatil para los cuadros de selecci\u00f3n en su sitio web. En particular, tiene excelentes opciones para seleccionar varios elementos.<\/p>\n<p>El producto terminado, Select2 en WordPress Gutenberg InspectorControls<\/p>\n<p>La buena noticia es que no necesitaba crear un componente React para incorporar Select2 a Gutenberg, el <a href=\"https:\/\/github.com\/JedWatson\/react-select\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\"><code>react-select<\/code>componente de Jed Watson<\/a> ya hace un gran trabajo con esto, sin embargo, hacer que Gutenberg funcione bien no fue tan f\u00e1cil como simplemente seguir las instrucciones.<\/p>\n<p>Lo primero es lo primero, necesit\u00e1bamos instalar el componente en nuestra compilaci\u00f3n. Como esto estaba en npm, fue tan simple como ingresar lo siguiente en nuestra terminal:<\/p>\n<h2>Obtener Select2 en un bloque de Gutenberg<\/h2>\n<p>Usando el repositorio de <a href=\"https:\/\/github.com\/zgordon\/gutenberg-course\/blob\/master\/blocks\/06-inspector-controls\/index.js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Zac Gordons Gutenberg Course Git<\/a> (parte del <a href=\"https:\/\/javascriptforwp.com\/courses\/gutenburg-development\/ref\/648\/?campaign=GutenbergDevelopment\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fant\u00e1stico curso de desarrollo de Gutenberg<\/a> de Zac Gordons) como base para mi complemento (en particular el <code>InspectorControls<\/code>ejemplo), para usarlo <code>react-select<\/code>, necesitaba agregar lo siguiente en la parte superior de mi archivo:<\/p>\n<pre><code>import React from 'react';\nimport Select from 'react-select';\n<\/code><\/pre>\n<p>\u00a1Oh, no! Compilar esto nos da un error:<\/p>\n<blockquote>\n<p>M\u00f3dulo no encontrado: Error: No se puede resolver &#8216;reaccionar&#8217;<\/p>\n<\/blockquote>\n<p>No temas, este gran art\u00edculo sobre <a href=\"https:\/\/www.cssigniter.com\/how-to-use-external-react-components-in-your-gutenberg-blocks\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">&quot;C\u00f3mo usar componentes React externos en tus bloques de Gutenberg&quot; de CSS Igniter<\/a> vino al rescate, todo lo que tenemos que hacer es registrarnos <code>externals<\/code>en nuestro <code>webpack.config.js<\/code>archivo:<\/p>\n<pre><code>externals: {\n    'react': 'React',\n    'react-dom': 'ReactDOM',\n}\n<\/code><\/pre>\n<p>Al igual que:<\/p>\n<pre><code>module.exports = {\n    entry: {\n        '.\/assets\/js\/editor': '.\/blocks\/index.js',\n        '.\/assets\/js\/script': '.\/blocks\/script.js',\n    },\n    output: {\n        path: path.resolve( __dirname ),\n        filename: '[name].js',\n    },\n    externals: {\n        'react': 'React',\n        'react-dom': 'ReactDOM',\n    }\n...\n<\/code><\/pre>\n<h2>Registro de los InspectorControls<\/h2>\n<p>Dentro del rollo de panel de su <code>&lt;InspectorControls&gt;<\/code>componente, deber\u00e1 agregar lo siguiente:<\/p>\n<pre><code>&lt;Select\n    name='select-two'\n    value={ JSON.parse( selectedOption) }\n    onChange={ handleSelectChange }\n    options={[\n        { value: 'health', label: 'Health' },\n        { value: 'wealth', label: 'Wealth' },\n        { value: 'code', label: 'Code' },\n    ]}\n    isMulti='true'\n    \/&gt;\n<\/code><\/pre>\n<p>A\u00fan no hemos terminado, ya que tambi\u00e9n necesitaremos registrar el <code>selectedOption<\/code>atributo y la <code>handleSelectChange<\/code>funci\u00f3n. Podemos hacer esto as\u00ed:<\/p>\n<pre><code>attributes: {\n    selectedOption: {\n        type: 'string',\n        default: null,\n    }\n},\n<\/code><\/pre>\n<p>\u2026y ahora la funci\u00f3n\u2026<\/p>\n<pre><code>const handleSelectChange = (selectedOption) =&gt; setAttributes( { selectedOption: JSON.stringify( selectedOption) } );\n<\/code><\/pre>\n<p>Espera, \u00bfpor qu\u00e9 necesitamos <code>JSON.stringify()<\/code>y <code>JSON.parse()<\/code>los valores? Bueno, debido a que el valor que <code>react-select<\/code>acepta el componente es una matriz, y como Gutenberg no nos permite guardar este valor como una matriz, esta es una soluci\u00f3n alternativa que podemos usar.<\/p>\n<h2>Poniendo todo junto<\/h2>\n<p>Nuestra <code>InspectorControls<\/code>\u00e1rea completa ahora deber\u00eda verse as\u00ed:<\/p>\n<pre><code>...\nattributes: {\n    selectedOption: {\n        type: 'string',\n        default: null,\n    }\n},\nedit: props =&gt; {\n    const { attributes: { selectedOption }, className, setAttributes } = props;\n    const handleSelectChange = (selectedOption) =&gt; setAttributes( { selectedOption: JSON.stringify( selectedOption) } );\n    return [\n        &lt;InspectorControls&gt;\n            &lt;PanelBody\n                title={ __( 'Select2', 'text-domain') }\n            &gt;\n                &lt;PanelRow&gt;\n                    &lt;Select\n                        name='select-two'\n                        value={ JSON.parse( selectedOption) }\n                        onChange={ handleSelectChange }\n                        options={[\n                            { value: 'health', label: 'Health' },\n                            { value: 'wealth', label: 'Wealth' },\n                            { value: 'code', label: 'Code' },\n                        ]}\n            isMulti='true'\n                        \/&gt;\n                 &lt;\/PanelRow&gt;\n             &lt;\/PanelBody&gt;\n         &lt;\/InspectorControls&gt;,\n...\n<\/code><\/pre>\n<h2>Verse bien en Gutenberg<\/h2>\n<p>Como puede ver en la captura de pantalla, funciona bastante bien:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169504-61e816febb7e8.png\" alt=\"Agregue Select2 como InspectorControl en WordPress Gutenberg\" \/>Select2 como Gutenberg InspectorControl<\/p>\n<h2>Llev\u00e1ndolo m\u00e1s lejos<\/h2>\n<p>Utilic\u00e9 este Inspector Control en mi complemento Secure Blocks for Gutenberg, descubra c\u00f3mo llen\u00e9 el control Select2 con <a href=\"https:\/\/wholesomecode.ltd\/articles\/working-with-gutenberg-and-the-wordpress-rest-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">datos din\u00e1micos de la API REST de WordPress<\/a>.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/wholesomecode.ltd\" class=\"external external_icon\">wholesomecode.ltd<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Para un proyecto en el que estaba trabajando, quer\u00eda usar Select2 como Gutenberg InpectorControl para permitirme aplicar configuraciones a un bloque. Este tutorial tambi\u00e9n te dar\u00e1 la base que necesitas&#8230;<\/p>\n","protected":false},"author":1,"featured_media":224196,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,840],"tags":[1172],"class_list":["post-228136","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-tutoriales","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/228136","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=228136"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/228136\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/224196"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=228136"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=228136"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=228136"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}