{"id":233414,"date":"2023-02-12T15:43:00","date_gmt":"2023-02-12T12:43:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233414"},"modified":"2022-11-10T23:33:46","modified_gmt":"2022-11-10T20:33:46","slug":"como-adicionar-uma-selecao-de-imagem-em-seu-bloco-personalizado-wordpress-gutenberg","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/como-adicionar-uma-selecao-de-imagem-em-seu-bloco-personalizado-wordpress-gutenberg\/","title":{"rendered":"Como adicionar uma sele\u00e7\u00e3o de imagem em seu bloco personalizado WordPress Gutenberg"},"content":{"rendered":"\n<p>Este post \u00e9 para voc\u00ea que est\u00e1 criando um bloco Gutenberg personalizado e precisa de uma maneira de selecionar ou fazer upload de uma imagem da Biblioteca de M\u00eddia. A maioria dos outros tipos de campo, como caixas de sele\u00e7\u00e3o, entradas de texto ou seletores de cores, s\u00e3o muito f\u00e1ceis de adicionar, mas um carregador de m\u00eddia requer um pouco mais de c\u00f3digo. Criaremos um componente Inspector que ser\u00e1 respons\u00e1vel por renderizar um bot\u00e3o para abrir a Biblioteca de M\u00eddia, selecionar uma imagem e, opcionalmente, remov\u00ea-la ou alter\u00e1-la posteriormente. Todos usando componentes padr\u00e3o do WordPress.<\/p>\n<p>Antes de mergulharmos no c\u00f3digo, lembre-se de que este post requer algum conhecimento do Gutenberg sobre como escrever blocos personalizados. Vamos nos concentrar apenas na parte do uploader de m\u00eddia e n\u00e3o em como registrar e fazer um bloco Gutenberg em si. Se voc\u00ea n\u00e3o tiver certeza sobre como escrever um bloco personalizado do Gutenberg, tenho uma s\u00e9rie de tutoriais cobrindo exatamente isso:<\/p>\n<p>Com isso fora do caminho, vamos mergulhar de cabe\u00e7a!<\/p>\n<h2>O que vamos fazer<\/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=\"Como adicionar uma sele\u00e7\u00e3o de imagem em seu bloco personalizado WordPress Gutenberg\" ><\/a><\/p>\n<p>A fun\u00e7\u00e3o de sele\u00e7\u00e3o de m\u00eddia ser\u00e1 funcionalmente exatamente igual \u00e0 fun\u00e7\u00e3o de imagem em destaque do WordPress. Vamos dentro do Inspector adicionar um painel que consiste em um bot\u00e3o para escolher uma imagem.<\/p>\n<p>Ao clicar no bot\u00e3o, a janela &quot;Selecionar ou fazer upload de m\u00eddia&quot; ser\u00e1 exibida, permitindo que voc\u00ea selecione um arquivo da Biblioteca de m\u00eddia. Limitamos a Biblioteca de m\u00eddia a mostrar apenas imagens. Depois que uma imagem \u00e9 selecionada, o pop-up \u00e9 fechado e o painel visualiza uma pequena miniatura da imagem selecionada. Abaixo os bot\u00f5es de visualiza\u00e7\u00e3o para alterar e remover a imagem ser\u00e3o exibidos. Exatamente como na imagem em destaque.<\/p>\n<p>Este tutorial pressup\u00f5e que voc\u00ea usar\u00e1 a imagem selecionada como plano de fundo do bloco \u2013 apenas como exemplo. \u00c9 por isso que armazenamos o URL da imagem. Vou incluir um exemplo de como usar a imagem selecionada (tanto na fun\u00e7\u00e3o <code>edit<\/code>quanto na <code>save<\/code>fun\u00e7\u00e3o). Ao escolher uma imagem, a imagem aparecer\u00e1 como plano de fundo do nosso bloco, tanto dentro do editor quanto no frontend.<\/p>\n<p>Armazenamos o ID da m\u00eddia e a URL da m\u00eddia nos atributos do bloco. O c\u00f3digo usa <code>withSelect<\/code>, um componente de ordem superior fornecido no <code>wp.data<\/code>pacote, para consultar mais informa\u00e7\u00f5es sobre a m\u00eddia selecionada, por ID.<\/p>\n<p>Tamb\u00e9m estou &#8220;pegando emprestado&quot; nomes de classe da funcionalidade de imagem em destaque do WordPress para garantir que tudo pare\u00e7a bom e n\u00e3o haja necessidade de escrever nenhum CSS por conta pr\u00f3pria. Claro que isso \u00e9 opcional.<\/p>\n<h2>Salvando a m\u00eddia selecionada em atributos<\/h2>\n<p>O que voc\u00ea precisa salvar nos atributos do seu bloco depende um pouco de voc\u00ea. No m\u00ednimo, precisamos armazenar o ID da m\u00eddia, obviamente. Isso pode ser suficiente se voc\u00ea n\u00e3o precisar usar o URL da m\u00eddia em nenhum lugar no c\u00f3digo do script. Por exemplo, se voc\u00ea usar <code>ServerSideRender<\/code>onde o PHP \u00e9 respons\u00e1vel por renderizar a sa\u00edda do bloco. Nesse caso, voc\u00ea pode obter facilmente o URL da imagem do ID da m\u00eddia usando, por exemplo, <code>[wp_get_attachment_image_src](https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_attachment_image_src\/)()<\/code>. Por\u00e9m no exemplo abaixo estou mostrando um exemplo simples de exibi\u00e7\u00e3o da imagem como plano de fundo do nosso bloco, ent\u00e3o tamb\u00e9m armazeno a URL da m\u00eddia como atributo. Usaremos o atributo URL em ambos <code>edit<\/code>(para adicionar o plano de fundo no editor) e no <code>save<\/code>(para adicionar o plano de fundo no frontend).<\/p>\n<p>Vamos come\u00e7ar definindo nossos atributos. O ID da m\u00eddia deve ser o n\u00famero do tipo e o padr\u00e3o \u00e9 0. Isso facilita a compara\u00e7\u00e3o. E o URL da m\u00eddia deve ser tipo string com string vazia padr\u00e3o.<\/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>Criando o componente<\/h2>\n<p>Para tornar nosso c\u00f3digo mais ordenado, definimos um componente separado para a <code>edit<\/code>fun\u00e7\u00e3o do bloco. Mais tarde, passaremos esse componente <code>withSelect<\/code>para envolv\u00ea-lo em nosso componente.<\/p>\n<p>No retorno do componente renderizamos um simples <code>&lt;div&gt;<\/code>para o conte\u00fado do bloco. Suponho que voc\u00ea ter\u00e1 ou ter\u00e1 mais conte\u00fado de bloco real para substituir o conte\u00fado de exemplo fict\u00edcio. Tamb\u00e9m renderizamos <code>InspectorControls<\/code>(package <code>wp.blockEditor<\/code>) para adicionar uma se\u00e7\u00e3o ao inspetor. Por enquanto eu adiciono um vazio <code>PanelBody<\/code>dentro do arquivo <code>InspectorControls<\/code>. Eu adiciono um <code>&lt;div&gt;<\/code>com a mesma classe que a se\u00e7\u00e3o de imagens em destaque do WordPress usa. Isso garante que nosso estilo pare\u00e7a bom. Mais tarde, preencheremos isso <code>PanelBody<\/code>com o c\u00f3digo para a funcionalidade de sele\u00e7\u00e3o de m\u00eddia.<\/p>\n<p>Mas primeiro, vamos desestruturar o componente necess\u00e1rio no in\u00edcio do arquivo:<\/p>\n<pre><code>const { InspectorControls } = wp.blockEditor;\nconst { PanelBody } = wp.components;\nconst { Fragment } = wp.element;<\/code><\/pre>\n<p>Acima do <code>registerBlockType<\/code>eu defino um componente simples chamado <code>BlockEdit<\/code>. Se voc\u00ea preferir mover isso para um arquivo separado, voc\u00ea pode faz\u00ea-lo. Isso \u00e9 comum e recomendado, mas para este tutorial estou mantendo as coisas simples e mantendo-as no mesmo arquivo.<\/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>Agora queremos renderizar este componente em nossa <code>edit<\/code>fun\u00e7\u00e3o. Mas queremos envolv\u00ea-lo em um arquivo <code>withSelect<\/code>.<\/p>\n<h2>Usando <code>withSelect<\/code>na <code>edit<\/code>fun\u00e7\u00e3o<\/h2>\n<p>Se voc\u00ea n\u00e3o estiver familiarizado com <code>withSelect<\/code>, \u00e9 um componente \u00fatil de ordem superior que nos permite realizar consultas. Voc\u00ea pode, por exemplo, consultar postagens com isso. No entanto, usaremos a fun\u00e7\u00e3o <code>select('core').getMedia()<\/code>para consultar o ID da m\u00eddia. Como resposta, obteremos um objeto com todas as informa\u00e7\u00f5es da m\u00eddia. O objeto de m\u00eddia que recebemos em resposta ser\u00e1 fornecido como prop em nosso <code>BlockEdit<\/code>componente, pronto para uso. Bonito.<\/p>\n<p>Certificamo-nos de consultar a m\u00eddia apenas se o atributo de ID de m\u00eddia estiver realmente definido como algo diferente de 0. \u00c9 assim que nossa fun\u00e7\u00e3o de edi\u00e7\u00e3o se parecer\u00e1:<\/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>No final, ap\u00f3s fechar <code>withSelect<\/code>a fila <code>#3<\/code>\u00e9 onde pedimos <code>withSelect<\/code>para devolver nosso <code>BlockEdit<\/code>componente. Com isso nosso <code>BlockEdit<\/code>componente agora tem acesso a <code>props.media<\/code>.<\/p>\n<h2>Renderizando uma sele\u00e7\u00e3o de m\u00eddia<\/h2>\n<p>Finalmente vem a parte divertida: A parte do Inspetor.<\/p>\n<p>O componente em que estamos interessados \u200b\u200b\u00e9 <code>MediaUpload<\/code>(package <code>wp.blockEditor<\/code>). Se voc\u00ea estiver interessado, o reposit\u00f3rio Github do WordPress para Gutenberg tem alguma <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\">documenta\u00e7\u00e3o sobre este componente<\/a>. Tamb\u00e9m envolveremos este componente dentro de um componente chamado <code>MediaUploadCheck<\/code>(package <code>wp.blockEditor<\/code>). Esse componente garante que o usu\u00e1rio atual tenha recursos para usar a Biblioteca de m\u00eddia, portanto, \u00e9 uma boa pr\u00e1tica us\u00e1-lo.<\/p>\n<p>O <code>MediaUpload<\/code>componente tem uma prop necess\u00e1ria: <code>render<\/code>. A forma como este componente funciona \u00e9 que definimos uma fun\u00e7\u00e3o para o <code>render<\/code>prop onde renderizamos a sa\u00edda para a &#8220;\u00e1rea de upload de m\u00eddia&#8221;. No nosso caso vamos renderizar um <code>Button<\/code>(package <code>wp.components<\/code>). Dentro do suporte de renderiza\u00e7\u00e3o do MediaUpload, temos acesso \u00e0 <code>open<\/code>fun\u00e7\u00e3o que podemos chamar para fazer o WordPress abrir o pop-up da Biblioteca de M\u00eddia:<\/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=\"Como adicionar uma sele\u00e7\u00e3o de imagem em seu bloco personalizado WordPress Gutenberg\" ><\/a><\/p>\n<p>H\u00e1 mais alguns adere\u00e7os dispon\u00edveis para <code>MediaUpload<\/code>. Abordaremos os importantes para torn\u00e1-lo funcional neste tutorial, mas h\u00e1 mais alguns com os quais voc\u00ea pode brincar. Voc\u00ea pode pelo menos estar interessado no prop <code>allowedTypes<\/code>onde voc\u00ea pode limitar quais tipos de arquivo s\u00e3o poss\u00edveis de selecionar na Biblioteca. No nosso caso, configuramos para permitir apenas imagens.<\/p>\n<h3>Adicionando o<code>MediaUpload<\/code><\/h3>\n<p>Desestruturar os novos componentes primeiro;<\/p>\n<pre><code>const { Button } = wp.components;\nconst { MediaUpload, MediaUploadCheck } = wp.blockEditor;<\/code><\/pre>\n<p>Vamos adicionar <code>MediaUploadCheck<\/code>e <code>MediaUpload<\/code>dentro do nosso <code>div<\/code>em nosso <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=\"Como adicionar uma sele\u00e7\u00e3o de imagem em seu bloco personalizado WordPress Gutenberg\" ><\/a><\/p>\n<p>O c\u00f3digo acima desestrutura <code>open<\/code>dentro da fun\u00e7\u00e3o para <code>render<\/code>. Renderizamos um simples <code>Button<\/code>onde sua <code>onClick<\/code>propriedade executar\u00e1 a <code>open<\/code>fun\u00e7\u00e3o. Tamb\u00e9m adicionei os mesmos nomes de classe que a funcionalidade de imagem em destaque do WordPress para garantir que n\u00e3o precisamos adicionar nenhum estilo.<\/p>\n<p>Dentro do <code>Button<\/code>componente verificamos se uma imagem foi definida ou n\u00e3o (<code>attributes.mediaId<\/code>). Caso contr\u00e1rio, ecoamos o texto &#8220;Escolha uma imagem&#8221;. Devemos agora obter isso em nosso bloco.<\/p>\n<p>Ao clicar no bot\u00e3o, o pop-up Biblioteca de m\u00eddia deve aparecer. No entanto, selecionar uma imagem n\u00e3o funciona no momento, porque estamos perdendo os adere\u00e7os <code>onSelect<\/code>e em. Vamos corrigir isso agora. Definimos para o ID de m\u00eddia selecionado e configuramos para executar uma fun\u00e7\u00e3o que definiremos mais tarde dentro de nosso 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>Vamos definir a <code>onSelectMedia<\/code>fun\u00e7\u00e3o dentro do nosso componente.<\/p>\n<h3>Manipulando a sele\u00e7\u00e3o de m\u00eddia<\/h3>\n<p><strong>Nota<\/strong>: Estou definindo minhas fun\u00e7\u00f5es como fun\u00e7\u00f5es de seta (<code>onSelectMedia =() =&gt; { }<\/code>). As fun\u00e7\u00f5es de seta s\u00e3o muito novas no ESNext e muito bacanas. A desvantagem \u00e9 que o uso de fun\u00e7\u00f5es de seta requer que voc\u00ea adicione suporte para isso em sua configura\u00e7\u00e3o do Babel. Se voc\u00ea ainda n\u00e3o fez isso, recomendo olhar sob o t\u00edtulo &#8220;Configurando o Babel&#8221; <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\">neste post<\/a>.<\/p>\n<p>Logo antes da instru\u00e7\u00e3o de retorno do componente, defino uma <code>onSelectMedia<\/code>fun\u00e7\u00e3o. Tudo o que precisamos fazer \u00e9 atualizar nossos atributos usando <code>setAttributes()<\/code>. Como par\u00e2metro para <code>onSelectMedia<\/code>obtermos um objeto de m\u00eddia. Simplesmente extra\u00edmos o que precisamos do objeto de m\u00eddia. No nosso caso, \u00e9 o ID da m\u00eddia e o URL de tamanho completo, que s\u00e3o as propriedades <code>id<\/code>e, <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>Experimente agora e agora voc\u00ea poder\u00e1 selecionar uma imagem da Biblioteca de m\u00eddia. A m\u00eddia selecionada \u00e9 salva nos atributos do bloco. No entanto, ainda n\u00e3o h\u00e1 visualiza\u00e7\u00e3o no Inspetor e, como voc\u00ea selecionou uma imagem, o bot\u00e3o para selecionar uma imagem desaparece. O painel agora est\u00e1 vazio. A pr\u00f3xima etapa \u00e9 renderizar a visualiza\u00e7\u00e3o sempre que uma imagem for selecionada, al\u00e9m de fornecer op\u00e7\u00f5es para remov\u00ea-la ou alter\u00e1-la.<\/p>\n<h2>Renderizando uma imagem de visualiza\u00e7\u00e3o<\/h2>\n<p>Dentro do <code>Button<\/code>componente que renderizamos dentro <code>MediaUpload<\/code>da <code>render<\/code>prop, ecoamos um texto &#8220;Escolha uma imagem&#8221; se uma imagem ainda n\u00e3o estiver definida. Mas precisamos adicionar algum c\u00f3digo para quando uma imagem for definida aqui; uma pr\u00e9via.<\/p>\n<p>Para nos ajudar a renderizar uma boa visualiza\u00e7\u00e3o, usamos o componente <code>ResponsiveWrapper<\/code>(package <code>wp.components<\/code>). Para <code>ResponsiveWrapper<\/code>funcionar plenamente, precisamos fornecer adere\u00e7os para a altura e a largura. Tamb\u00e9m precisamos do URL da miniatura. N\u00e3o adianta usar a URL completa (que pode ser gigantesca) para renderizar uma visualiza\u00e7\u00e3o dentro do Inspector. \u00c9 aqui que <code>withSelect<\/code>entra o prop. Dentro do componente n\u00f3s renderizamos uma simples <code>&lt;img&gt;<\/code>tag HTML.<\/p>\n<p>Primeiro desestruturamos o componente necess\u00e1rio:<\/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 voc\u00ea pode ver, acessamos o prop que o <code>withSelect<\/code>componente nos forneceu, <code>props.media<\/code>. Buscamos a largura, altura e url para o tamanho da miniatura da m\u00eddia do objeto.<\/p>\n<p>Agora voc\u00ea deve obter uma boa visualiza\u00e7\u00e3o da imagem selecionada!<\/p>\n<p>Como renderizamos a imagem de visualiza\u00e7\u00e3o dentro, <code>Button<\/code>clicar na imagem de visualiza\u00e7\u00e3o acionar\u00e1 a <code>Button<\/code>fun\u00e7\u00e3o do <code>onClick<\/code>\u2013 que \u00e9 abrir a Biblioteca de M\u00eddia. Dessa forma voc\u00ea j\u00e1 pode alterar a imagem selecionada.<\/p>\n<p>Atualmente n\u00e3o h\u00e1 como remover ou redefinir a imagem selecionada. Vamos consertar isso!<\/p>\n<h3>Adicionando uma fun\u00e7\u00e3o de remo\u00e7\u00e3o<\/h3>\n<p>Devemos, no m\u00ednimo, oferecer ao usu\u00e1rio a possibilidade de remover a imagem selecionada. A partir de agora, depois de selecionar uma imagem, voc\u00ea s\u00f3 pode alter\u00e1-la, mas n\u00e3o remov\u00ea-la.<\/p>\n<p>Faremos o mesmo que o WordPress faz para a imagem em destaque: Um novo <code>Button<\/code>abaixo da imagem de visualiza\u00e7\u00e3o (totalmente fora de seu <code>MediaUploadCheck<\/code>). Ao fornecer alguns adere\u00e7os inteligentes <code>Button<\/code>, fazemos com que pare\u00e7a um link (<code>isLink<\/code>) com a cor de texto vermelha (<code>isDestructive<\/code>). Leia a <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/button\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documenta\u00e7\u00e3o do Button<\/a> para ver o que mais \u00e9 poss\u00edvel. Envolvemos o bot\u00e3o dentro de outro <code>MediaUploadCheck<\/code>, apenas para garantir que o usu\u00e1rio tenha os recursos certos.<\/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 executamos uma nova fun\u00e7\u00e3o dentro <code>Button<\/code>do <code>onClick<\/code>nosso componente: <code>removeMedia()<\/code>. N\u00f3s o definimos em algum lugar logo antes da fun\u00e7\u00e3o de retorno do componente, como fizemos com <code>onSelectMedia<\/code>.<\/p>\n<pre><code>const removeMedia =() =&gt; {\n    props.setAttributes({\n        mediaId: 0,\n        mediaUrl: ''\n    });\n}<\/code><\/pre>\n<p>Tudo o que essa fun\u00e7\u00e3o faz \u00e9 redefinir nossos dois valores de atributo.<\/p>\n<p>Agora teremos um link bom e claro para remover a imagem:<\/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=\"Como adicionar uma sele\u00e7\u00e3o de imagem em seu bloco personalizado WordPress Gutenberg\" ><\/a><\/p>\n<p>Quando voc\u00ea clica no bot\u00e3o novo, a imagem selecionada e o pr\u00f3prio bot\u00e3o desaparecem, e o bot\u00e3o para selecionar uma imagem aparece novamente.<\/p>\n<h3>Adicionando um bot\u00e3o de substitui\u00e7\u00e3o<\/h3>\n<p>Esta etapa \u00e9 totalmente opcional. Como mencionado anteriormente, clicar na imagem de visualiza\u00e7\u00e3o da imagem abrir\u00e1 a Biblioteca de m\u00eddia e permitir\u00e1 que voc\u00ea altere a imagem. No entanto, isso pode n\u00e3o ser t\u00e3o intuitivo para todos entenderem. O WordPress adiciona um bot\u00e3o separado para alterar a imagem, apenas para deixar bem claro. N\u00f3s podemos fazer o mesmo.<\/p>\n<p>Para renderizar um bot\u00e3o de mudan\u00e7a de imagem, basicamente repetimos o c\u00f3digo que temos para selecionar a imagem: outro <code>MediaUpload<\/code>componente. Fornecemos a mesma fun\u00e7\u00e3o para <code>onSelect<\/code>, <code>allowedFileTypes<\/code>e <code>value<\/code>como antes. Dentro do <code>render<\/code>prop para <code>MediaUpload<\/code>n\u00f3s simplesmente renderizamos outro <code>Button<\/code>que abre a Media Library. Vamos colocar este bot\u00e3o antes do bot\u00e3o Remover \u2013 pois isso faz mais sentido para o usu\u00e1rio 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>Ent\u00e3o agora voc\u00ea deve obter isso:<\/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=\"Como adicionar uma sele\u00e7\u00e3o de imagem em seu bloco personalizado WordPress Gutenberg\" ><\/a><\/p>\n<h2>Usando a imagem selecionada<\/h2>\n<p>At\u00e9 agora deve estar bem claro como voc\u00ea pode usar a imagem selecionada. Voc\u00ea tem o ID da m\u00eddia e o URL da m\u00eddia armazenados nos atributos do seu bloco. No entanto, como exemplo simples, incluirei um c\u00f3digo que define a imagem selecionada como plano de fundo do bloco. O c\u00f3digo pode ser feito exatamente da mesma forma nas fun\u00e7\u00f5es the <code>edit<\/code>e the <code>save<\/code>. Simplesmente criamos um objeto de estilo que aplicamos na div de encapsulamento do bloco. No objeto de estilo, definimos a imagem de fundo para o URL da m\u00eddia.<\/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>Com o resto do seu conte\u00fado de bloco personalizado, poderia facilmente ser algo assim:<\/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=\"Como adicionar uma sele\u00e7\u00e3o de imagem em seu bloco personalizado WordPress Gutenberg\" ><\/a><\/p>\n<p>Se voc\u00ea aplicar o estilo de bloco em <code>edit<\/code>e <code>save<\/code>, seu bloco agora deve obter a m\u00eddia selecionada como plano de fundo. Tanto dentro do editor quanto no frontend.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>Selecionar uma imagem (ou arquivo) da Biblioteca de M\u00eddia \u00e9 uma fun\u00e7\u00e3o que voc\u00ea, como desenvolvedor do Gutenberg, sem d\u00favida precisar\u00e1 para seus blocos. Aprendemos como adicionar uma fun\u00e7\u00e3o para selecionar uma imagem da Biblioteca de m\u00eddia em nosso bloco Gutenberg personalizado. Fizemos da mesma forma que o pr\u00f3prio WordPress faz para a imagem em destaque. (Editar maio de 2020: o WordPress agora atualizou a imagem em destaque para usar <code>useSelect<\/code>o gancho React). Isso garante que nosso c\u00f3digo n\u00e3o seja &quot;hackeado&quot; com um alto risco de quebrar em atualiza\u00e7\u00f5es futuras.<\/p>\n<p>Deixe-me saber se voc\u00ea j\u00e1 usou isso!<\/p>\n<h2>C\u00f3digo completo<\/h2>\n<p>Abaixo est\u00e1 o c\u00f3digo completo de um bloco personalizado que apresenta a funcionalidade de m\u00eddia selecionada. E nada mais realmente. Essa parte \u00e9 com voc\u00ea!<\/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\">Fonte de grava\u00e7\u00e3o:  <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 como adicionar um bot\u00e3o de sele\u00e7\u00e3o ou upload de imagem para a Biblioteca de m\u00eddia dentro do Inspector para o seu bloco WordPress Gutenberg 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":[898,898,837,941,941,733,733,1110,806,806,816,816,837,846,846,867,867],"tags":[1170],"class_list":{"0":"post-233414","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-codigo-2","9":"category-guia-para-iniciantes","10":"category-gutenberg-8","12":"category-javascript-8","14":"category-n-a","15":"category-php-8","17":"category-plug-ins","20":"category-tutoriais","22":"category-wordpress-8","24":"tag-affiai-pt-pt"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233414","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=233414"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233414\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/153622"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=233414"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=233414"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=233414"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}