{"id":233373,"date":"2023-02-12T15:25:00","date_gmt":"2023-02-12T12:25:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233373"},"modified":"2022-11-10T20:44:44","modified_gmt":"2022-11-10T17:44:44","slug":"como-agregar-una-seleccion-de-imagen-en-su-bloque-gutenberg-personalizado-de-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/como-agregar-una-seleccion-de-imagen-en-su-bloque-gutenberg-personalizado-de-wordpress\/","title":{"rendered":"C\u00f3mo agregar una selecci\u00f3n de imagen en su bloque Gutenberg personalizado de WordPress"},"content":{"rendered":"\n<p>Esta publicaci\u00f3n es para usted que est\u00e1 creando un bloque de Gutenberg personalizado y necesita una forma de seleccionar o cargar una imagen de la Biblioteca multimedia. La mayor\u00eda de los otros tipos de campos, como casillas de verificaci\u00f3n, entradas de texto o selectores de colores, son bastante f\u00e1ciles de agregar, pero un cargador de medios requiere un poco m\u00e1s de c\u00f3digo. Crearemos un componente Inspector que es responsable de representar un bot\u00f3n para abrir la Biblioteca multimedia, seleccionar una imagen y, opcionalmente, eliminarla o cambiarla m\u00e1s adelante. Todo usando componentes est\u00e1ndar de WordPress.<\/p>\n<p>Antes de sumergirnos en el c\u00f3digo, tenga en cuenta que esta publicaci\u00f3n requiere algunos conocimientos de Gutenberg sobre c\u00f3mo escribir bloques personalizados. Nos centraremos solo en la parte del cargador de medios y no en c\u00f3mo registrarse y hacer un bloque de Gutenberg en s\u00ed mismo. Si no est\u00e1 seguro de c\u00f3mo escribir un bloque de Gutenberg personalizado, tengo una serie de tutoriales que cubren exactamente esto:<\/p>\n<p>Con eso fuera del camino, \u00a1vamos a sumergirnos!<\/p>\n<h2>que haremos<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511f57cf93.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-153621-61e511f57cf93.png\" alt=\"C\u00f3mo agregar una selecci\u00f3n de imagen en su bloque Gutenberg personalizado de WordPress\" ><\/a><\/p>\n<p>La funci\u00f3n de selecci\u00f3n de medios ser\u00e1 funcionalmente exactamente igual que la funci\u00f3n de imagen destacada de WordPress. Agregaremos dentro de Inspector un panel que consistir\u00e1 en un bot\u00f3n para elegir una imagen.<\/p>\n<p>Al hacer clic en el bot\u00f3n, aparecer\u00e1 la ventana &quot;Seleccionar o cargar medios&quot; que le permitir\u00e1 seleccionar un archivo de la Biblioteca de medios. Limitamos la Biblioteca de medios para mostrar solo im\u00e1genes. Una vez que se selecciona una imagen, la ventana emergente se cierra y el panel muestra una vista previa de una peque\u00f1a miniatura de la imagen seleccionada. Debajo de los botones de vista previa para cambiar y eliminar la imagen aparecer\u00e1n. Exactamente como con la imagen destacada.<\/p>\n<p>Este tutorial asume que utilizar\u00e1 la imagen seleccionada como fondo del bloque, solo como ejemplo. Es por eso que almacenamos la URL de la imagen. Incluir\u00e9 un ejemplo de c\u00f3mo usar la imagen seleccionada (tanto en el <code>edit<\/code>como en la <code>save<\/code>funci\u00f3n). Al elegir una imagen, la imagen aparecer\u00e1 como fondo de nuestro bloque, tanto dentro del editor como en la interfaz.<\/p>\n<p>Almacenamos la ID del medio y la URL del medio en los atributos del bloque. El c\u00f3digo usa <code>withSelect<\/code>, un componente de orden superior provisto en el <code>wp.data<\/code>paquete, para consultar m\u00e1s informaci\u00f3n sobre los medios seleccionados, por ID.<\/p>\n<p>Tambi\u00e9n estoy &quot;tomando prestados&quot; los nombres de las clases de la funcionalidad de imagen destacada de WordPress para garantizar que todo se vea bien y que no haya necesidad de escribir ning\u00fan CSS. Esto es, por supuesto, opcional.<\/p>\n<h2>Guardar los medios seleccionados en atributos<\/h2>\n<p>Lo que necesita guardar en los atributos de su bloque depende un poco de usted. Como m\u00ednimo, necesitamos almacenar la identificaci\u00f3n de medios, obviamente. Esto podr\u00eda ser suficiente si no necesita usar la URL de los medios en ninguna parte del c\u00f3digo del script. Por ejemplo, si usa <code>ServerSideRender<\/code>donde PHP es responsable de representar la salida del bloque. En ese caso, puede obtener f\u00e1cilmente la URL de la imagen de la ID de medios usando, por ejemplo <code>[wp_get_attachment_image_src](https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_attachment_image_src\/)()<\/code>,. Sin embargo, en el siguiente ejemplo, muestro un ejemplo simple de mostrar la imagen como fondo de nuestro bloque, por lo que tambi\u00e9n almaceno la URL de medios como atributo. Usaremos el atributo URL tanto en <code>edit<\/code>(para agregar el fondo en el editor) como en <code>save<\/code>(para agregar el fondo en la interfaz).<\/p>\n<p>Comencemos definiendo nuestros atributos. La ID de medios debe ser un n\u00famero de tipo y el valor predeterminado es 0. Esto facilita la comparaci\u00f3n. Y la URL de los medios debe ser una cadena de tipo con una cadena vac\u00eda predeterminada.<\/p>\n<pre><code>attributes: {\n    mediaId: {\n        type: 'number',\n        default: 0\n    },\n    mediaUrl: {\n        type: 'string',\n        default: ''\n    }\n},<\/code><\/pre>\n<h2>Creando el componente<\/h2>\n<p>Para que nuestro c\u00f3digo sea m\u00e1s ordenado, definimos un componente separado para la <code>edit<\/code>funci\u00f3n del bloque. M\u00e1s adelante pasaremos este componente a <code>withSelect<\/code>as para envolverlo alrededor de nuestro componente.<\/p>\n<p>En el retorno del componente hacemos un simple <code>&lt;div&gt;<\/code>para el contenido del bloque. Supongo que tendr\u00e1 o tendr\u00e1 m\u00e1s contenido de bloque real para reemplazar el contenido de ejemplo ficticio. Tambi\u00e9n renderizamos <code>InspectorControls<\/code>(paquete <code>wp.blockEditor<\/code>) para agregar una secci\u00f3n al inspector. Por ahora agrego un vac\u00edo <code>PanelBody<\/code>dentro del archivo <code>InspectorControls<\/code>. Agrego una <code>&lt;div&gt;<\/code>con la misma clase que usa la secci\u00f3n de im\u00e1genes destacadas de WordPress. Esto asegura que nuestro estilo se vea bien. M\u00e1s adelante, completaremos esto <code>PanelBody<\/code>con el c\u00f3digo para la funci\u00f3n de selecci\u00f3n de medios.<\/p>\n<p>Pero primero, desestructuramos el componente necesario al comienzo del archivo:<\/p>\n<pre><code>const { InspectorControls } = wp.blockEditor;\nconst { PanelBody } = wp.components;\nconst { Fragment } = wp.element;<\/code><\/pre>\n<p>Encima <code>registerBlockType<\/code>defino un componente simple llamado <code>BlockEdit<\/code>. Si prefiere mover esto a un archivo separado, puede hacerlo. Esto es com\u00fan y recomendado, pero para este tutorial mantendr\u00e9 las cosas simples y las mantendr\u00e9 en el mismo archivo.<\/p>\n<pre><code>const BlockEdit = (props) =&gt; {\n    const { attributes, setAttributes } = props;\n\u00a0\n    return (&lt;Fragment&gt;\n            &lt;InspectorControls&gt;\n                &lt;PanelBody\n                    title={__('Select block background image', 'awp')}\n                    initialOpen={ true }\n                &gt;\n                    &lt;div className=\"editor-post-featured-image\"&gt;\n                        ...We will add code here...\n                    &lt;\/div&gt;\n                &lt;\/PanelBody&gt;\n            &lt;\/InspectorControls&gt;\n            &lt;div&gt;\n                ... Your block content here...\n            &lt;\/div&gt;\n        &lt;\/Fragment&gt;\n    );\n};<\/code><\/pre>\n<p>Ahora queremos representar este componente en nuestra <code>edit<\/code>funci\u00f3n. Pero queremos envolverlo en un <code>withSelect<\/code>.<\/p>\n<h2>Usando <code>withSelect<\/code>en la <code>edit<\/code>funci\u00f3n<\/h2>\n<p>Si no est\u00e1 familiarizado con <code>withSelect<\/code>, es un componente \u00fatil de orden superior que nos permite realizar consultas. Puede, por ejemplo, consultar publicaciones con esto. Sin embargo, utilizaremos la funci\u00f3n <code>select('core').getMedia()<\/code>para consultar la ID del medio. Como respuesta obtendremos un objeto con toda la informaci\u00f3n del medio. El objeto multimedia que obtengamos como respuesta se proporcionar\u00e1 como accesorio en nuestro <code>BlockEdit<\/code>componente, listo para usar. H\u00e1bil.<\/p>\n<p>Nos aseguramos de consultar los medios solo si el atributo de ID de medios realmente est\u00e1 configurado en algo distinto de 0. As\u00ed es como se ver\u00e1 nuestra funci\u00f3n de edici\u00f3n:<\/p>\n<pre><code>edit: withSelect((select, props) =&gt; {\n    return { media: props.attributes.mediaId? select('core').getMedia(props.attributes.mediaId): undefined };\n})(BlockEdit),<\/code><\/pre>\n<p>Al final, despu\u00e9s de cerrar la <code>withSelect<\/code>fila, <code>#3<\/code>es donde solicitamos <code>withSelect<\/code>la devoluci\u00f3n de nuestro <code>BlockEdit<\/code>componente. Con esto, nuestro <code>BlockEdit<\/code>componente ahora tiene acceso a <code>props.media<\/code>.<\/p>\n<h2>Representaci\u00f3n de una selecci\u00f3n de medios<\/h2>\n<p>Finalmente viene la parte divertida: La parte del Inspector.<\/p>\n<p>El componente que nos interesa es <code>MediaUpload<\/code>(paquete <code>wp.blockEditor<\/code>). Si est\u00e1 interesado, el repositorio de WordPress Github para Gutenberg tiene <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/block-editor\/src\/components\/media-upload\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documentaci\u00f3n sobre este componente<\/a>. Tambi\u00e9n envolveremos este componente dentro de un componente llamado <code>MediaUploadCheck<\/code>(paquete <code>wp.blockEditor<\/code>). Este componente se asegura de que el usuario actual tenga capacidades para usar la biblioteca de medios, por lo que es una buena pr\u00e1ctica usar esto.<\/p>\n<p>El <code>MediaUpload<\/code>componente tiene un accesorio requerido: <code>render<\/code>. La forma en que funciona este componente es que definimos una funci\u00f3n para el <code>render<\/code>accesorio donde representamos la salida para el &quot;\u00e1rea de carga de medios&quot;. En nuestro caso, representaremos un <code>Button<\/code>(paquete <code>wp.components<\/code>). Dentro del accesorio de representaci\u00f3n de MediaUpload, tenemos acceso a la <code>open<\/code>funci\u00f3n a la que podemos llamar para que WordPress abra la ventana emergente de la Biblioteca multimedia:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511f6d571d.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-153621-61e511f6d571d.png\" alt=\"C\u00f3mo agregar una selecci\u00f3n de imagen en su bloque Gutenberg personalizado de WordPress\" ><\/a><\/p>\n<p>Hay algunos accesorios m\u00e1s disponibles para <code>MediaUpload<\/code>. Cubriremos los m\u00e1s importantes para hacerlo funcional en este tutorial, pero hay algunos m\u00e1s con los que puede jugar. Al menos, podr\u00eda estar interesado en el accesorio <code>allowedTypes<\/code>donde puede limitar qu\u00e9 tipos de archivos son posibles de seleccionar en la Biblioteca. En nuestro caso, lo configuramos para permitir solo im\u00e1genes.<\/p>\n<h3>Agregando el<code>MediaUpload<\/code><\/h3>\n<p>Primero desestructura los nuevos componentes;<\/p>\n<pre><code>const { Button } = wp.components;\nconst { MediaUpload, MediaUploadCheck } = wp.blockEditor;<\/code><\/pre>\n<p>Agreguemos <code>MediaUploadCheck<\/code>y <code>MediaUpload<\/code>dentro de nuestro <code>div<\/code>en nuestro <code>PanelBody<\/code>:<\/p>\n<pre><code>&lt;div className=\"editor-post-featured-image\"&gt;\n    &lt;MediaUploadCheck&gt;\n        &lt;MediaUpload\n            allowedTypes={ ['image'] }\n            render={({open}) =&gt; (&lt;Button \n                    className={attributes.mediaId == 0? 'editor-post-featured-image__toggle': 'editor-post-featured-image__preview'}\n                    onClick={open}\n                &gt;\n                    {attributes.mediaId == 0 &amp;&amp; __('Choose an image', 'awp')}\n                &lt;\/Button&gt;\n            )}\n        \/&gt;\n    &lt;\/MediaUploadCheck&gt;\n&lt;\/div&gt;<\/code><\/pre>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511fa0bf3f.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-153621-61e511fa0bf3f.png\" alt=\"C\u00f3mo agregar una selecci\u00f3n de imagen en su bloque Gutenberg personalizado de WordPress\" ><\/a><\/p>\n<p>El c\u00f3digo anterior se desestructura <code>open<\/code>dentro de la funci\u00f3n para <code>render<\/code>. Representamos un simple <code>Button<\/code>donde su <code>onClick<\/code>propiedad ejecutar\u00e1 la <code>open<\/code>funci\u00f3n. Tambi\u00e9n agregu\u00e9 los mismos nombres de clase que la funcionalidad de imagen destacada de WordPress para garantizar que no necesitemos agregar ning\u00fan estilo.<\/p>\n<p>Dentro del <code>Button<\/code>componente comprobamos si se ha configurado o no una imagen (<code>attributes.mediaId<\/code>). Si no es as\u00ed, hacemos eco del texto \u00abElegir una imagen&quot;. Ahora deber\u00edamos tener esto en nuestro bloque.<\/p>\n<p>Al hacer clic en el bot\u00f3n, deber\u00eda aparecer la ventana emergente de la biblioteca multimedia. Sin embargo, seleccionar una imagen no funciona en este momento, porque nos faltan los accesorios <code>onSelect<\/code>y en. Arreglemos eso ahora. Configuramos la ID de medios seleccionada y configuramos para ejecutar una funci\u00f3n que luego definiremos dentro de nuestro componente.<code>value``MediaUpload``value``onSelect<\/code><\/p>\n<pre><code>...\n&lt;MediaUploadCheck&gt;\n    &lt;MediaUpload\n        onSelect={onSelectMedia}\n        value={attributes.mediaId}\n        allowedTypes={ ['image'] }\n        ...<\/code><\/pre>\n<p>Definamos la <code>onSelectMedia<\/code>funci\u00f3n dentro de nuestro componente.<\/p>\n<h3>Manejo de selecci\u00f3n de medios<\/h3>\n<p><strong>Nota<\/strong>: Estoy definiendo mis funciones como funciones de flecha (<code>onSelectMedia =() =&gt; { }<\/code>). Las funciones de flecha son bastante nuevas en ESNext y bastante ingeniosas. La desventaja es que el uso de funciones de flecha requiere que agregue soporte para esto en su configuraci\u00f3n de Babel. Si no lo ha hecho, le recomiendo que busque bajo el t\u00edtulo &quot;Configuraci\u00f3n de Babel&quot; en <a href=\"https:\/\/awhitepixel.com\/blog\/how-to-create-custom-gutenberg-blocks-part-1-setting-up-the-development-environment\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">esta publicaci\u00f3n<\/a>.<\/p>\n<p>Justo antes de la declaraci\u00f3n de devoluci\u00f3n del componente, defino una <code>onSelectMedia<\/code>funci\u00f3n. Todo lo que necesitamos hacer es actualizar nuestros atributos usando <code>setAttributes()<\/code>. Como par\u00e1metro <code>onSelectMedia<\/code>obtenemos un objeto multimedia. Simplemente extraemos lo que necesitamos del objeto multimedia. En nuestro caso, es la ID del medio y la URL de tama\u00f1o completo, que son las propiedades <code>id<\/code>y <code>url<\/code>respectivamente.<\/p>\n<pre><code>const BlockEdit = (props) =&gt; {\n    const { attributes, setAttributes } = props;\n\u00a0\n    const onSelectMedia = (media) =&gt; {\n        props.setAttributes({\n            mediaId: media.id,\n            mediaUrl: media.url\n        });\n    }\n\u00a0\n    return(\n        ...<\/code><\/pre>\n<p>Pru\u00e9belo ahora y ahora podr\u00e1 seleccionar una imagen de la Biblioteca multimedia. Los medios seleccionados se guardan en los atributos del bloque. Sin embargo, todav\u00eda no hay una vista previa en el Inspector, y debido a que ha seleccionado una imagen, el bot\u00f3n para seleccionar una imagen desaparece. El panel ahora est\u00e1 vac\u00edo. El siguiente paso es mostrar la vista previa siempre que se haya seleccionado una imagen, as\u00ed como proporcionar opciones para eliminarla o cambiarla.<\/p>\n<h2>Representaci\u00f3n de una imagen de vista previa<\/h2>\n<p>Dentro del <code>Button<\/code>componente que renderizamos dentro <code>MediaUpload<\/code>de la <code>render<\/code>prop hacemos eco del texto &quot;Elegir una imagen&quot; si una imagen a\u00fan no est\u00e1 configurada. Pero necesitamos agregar algo de c\u00f3digo para cuando se establece una imagen aqu\u00ed; una vista previa<\/p>\n<p>Para ayudarnos a generar una buena vista previa, usamos el componente <code>ResponsiveWrapper<\/code>(paquete <code>wp.components<\/code>). Para que <code>ResponsiveWrapper<\/code>funcione completamente, necesitamos proporcionar accesorios para la altura y el ancho. Tambi\u00e9n necesitamos la URL de la miniatura. No tiene sentido usar la URL completa (que puede ser gigantesca) para generar una vista previa dentro del Inspector. Aqu\u00ed es donde <code>withSelect<\/code>entra la propiedad. Dentro del componente representamos una <code>&lt;img&gt;<\/code>etiqueta HTML simple.<\/p>\n<p>Primero desestructuramos el componente necesario:<\/p>\n<pre><code>const { ResponsiveWrapper } = wp.components;<\/code><\/pre>\n<pre><code>&lt;Button \n    className={attributes.mediaId == 0? 'editor-post-featured-image__toggle': 'editor-post-featured-image__preview'}\n    onClick={open}\n&gt;\n    {attributes.mediaId == 0 &amp;&amp; __('Choose an image', 'awp')}\n    {props.media != undefined &amp;&amp; \n        &lt;ResponsiveWrapper\n                naturalWidth={ props.media.media_details.width }\n            naturalHeight={ props.media.media_details.height }\n            &gt;\n                &lt;img src={props.media.source_url} \/&gt;\n            &lt;\/ResponsiveWrapper&gt;\n    }\n&lt;\/Button&gt;<\/code><\/pre>\n<p>Como pod\u00e9is ver accedemos al prop <code>withSelect<\/code>que nos ha facilitado el componente, <code>props.media<\/code>. Obtenemos el ancho, el alto y la URL al tama\u00f1o de la miniatura de los medios del objeto.<\/p>\n<p>\u00a1Ahora deber\u00eda obtener una buena vista previa de la imagen seleccionada!<\/p>\n<p>Debido a que representamos la imagen de vista previa dentro, al <code>Button<\/code>hacer clic en la imagen de vista previa se activar\u00e1 la <code>Button<\/code>funci\u00f3n <code>onClick<\/code>de, que es abrir la Biblioteca de medios. De esa manera ya puedes cambiar la imagen seleccionada.<\/p>\n<p>Actualmente no hay forma de eliminar o restablecer la imagen seleccionada. \u00a1Arreglemos eso!<\/p>\n<h3>Agregar una funci\u00f3n de eliminaci\u00f3n<\/h3>\n<p>Como m\u00ednimo, deber\u00edamos ofrecer la posibilidad de que el usuario elimine la imagen seleccionada. A partir de ahora, una vez que haya seleccionado una imagen, solo puede cambiarla, pero no eliminarla.<\/p>\n<p>Haremos lo mismo que hace WordPress para la imagen destacada: una nueva <code>Button<\/code>debajo de la imagen de vista previa (totalmente fuera de su <code>MediaUploadCheck<\/code>). Al proporcionarle algunos accesorios inteligentes <code>Button<\/code>, hacemos que se vea como un enlace (<code>isLink<\/code>) con color de texto rojo (<code>isDestructive<\/code>). Lea la <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/button\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documentaci\u00f3n de Button<\/a> para ver qu\u00e9 m\u00e1s es posible. Envolvemos el bot\u00f3n dentro de otro <code>MediaUploadCheck<\/code>, solo para asegurarnos de que el usuario tenga las capacidades correctas.<\/p>\n<pre><code>        ...\n        &lt;\/MediaUploadCheck&gt;\n        {attributes.mediaId != 0 &amp;&amp; \n            &lt;MediaUploadCheck&gt;\n                &lt;Button onClick={removeMedia} isLink isDestructive&gt;{__('Remove image', 'awp')}&lt;\/Button&gt;\n            &lt;\/MediaUploadCheck&gt;\n        }\n    &lt;\/div&gt;\n&lt;\/PanelBody&gt;<\/code><\/pre>\n<p>Para este evento <code>Button<\/code>ejecutamos <code>onClick<\/code>una nueva funci\u00f3n dentro de nuestro componente: <code>removeMedia()<\/code>. Lo definimos en alg\u00fan lugar justo antes de la funci\u00f3n de retorno del componente, como hicimos con <code>onSelectMedia<\/code>.<\/p>\n<pre><code>const removeMedia =() =&gt; {\n    props.setAttributes({\n        mediaId: 0,\n        mediaUrl: ''\n    });\n}<\/code><\/pre>\n<p>Todo lo que hace esta funci\u00f3n es restablecer nuestros dos valores de atributo.<\/p>\n<p>Ahora tendremos un enlace agradable y claro para eliminar la imagen:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511faedb09.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-153621-61e511faedb09.png\" alt=\"C\u00f3mo agregar una selecci\u00f3n de imagen en su bloque Gutenberg personalizado de WordPress\" ><\/a><\/p>\n<p>Al hacer clic en el bot\u00f3n nuevo, la imagen seleccionada y el bot\u00f3n mismo desaparecen, y vuelve a aparecer el bot\u00f3n para seleccionar una imagen.<\/p>\n<h3>Agregar un bot\u00f3n de reemplazo<\/h3>\n<p>Este paso es totalmente opcional. Como se mencion\u00f3 anteriormente, hacer clic en la imagen de vista previa de la imagen abrir\u00e1 la Biblioteca multimedia y le permitir\u00e1 cambiar la imagen. Sin embargo, esto podr\u00eda no ser tan intuitivo para que todos lo entiendan. WordPress agrega un bot\u00f3n separado para cambiar la imagen, solo para que quede muy claro. Podemos hacer lo mismo.<\/p>\n<p>Para renderizar un bot\u00f3n de cambio de imagen b\u00e1sicamente repetimos el c\u00f3digo que tenemos para seleccionar la imagen: otro <code>MediaUpload<\/code>componente. Proporcionamos la misma funci\u00f3n para <code>onSelect<\/code>, <code>allowedFileTypes<\/code>y <code>value<\/code>que antes. Dentro del <code>render<\/code>accesorio para <code>MediaUpload<\/code>simplemente renderizamos otro <code>Button<\/code>que abre la Biblioteca multimedia. Coloquemos este bot\u00f3n antes del bot\u00f3n Eliminar, ya que tiene m\u00e1s sentido para el usuario final:<\/p>\n<pre><code>&lt;\/MediaUploadCheck&gt;\n{attributes.mediaId != 0 &amp;&amp; \n    &lt;MediaUploadCheck&gt;\n        &lt;MediaUpload\n            title={__('Replace image', 'awp')}\n            value={attributes.mediaId}\n            onSelect={onSelectMedia}\n            allowedTypes={['image']}\n            render={({open}) =&gt; (&lt;Button onClick={open} isDefault isLarge&gt;{__('Replace image', 'awp')}&lt;\/Button&gt;\n            )}\n        \/&gt;\n    &lt;\/MediaUploadCheck&gt;\n}\n{attributes.mediaId != 0 &amp;&amp; \n    &lt;MediaUploadCheck&gt;\n        &lt;Button onClick={removeMedia} ...<\/code><\/pre>\n<p>As\u00ed que ahora deber\u00edas obtener esto:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511f57cf93.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-153621-61e511f57cf93.png\" alt=\"C\u00f3mo agregar una selecci\u00f3n de imagen en su bloque Gutenberg personalizado de WordPress\" ><\/a><\/p>\n<h2>Usando la imagen seleccionada<\/h2>\n<p>A estas alturas, deber\u00eda estar bastante claro c\u00f3mo puede usar la imagen seleccionada. Tiene el ID de medios y la URL de medios almacenados en los atributos de su bloque. Sin embargo, como un ejemplo simple, incluir\u00e9 un c\u00f3digo que establece la imagen seleccionada como fondo del bloque. El c\u00f3digo se puede hacer exactamente igual en <code>edit<\/code>las <code>save<\/code>funciones y. Simplemente creamos un objeto de estilo que aplicamos en el div envolvente del bloque. En el objeto de estilo, establecemos la imagen de fondo en la URL de los medios.<\/p>\n<pre><code>    ...\n    const blockStyle = {\n        backgroundImage: attributes.mediaUrl != 0? 'url(\"' + attributes.mediaUrl + '\")': 'none'\n    };\n\u00a0\n    return(\n        &lt;Fragment&gt;\n            &lt;InspectorControls&gt;\n            ...\n            &lt;\/InspectorControls&gt;\n            &lt;div style={blockStyle}&gt;\n                ... Your block content here...\n            &lt;\/div&gt;\n        &lt;\/Fragment&gt;\n        ...<\/code><\/pre>\n<p>Con el resto del contenido de su bloque personalizado, f\u00e1cilmente podr\u00eda verse as\u00ed:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153621-61e511fd78dce.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-153621-61e511fd78dce.png\" alt=\"C\u00f3mo agregar una selecci\u00f3n de imagen en su bloque Gutenberg personalizado de WordPress\" ><\/a><\/p>\n<p>Si aplica el estilo de bloque en ambos <code>edit<\/code>y <code>save<\/code>, su bloque ahora deber\u00eda tener los medios seleccionados como fondo. Tanto dentro del editor como en el frontend.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Seleccionar una imagen (o archivo) de la biblioteca multimedia es una funci\u00f3n que usted, como desarrollador de Gutenberg, sin duda necesitar\u00e1 para sus bloques. Aprendimos c\u00f3mo agregar una funci\u00f3n para seleccionar una imagen de la biblioteca multimedia en nuestro bloque personalizado de Gutenberg. Lo hemos hecho de la misma manera que WordPress lo hace para la imagen destacada. (Edici\u00f3n de mayo de 2020: WordPress ahora ha actualizado la imagen destacada para usar <code>useSelect<\/code>, el gancho React en su lugar). Esto asegura que nuestro c\u00f3digo no sea &quot;pirateado&quot; con un alto riesgo de romperse en futuras actualizaciones.<\/p>\n<p>\u00a1D\u00e9jame saber si has tenido alg\u00fan uso de esto!<\/p>\n<h2>c\u00f3digo completo<\/h2>\n<p>A continuaci\u00f3n se muestra el c\u00f3digo completo de un bloque personalizado que presenta la funci\u00f3n de selecci\u00f3n de medios. Y nada m\u00e1s realmente. \u00a1Esa parte depende de ti!<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\nconst { InspectorControls, MediaUpload, MediaUploadCheck } = wp.blockEditor;\nconst { PanelBody, Button, ResponsiveWrapper } = wp.components;\nconst { Fragment } = wp.element;\nconst { withSelect } = wp.data;\nconst { __ } = wp.i18n;\nconst BlockEdit = (props) =&gt; {\n    const { attributes, setAttributes } = props;\n\u00a0\n    const removeMedia = () =&gt; {\n        props.setAttributes({\n            mediaId: 0,\n            mediaUrl: ''\n        });\n    }\n    const onSelectMedia = (media) =&gt; {\n        props.setAttributes({\n            mediaId: media.id,\n            mediaUrl: media.url\n        });\n    }\n\u00a0\n    const blockStyle = {\n        backgroundImage: attributes.mediaUrl != ''? 'url(\"' + attributes.mediaUrl + '\")': 'none'\n    };\n    return (&lt;Fragment&gt;\n            &lt;InspectorControls&gt;\n                &lt;PanelBody\n                    title={__('Select block background image', 'awp')}\n                    initialOpen={ true }\n                &gt;\n                    &lt;div className=\"editor-post-featured-image\"&gt;\n                        &lt;MediaUploadCheck&gt;\n                            &lt;MediaUpload\n                                onSelect={onSelectMedia}\n                                value={attributes.mediaId}\n                                allowedTypes={ ['image'] }\n                                render={({open}) =&gt; (&lt;Button \n                                        className={attributes.mediaId == 0? 'editor-post-featured-image__toggle': 'editor-post-featured-image__preview'}\n                                        onClick={open}\n                                    &gt;\n                                        {attributes.mediaId == 0 &amp;&amp; __('Choose an image', 'awp')}\n                                        {props.media != undefined &amp;&amp; \n                                                &lt;ResponsiveWrapper\n                                                naturalWidth={ props.media.media_details.width }\n                                            naturalHeight={ props.media.media_details.height }\n                                            &gt;\n                                                &lt;img src={props.media.source_url} \/&gt;\n                                            &lt;\/ResponsiveWrapper&gt;\n                                            }\n                                    &lt;\/Button&gt;\n                                )}\n                            \/&gt;\n                        &lt;\/MediaUploadCheck&gt;\n                        {attributes.mediaId != 0 &amp;&amp; \n                            &lt;MediaUploadCheck&gt;\n                                &lt;MediaUpload\n                                    title={__('Replace image', 'awp')}\n                                    value={attributes.mediaId}\n                                    onSelect={onSelectMedia}\n                                    allowedTypes={['image']}\n                                    render={({open}) =&gt; (&lt;Button onClick={open} isDefault isLarge&gt;{__('Replace image', 'awp')}&lt;\/Button&gt;\n                                    )}\n                                \/&gt;\n                            &lt;\/MediaUploadCheck&gt;\n                        }\n                        {attributes.mediaId != 0 &amp;&amp; \n                            &lt;MediaUploadCheck&gt;\n                                &lt;Button onClick={removeMedia} isLink isDestructive&gt;{__('Remove image', 'awp')}&lt;\/Button&gt;\n                            &lt;\/MediaUploadCheck&gt;\n                        }\n                    &lt;\/div&gt;\n                &lt;\/PanelBody&gt;\n            &lt;\/InspectorControls&gt;\n            &lt;div style={blockStyle}&gt;\n                ... Your block content here...\n            &lt;\/div&gt;\n        &lt;\/Fragment&gt;\n    );\n};\nregisterBlockType('awp\/imageselectinspector', {\n    title: 'AWP Imageselect',\n    icon: 'smiley',\n    category: 'layout',\n    supports: {\n        align: true\n    },\n    attributes: {\n        mediaId: {\n            type: 'number',\n            default: 0\n        },\n        mediaUrl: {\n            type: 'string',\n            default: ''\n        }\n    }, \n    edit: withSelect((select, props) =&gt; {\n        return { media: props.attributes.mediaId? select('core').getMedia(props.attributes.mediaId): undefined };\n    })(BlockEdit),\n    save: (props) =&gt; {\n        const { attributes } = props;\n        const blockStyle = {\n            backgroundImage: attributes.mediaUrl != ''? 'url(\"' + attributes.mediaUrl + '\")': 'none'\n        };\n        return (&lt;div style={blockStyle}&gt;\n                ... Your block content here...\n            &lt;\/div&gt;\n        );\n    }\n});<\/code><\/pre>\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>Este tutorial explica c\u00f3mo agregar un bot\u00f3n de carga o selecci\u00f3n de imagen para la biblioteca de medios dentro del Inspector para su bloque Gutenberg de WordPress personalizado.<\/p>\n","protected":false},"author":1,"featured_media":153622,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,892,810,831,935,935,727,727,1110,800,800,810,831,840,840,861,861],"tags":[1172],"class_list":{"0":"post-233373","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-javascript-2","15":"category-n-a","16":"category-php-2","20":"category-tutoriales","22":"category-wordpress-2","24":"tag-affiai-es"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233373","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=233373"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233373\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/153622"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233373"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233373"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233373"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}