{"id":44791,"date":"2021-10-21T13:55:41","date_gmt":"2021-10-21T11:55:41","guid":{"rendered":"https:\/\/kinsta.com\/?p=105115"},"modified":"2025-02-07T10:55:40","modified_gmt":"2025-02-07T13:55:40","slug":"blocos-personalizados-gutenberg","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/","title":{"rendered":"Construindo Blocos Personalizados no Gutenberg : O Tutorial Definitivo Sobre o Desenvolvimento de Blocos"},"content":{"rendered":"<p>Muitas pessoas reclamam sobre os obst\u00e1culos para come\u00e7ar a construir blocos e aplicativos Gutenberg. A curva de aprendizado \u00e9 \u00edngreme, principalmente devido \u00e0 dificuldade de instalar e configurar o ambiente de desenvolvimento. Al\u00e9m disso, um s\u00f3lido conhecimento de JavaScript, Node.js, React e Redux s\u00e3o ingredientes indispens\u00e1veis para esta receita bastante complexa.<\/p>\n<p>O <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">Manual Oficial do Editor de Blocos do WordPress<\/a> fornece aos desenvolvedores uma tremenda quantidade de informa\u00e7\u00f5es, mas voc\u00ea pode se ver perdido naquele mar de detalhes.<\/p>\n<p>E vale a pena mencionar o que Mat\u00edas Ventura, arquiteto l\u00edder do projeto Gutenberg, relatou em <a href=\"https:\/\/wptavern.com\/a-discussion-with-gutenberg-project-lead-matias-ventura-on-the-barrier-to-entry\">sua entrevista com a WP Tavern<\/a>:<\/p>\n<blockquote><p><em>Enquanto h\u00e1 pessoas que podem aprender rapidamente, ainda \u00e9 uma grande barreira para as pessoas. Eu acho que h\u00e1 v\u00e1rias camadas para isso; a documenta\u00e7\u00e3o poderia ser uma ordem de magnitude melhor tanto na organiza\u00e7\u00e3o quanto na apresenta\u00e7\u00e3o. Eu espero que possamos fazer muito mais l\u00e1.<\/em><\/p><\/blockquote>\n<p>Com isso em mente, n\u00f3s decidimos fornecer um tutorial passo a passo com o objetivo de ajudar nossos leitores a come\u00e7ar com o desenvolvimento de blocos Gutenberg.<\/p>\n<p>Parece interessante? Vamos mergulhar!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Pr\u00e9-requisitos para o desenvolvimento de blocos Gutenberg<\/h2>\n<p>Para este tutorial, as \u00fanicas habilidades necess\u00e1rias ser\u00e3o um bom conhecimento do desenvolvimento de plugins WordPress e pelo menos um <a href=\"https:\/\/kinsta.com\/pt\/blog\/melhores-praticas-html\/\">entendimento b\u00e1sico de HTML<\/a>, CSS, JavaScript e React.<\/p>\n<p>Ser\u00e1 que este ser\u00e1 um projeto ambicioso? Voc\u00ea pode apostar que sim!<\/p>\n<p>N\u00e3o foi f\u00e1cil encontrar o compromisso certo entre completude e simplicidade ou decidir quais t\u00f3picos incluir e quais deixar de fora.<\/p>\n<p>Esperamos que os leitores intermedi\u00e1rios e avan\u00e7ados nos perdoem por n\u00e3o nos aprofundarmos em certos conceitos, tais como <a href=\"https:\/\/reactjs.org\/docs\/state-and-lifecycle.html\">React state<\/a>, <a href=\"https:\/\/redux.js.org\/api\/store\" target=\"_blank\" rel=\"noopener noreferrer\">Redux store<\/a>, <a href=\"https:\/\/reactjs.org\/docs\/higher-order-components.html\">componentes de alta ordem<\/a>, e assim por diante. Estes t\u00f3picos requerem espa\u00e7o e aten\u00e7\u00e3o adicionais e provavelmente s\u00e3o muito avan\u00e7ados para iniciar o desenvolvimento em bloco (a menos que voc\u00ea seja um desenvolvedor React).<\/p>\n<p>Pela mesma raz\u00e3o, n\u00e3o vamos cobrir alguns dos t\u00f3picos mais avan\u00e7ados relacionados ao desenvolvimento de blocos Gutenberg, tais como <a href=\"https:\/\/kinsta.com\/pt\/blog\/blocos-dinamicos-gutenberg\/\">blocos din\u00e2micos<\/a> e <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/metabox\/\" target=\"_blank\" rel=\"noopener noreferrer\">meta boxes<\/a>.<\/p>\n<p>Com o conhecimento que voc\u00ea ganhar\u00e1 ao final deste artigo, voc\u00ea poder\u00e1 come\u00e7ar a se divertir e ser produtivo imediatamente.<\/p>\n<p>Uma vez que voc\u00ea come\u00e7ar a construir blocos, voc\u00ea estar\u00e1 pronto para melhorar ainda mais suas habilidades e construir blocos Gutenberg ainda mais avan\u00e7ados por conta pr\u00f3pria.<\/p>\n\n<h2>O que \u00e9 um bloco Gutenberg?<\/h2>\n<p>Desde que foi lan\u00e7ado pela primeira vez em dezembro de 2018, o <a href=\"https:\/\/kinsta.com\/pt\/blog\/editor-gutenberg-wordpress\/\">editor de blocos<\/a> foi muito melhorado em todos os aspectos: <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/\">APIs mais poderosas<\/a>, uma interface de usu\u00e1rio mais avan\u00e7ada, melhor usabilidade, uma tonelada de novos blocos, as <a href=\"https:\/\/kinsta.com\/pt\/blog\/wordpress-5-8\/#full-site-editing-features-in-wordpress-58\">primeiras implementa\u00e7\u00f5es do Full site editing (Edi\u00e7\u00e3o completa do site)<\/a>, e muito mais.<\/p>\n<p>Em resumo, mesmo que o Gutenberg ainda esteja em um desenvolvimento pesado, ele percorreu um longo caminho &#8211; e hoje, o editor de blocos \u00e9 um candidato de pleno direito como um construtor confi\u00e1vel e funcional de p\u00e1ginas e sites.<\/p>\n<p>Do ponto de vista de um desenvolvedor, Gutenberg \u00e9 um <a href=\"https:\/\/en.wikipedia.org\/wiki\/Single-page_application\">aplicativo de p\u00e1gina \u00fanica<\/a> (SPA) baseado em rea\u00e7\u00f5es que permite aos usu\u00e1rios do WordPress criar, editar e excluir conte\u00fado no WordPress. Entretanto, isto n\u00e3o deve fazer voc\u00ea pensar em uma vers\u00e3o melhorada do <a href=\"https:\/\/kinsta.com\/blog\/wordpress-tinymce-editor\/\">editor de conte\u00fado tradicional<\/a>.<\/p>\n<p>N\u00f3s queremos deixar isso claro:<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-plain\">\n        <p><strong>Gutenberg <em>n\u00e3o<\/em> \u00e9 um editor WYSIWYG regular. Ao inv\u00e9s disso, ele redefine toda a experi\u00eancia de edi\u00e7\u00e3o no WordPress.<\/strong><\/p>\n<\/aside>\n\n<p>No Gutenberg, o conte\u00fado \u00e9 dividido em blocos, que s\u00e3o &#8220;bricks&#8221; que os usu\u00e1rios podem usar para criar artigos e p\u00e1ginas ou sites inteiros.<\/p>\n<p>Mas o que tecnicamente \u00e9 um bloco?<\/p>\n<p>N\u00f3s gostamos da <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-blocks\/\">defini\u00e7\u00e3o do WordPress<\/a>:<\/p>\n<blockquote><p><em>&#8220;Bloco&#8221; \u00e9 o termo abstrato usado para descrever unidades de marca\u00e7\u00e3o que, compostas juntas, formam o conte\u00fado ou layout de uma p\u00e1gina da web. A id\u00e9ia combina conceitos do que no WordPress de hoje n\u00f3s conseguimos com atalhos, HTML personalizado e incorpora\u00e7\u00e3o da descoberta em uma \u00fanica API consistente e experi\u00eancia do usu\u00e1rio.<\/em><\/p><\/blockquote>\n<p>T\u00edtulos, par\u00e1grafos, colunas, imagens, galerias e todos os elementos que comp\u00f5em a interface do editor, desde pain\u00e9is de barra lateral at\u00e9 controles de barra de ferramentas de bloqueio, s\u00e3o componentes React.<\/p>\n<p>Ent\u00e3o, o que s\u00e3o componentes React? W3Schools fornece a <a href=\"https:\/\/www.w3schools.com\/react\/react_components.asp\">seguinte defini\u00e7\u00e3o<\/a>:<\/p>\n<blockquote><p><em>Os componentes s\u00e3o bits de c\u00f3digo independentes e reutiliz\u00e1veis. Eles servem ao mesmo prop\u00f3sito que as fun\u00e7\u00f5es JavaScript, mas funcionam isoladamente e retornam o HTML atrav\u00e9s de uma fun\u00e7\u00e3o <code>render()<\/code>.<\/em><\/p><\/blockquote>\n<figure id=\"attachment_105117\" aria-describedby=\"caption-attachment-105117\" style=\"width: 2874px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-105117\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/working-with-blocks.jpg\" alt=\"Trabalhando com blocos Gutenberg no WordPress 5.8.\" width=\"2874\" height=\"1344\"><figcaption id=\"caption-attachment-105117\" class=\"wp-caption-text\">Trabalhando com blocos Gutenberg no WordPress 5.8.<\/figcaption><\/figure>\n<p>Enquanto que a experi\u00eancia de edi\u00e7\u00e3o fornecida pelo Gutenberg \u00e9 nova em compara\u00e7\u00e3o com o editor WordPress cl\u00e1ssico, a maneira como o WordPress armazena suas pe\u00e7as de conte\u00fado no banco de dados n\u00e3o muda em nada. Isso porque o Gutenberg \u00e9 um aplicativo que funciona dentro do WordPress, mas n\u00e3o muda a maneira como o CMS funciona em sua ess\u00eancia.<\/p>\n<p>Os artigos (isto inclui artigos, p\u00e1ginas e tipos de artigos personalizados) criados com o Gutenberg ainda s\u00e3o armazenados na tabela <code>wp_posts<\/code>, exatamente como com o editor cl\u00e1ssico.<\/p>\n<p>Mas em um artigo criado com o Gutenberg, voc\u00ea encontrar\u00e1 peda\u00e7os adicionais de informa\u00e7\u00e3o na tabela que representam uma diferen\u00e7a fundamental entre artigos criados atrav\u00e9s do Editor Cl\u00e1ssico vs. Gutenberg. Essas informa\u00e7\u00f5es se parecem com coment\u00e1rios HTML, e elas t\u00eam uma fun\u00e7\u00e3o espec\u00edfica: delimitar blocos:<\/p>\n<figure id=\"attachment_105118\" aria-describedby=\"caption-attachment-105118\" style=\"width: 1522px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105118 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/code-editor-view.jpg\" alt=\"Um post no blog na visualiza\u00e7\u00e3o do editor de c\u00f3digo.\" width=\"1522\" height=\"1054\"><figcaption id=\"caption-attachment-105118\" class=\"wp-caption-text\">Um artigo no blog na visualiza\u00e7\u00e3o do editor de c\u00f3digo.<\/figcaption><\/figure>\n<p><strong>Os delimitadores<\/strong> de blocos dizem ao WordPress qual bloco deve ser apresentado na tela. Eles tamb\u00e9m fornecem valores para as propriedades do bloco em um objeto JSON. Esses adere\u00e7os ditam a forma como o bloco deve ser renderizado na tela:<\/p>\n<figure id=\"attachment_105119\" aria-describedby=\"caption-attachment-105119\" style=\"width: 1630px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-105119\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/post-content.jpg\" alt=\"Um artigo do blog armazenado na tabela wp_posts\" width=\"1630\" height=\"1036\"><figcaption id=\"caption-attachment-105119\" class=\"wp-caption-text\">Um artigo do blog armazenado na tabela <code>wp_posts<\/code>.<\/figcaption><\/figure>\n<h2>Configurando seu ambiente de desenvolvimento WordPress<\/h2>\n<p>A cria\u00e7\u00e3o de um ambiente moderno de desenvolvimento JavaScript requer um s\u00f3lido conhecimento de tecnologias avan\u00e7adas como <a href=\"https:\/\/webpack.js.org\/\">Webpack<\/a>, <a href=\"https:\/\/reactjs.org\/\">React<\/a> e <a href=\"https:\/\/facebook.github.io\/jsx\/\">JSX<\/a>, <a href=\"https:\/\/babeljs.io\/docs\/en\/index.html\">Babel<\/a>, <a href=\"https:\/\/eslint.org\/\">ESLint<\/a>, etc.<\/p>\n<p>Intimidado? N\u00e3o fique! A comunidade WordPress j\u00e1 chegou ao socorro, fornecendo ferramentas poderosas que permitem evitar um processo de configura\u00e7\u00e3o manual bagun\u00e7ado.<\/p>\n<p>Para manter as coisas simples, n\u00e3o iremos cobrir a <a href=\"https:\/\/kinsta.com\/pt\/blog\/transpilacao-php\/\">transpila\u00e7\u00e3o<\/a> neste artigo (que, no entanto, recomendamos que voc\u00ea se familiarize uma vez que voc\u00ea tenha aprendido as bases do desenvolvimento de blocos). Ao inv\u00e9s disso, vamos introduzir duas ferramentas alternativas que voc\u00ea pode usar para configurar r\u00e1pidamente e facilmente um ambiente de desenvolvimento moderno em JavaScript em poucos minutos. Cabe a voc\u00ea escolher aquele que voc\u00ea achar mais conveniente para o seu projeto.<\/p>\n<p>A cria\u00e7\u00e3o de um ambiente de desenvolvimento JavaScript para construir blocos Gutenberg \u00e9 um processo de tr\u00eas etapas:<\/p>\n<ol>\n<li><a href=\"#node-npm\">Instale o Node.js e npm<\/a><\/li>\n<li><a href=\"#dev-environment\">Configure o ambiente de desenvolvimento<\/a><\/li>\n<li><a href=\"#block-plugin\">Configure o plugin do bloco<\/a><\/li>\n<\/ol>\n<p>Vamos come\u00e7ar.<\/p>\n<h3 id=\"node-npm\">1. Instale Node.js e npm<\/h3>\n<p>Antes de instalar seu ambiente de desenvolvimento e registrar seu primeiro bloco, voc\u00ea precisar\u00e1 instalar <a href=\"https:\/\/kinsta.com\/it\/knowledgebase\/node-js\/\">o Node.js<\/a> e o gerenciador de pacotes do Node (npm).<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p><a href=\"https:\/\/nodejs.org\/en\/\">Node.js<\/a> \u00e9 um JavaScript runtime constru\u00eddo sobre o motor JavaScript V8 do Chrome. <a href=\"https:\/\/www.npmjs.com\/\">npm<\/a>, comumente conhecido como o gerenciador de pacotes Node, \u00e9 considerado &#8220;o maior registro de software do mundo&#8221;.<\/p>\n<\/aside>\n\n<p>Voc\u00ea pode <a href=\"https:\/\/kinsta.com\/pt\/blog\/como-instalar-o-node-js\/\">instalar o Node.js e npm<\/a> de <a href=\"https:\/\/docs.npmjs.com\/downloading-and-installing-node-js-and-npm\">v\u00e1rias maneiras diferentes<\/a>. Mas primeiro, voc\u00ea pode querer verificar se o software j\u00e1 est\u00e1 instalado em sua m\u00e1quina.<\/p>\n<p>Para fazer isso, abra o terminal e execute o seguinte comando:<\/p>\n<pre><code class=\"language-bash\">node -v<\/code><\/pre>\n<p>Se o resultado for <code>command not found<\/code>, ent\u00e3o o Node.js n\u00e3o est\u00e1 instalado em seu computador, e voc\u00ea pode prosseguir com a instala\u00e7\u00e3o.<\/p>\n<p>Para este artigo, n\u00f3s escolhemos a op\u00e7\u00e3o de instala\u00e7\u00e3o mais f\u00e1cil, que \u00e9 o <a href=\"https:\/\/nodejs.org\/en\/download\/\">Node Installer<\/a>. Tudo o que voc\u00ea precisa fazer \u00e9 baixar a vers\u00e3o correspondente do seu sistema operacional e iniciar o assistente de instala\u00e7\u00e3o:<\/p>\n<figure id=\"attachment_105120\" aria-describedby=\"caption-attachment-105120\" style=\"width: 1974px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-105120\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/nodejs-downloads.jpg\" alt=\"P\u00e1gina de downloads do Node.js\" width=\"1974\" height=\"1550\"><figcaption id=\"caption-attachment-105120\" class=\"wp-caption-text\">P\u00e1gina de downloads do Node.js<\/figcaption><\/figure>\n<p>Uma vez instalado o Node.js, execute novamente o comando <code>node -v<\/code> em seu terminal. Voc\u00ea tamb\u00e9m pode executar o comando <code>npm -v<\/code> para confirmar que voc\u00ea tem o pacote npm dispon\u00edvel. Agora voc\u00ea est\u00e1 equipado com as seguintes ferramentas:<\/p>\n<ul>\n<li>O gerenciador de pacotes <code>npx<\/code> do Node.js. Isto permite que voc\u00ea execute um comando <code>npm<\/code> sem instal\u00e1-lo primeiro.<\/li>\n<li>O gerenciador de pacotes <code>npm<\/code> do Node.js (<a href=\"https:\/\/docs.npmjs.com\/\">veja a documenta\u00e7\u00e3o<\/a>). Isto \u00e9 usado para instalar depend\u00eancias e rodar scripts.<\/li>\n<\/ul>\n<p>O pr\u00f3ximo passo \u00e9 a instala\u00e7\u00e3o do ambiente de desenvolvimento.<\/p>\n<h3 id=\"dev-environment\">2. Configure o ambiente de desenvolvimento<\/h3>\n<p>Assim que voc\u00ea tiver as \u00faltimas vers\u00f5es do Node.js e npm em sua m\u00e1quina local, voc\u00ea precisar\u00e1 de um ambiente de desenvolvimento para WordPress.<\/p>\n<p>Voc\u00ea pode usar um ambiente de desenvolvimento local como o DevKinsta ou usar a ferramenta oficial do WordPress. Vamos dar uma olhada em ambas as op\u00e7\u00f5es.<\/p>\n<h4 id=\"devkinsta\">Op\u00e7\u00e3o 1: Ambiente de desenvolvimento Local (DevKinsta)<\/h4>\n<p>Com apenas alguns cliques, voc\u00ea pode <a href=\"https:\/\/kinsta.com\/pt\/ebooks\/wordpress\/wordpress-desenvolvimento-local\/\">instalar o WordPress localmente<\/a> usando <a href=\"https:\/\/kinsta.com\/pt\/devkinsta\/\">DevKinsta<\/a>, nossa moderna ferramenta de desenvolvimento WordPress local. Ou voc\u00ea pode optar por uma ferramenta de desenvolvimento local diferente, como <a href=\"https:\/\/kinsta.com\/pt\/blog\/instalar-wordpress-localmente\/#how-to-install-wordpress-locally-on-mac-using-mamp\">MAMP<\/a> ou <a href=\"https:\/\/kinsta.com\/pt\/blog\/instalar-wordpress-localmente\/#how-to-install-wordpress-locally-using-xampp\">XAMPP<\/a>:<\/p>\n<figure id=\"attachment_105122\" aria-describedby=\"caption-attachment-105122\" style=\"width: 2502px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-105122\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/dev-kinsta-create-new-site.jpg\" alt=\"Crie um novo site WordPress no DevKinsta\" width=\"2502\" height=\"1252\"><figcaption id=\"caption-attachment-105122\" class=\"wp-caption-text\">Crie um novo site WordPress no DevKinsta<\/figcaption><\/figure>\n<h4 id=\"wp-env\">Op\u00e7\u00e3o 2: wp-env<\/h4>\n<p>Voc\u00ea tamb\u00e9m pode optar pela <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env\">ferramenta<code>wp-env<\/code><\/a> oficial , que fornece um ambiente WordPress dev local que voc\u00ea pode lan\u00e7ar diretamente da linha de comando. Noah Alen <a href=\"https:\/\/make.wordpress.org\/core\/2020\/03\/03\/wp-env-simple-local-environments-for-wordpress\/\">o define da seguinte forma<\/a>:<\/p>\n<blockquote><p><em>Os ambientes locais de WordPress agora s\u00e3o t\u00e3o simples quanto rodar um \u00fanico comando. <code>wp-env<\/code> \u00e9 uma ferramenta de configura\u00e7\u00e3o zero para ambientes locais de WordPress sem dor de cabe\u00e7a. Ele fornece decis\u00f5es sobre op\u00e7\u00f5es para que os usu\u00e1rios possam rapidamente rodar o WordPress sem perda de tempo. De fato, o objetivo \u00e9 tornar estes ambientes facilmente acess\u00edveis a todos &#8211; seja voc\u00ea um desenvolvedor, designer, gerente ou qualquer outra pessoa.<\/em><\/p><\/blockquote>\n<p>Se voc\u00ea decidir tentar, a instala\u00e7\u00e3o do <code>wp-env<\/code> requer um esfor\u00e7o m\u00ednimo. Basta seguir estes passos:<\/p>\n<h5>Passo 1: Confirme a instala\u00e7\u00e3o do Docker e do Node.js<\/h5>\n<p>Para atender aos requisitos t\u00e9cnicos, voc\u00ea precisar\u00e1 primeiro ter o <a href=\"https:\/\/www.docker.com\/\">Docker<\/a> e o Node.js instalados no seu computador. Isso porque <code>wp-env<\/code> cria uma inst\u00e2ncia do Docker rodando um site WordPress. Quaisquer mudan\u00e7as feitas no c\u00f3digo s\u00e3o imediatamente refletidas na inst\u00e2ncia do WordPress.<\/p>\n<h5>Passo 2: Instale <code>@wordpress\/env<\/code> a partir da Linha de Comando<\/h5>\n<p>Com o Docker e o Node.js rodando em seu computador, voc\u00ea pode seguir em frente e instalar o <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/#wordpress-development-site\">ambiente de desenvolvimento<\/a> do WordPress. Voc\u00ea pode instalar <code>wp-env<\/code> tanto global quanto localmente. Para faz\u00ea-lo globalmente, voc\u00ea precisar\u00e1 executar o seguinte comando de dentro do diret\u00f3rio de plugins (mais sobre isso na caixa de aviso &#8220;Importante&#8221; abaixo):<\/p>\n<pre><code class=\"language-bash\">npm install -g @wordpress\/env<\/code><\/pre>\n<p>Vamos analisar isso:<\/p>\n<ul>\n<li><code>npm install<\/code> <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/commands\/npm-install\">instala o pacote<\/a>.<\/li>\n<li><code>-g<\/code> anexado ao comando <a href=\"https:\/\/docs.npmjs.com\/downloading-and-installing-packages-globally\">instala o pacote especificado globalmente<\/a>.<\/li>\n<li><code>@wordpress\/env<\/code> \u00e9 o <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env\">pacote que voc\u00ea vai instalar<\/a>.<\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Por padr\u00e3o, no Mac ou Linux os pacotes do Node s\u00e3o instalados em <strong>\/usr\/local\/lib\/node_modules<\/strong>.<\/p>\n<p>Se o usu\u00e1rio atual n\u00e3o tiver privil\u00e9gios de edi\u00e7\u00e3o sobre esse diret\u00f3rio, ser\u00e1 emitido um erro EACCES. Saiba mais sobre <a href=\"https:\/\/docs.npmjs.com\/resolving-eacces-permissions-errors-when-installing-packages-globally\">como resolver erros de permiss\u00f5es EACCES ao instalar pacotes globalmente<\/a>.<\/p>\n<\/aside>\n\n<p>Para confirmar que o <code>wp-env<\/code> foi instalado com sucesso, execute o seguinte comando:<\/p>\n<pre><code class=\"language-bash\">wp-env --version<\/code><\/pre>\n<p>Voc\u00ea deve ver a atual vers\u00e3o <code>wp-env<\/code>, o que significa que agora voc\u00ea pode iniciar o ambiente usando o seguinte comando <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env#user-content-usage\">da pasta do seu plugin<\/a>:<\/p>\n<pre><code class=\"language-bash\">wp-env start<\/code><\/pre>\n<p>Voc\u00ea pode acessar o painel de controle do WordPress usando o seguinte endere\u00e7o:<\/p>\n<ul>\n<li>http:\/\/localhost:8888\/wp-admin\/<\/li>\n<\/ul>\n<p>As credenciais padr\u00e3o s\u00e3o as seguintes:<\/p>\n<ul>\n<li>Nome de usu\u00e1rio: <code>admin<\/code><\/li>\n<li>Senha: <code>password<\/code><\/li>\n<\/ul>\n<h3 id=\"block-plugin\">Configure o seu plugin de bloco<\/h3>\n<p>Agora voc\u00ea precisa de um plugin de bloco de partida para construir. Mas ao inv\u00e9s de criar manualmente um plugin de bloco de desenvolvimento com todos os arquivos e pastas necess\u00e1rios, voc\u00ea pode simplesmente executar uma ferramenta de desenvolvimento fornecendo todos os arquivos e configura\u00e7\u00f5es que voc\u00ea precisa para come\u00e7ar com o desenvolvimento de blocos.<\/p>\n<p>Novamente, voc\u00ea tem um par de op\u00e7\u00f5es para escolher. Vamos dar uma olhada em cada uma delas.<\/p>\n<h4 id=\"create-block\">Op\u00e7\u00e3o 1: Configurando um plugin de bloco com @wordpress\/create-block<\/h4>\n<p><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-create-block\/\">@wordpress\/create-block<\/a> \u00e9 a ferramenta oficial de configura\u00e7\u00e3o zero para a cria\u00e7\u00e3o de blocos Gutenberg:<\/p>\n<blockquote><p><em>Create Block \u00e9 uma forma oficialmente suportada de criar blocos para registrar um bloco para um plugin WordPress. Ele oferece uma configura\u00e7\u00e3o de constru\u00e7\u00e3o moderna sem nenhuma configura\u00e7\u00e3o. Ele gera c\u00f3digo PHP, JS, CSS e tudo mais que voc\u00ea precisa para iniciar o projeto.<\/em><\/p>\n<p>Ele \u00e9 inspirado em grande parte pela <a href=\"https:\/\/create-react-app.dev\/docs\/getting-started\/\">create-react-app<\/a>. Parab\u00e9ns ao <a href=\"https:\/\/github.com\/gaearon\">@gaearon<\/a>, toda a equipe do Facebook e a comunidade React.<\/p><\/blockquote>\n<p>Uma vez que seu ambiente local esteja pronto e funcionando, voc\u00ea pode configurar um bloco inicial simplesmente executando o <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/create-block\">comando<\/a> <code>npx @wordpress\/create-block<\/code>, e ele fornecer\u00e1 todos os arquivos e pastas que voc\u00ea precisa para <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/wp-plugin\/\">criar o plugin scaffolding<\/a> e registrar um novo bloco.<\/p>\n<p>Vamos fazer um teste para ver como funciona.<\/p>\n<p>Da sua ferramenta de Linha de Comando, navegue para o diret\u00f3rio <strong>\/wp-content\/plugins\/<\/strong> e execute o seguinte comando:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block my-first-block<\/code><\/pre>\n<p>Quando for solicitado para confirmar, digite <code>y<\/code> para prosseguir:<\/p>\n<figure id=\"attachment_105124\" aria-describedby=\"caption-attachment-105124\" style=\"width: 1136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-105124\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-block-my-first-block.jpg\" alt=\"Criando um bloco com @wordpress\/create-block\" width=\"1136\" height=\"170\"><figcaption id=\"caption-attachment-105124\" class=\"wp-caption-text\">Criando um bloco com @wordpress\/create-block<\/figcaption><\/figure>\n<p>O processo leva poucos momentos. Quando estiver completo, voc\u00ea deve obter a seguinte resposta:<\/p>\n<figure id=\"attachment_105125\" aria-describedby=\"caption-attachment-105125\" style=\"width: 1134px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-105125\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/wordpress-create-block-completed.jpg\" alt=\"O plugin de bloco foi criado\" width=\"1134\" height=\"680\"><figcaption id=\"caption-attachment-105125\" class=\"wp-caption-text\">O plugin de bloco foi criado<\/figcaption><\/figure>\n<p>E \u00e9 isso a\u00ed!<\/p>\n<p>Agora lance seu ambiente de desenvolvimento WordPress e v\u00e1 para a tela <strong>Plugins<\/strong> no painel do WordPress. Um novo plugin chamado &#8220;Meu Primeiro Bloco&#8221; deveria ter sido adicionado \u00e0 sua lista de plugins:<\/p>\n<figure id=\"attachment_105126\" aria-describedby=\"caption-attachment-105126\" style=\"width: 1956px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-105126\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/my-first-block-plugin.jpg\" alt=\"O plugin de bloco foi instalado com sucesso\" width=\"1956\" height=\"1168\"><figcaption id=\"caption-attachment-105126\" class=\"wp-caption-text\">O plugin de bloco foi instalado com sucesso<\/figcaption><\/figure>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Se voc\u00ea estiver usando a ferramenta <code>wp-env<\/code> e executar <code>wp-env start<\/code> a partir do diret\u00f3rio que cont\u00e9m o plugin, ele ir\u00e1 automaticamente montar e ativar o plugin. Se voc\u00ea executar <code>wp-env start<\/code> a partir de qualquer outro diret\u00f3rio, um ambiente WordPress gen\u00e9rico ser\u00e1 criado (veja tamb\u00e9m <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/#wordpress-development-site\">WordPress Development Site<\/a>).<\/p>\n<\/aside>\n\n<p>Ative o plugin se necess\u00e1rio, crie um novo artigo no blog, des\u00e7a o inseridor de blocos at\u00e9 a se\u00e7\u00e3o <strong>Widgets<\/strong> e selecione seu novo bloco:<\/p>\n<p>\u00a0<\/p>\n<figure id=\"attachment_134071\" aria-describedby=\"caption-attachment-134071\" style=\"width: 2190px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134071 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/example-block.jpg\" alt=\"Um bloco de exemplo criado com @wordpress\/create-block\" width=\"2190\" height=\"1034\"><figcaption id=\"caption-attachment-134071\" class=\"wp-caption-text\">Um bloco de exemplo criado com @wordpress\/create-block<\/figcaption><\/figure>\n<p>Agora volte para o terminal e mude o diret\u00f3rio atual para o <strong>meu primeiro bloco<\/strong>:<\/p>\n<pre><code class=\"language-bash\">cd my-first-block<\/code><\/pre>\n<p>Ent\u00e3o execute o seguinte comando:<\/p>\n<pre><code class=\"language-bash\">npm start<\/code><\/pre>\n<p>Isto permite que voc\u00ea execute o plugin no modo de desenvolvimento. Para criar o c\u00f3digo de produ\u00e7\u00e3o, voc\u00ea deve usar o seguinte comando:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n<h4 id=\"create-guten-block\">Op\u00e7\u00e3o 2: Configurando um plugin de bloco com create-guten-block<\/h4>\n<p><a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block\"><code>create-guten-block<\/code><\/a> \u00e9 uma ferramenta de desenvolvimento de terceiros para a constru\u00e7\u00e3o de blocos Gutenberg:<\/p>\n<blockquote><p><em><code>create-guten-block<\/code> \u00e9 um dev-toolkit de configura\u00e7\u00e3o zero (#0CJS) para desenvolver blocos Gutenberg do WordPress em quest\u00e3o de minutos sem configurar React, webpack, ES6\/7\/8\/Next, ESLint, Babel, etc.<\/em><\/p><\/blockquote>\n<p>Assim como a ferramenta oficial <code>create-block<\/code>, <code>create-guten-block<\/code> \u00e9 baseado em <a href=\"https:\/\/create-react-app.dev\/docs\/getting-started\">create-react-app<\/a> e pode ajudar voc\u00ea a gerar seu primeiro plugin de bloco sem complica\u00e7\u00f5es.<\/p>\n<p>O kit de ferramentas fornece tudo o que voc\u00ea precisa para criar um plugin WordPress moderno, <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block#whats-included\">incluindo o seguinte<\/a>:<\/p>\n<blockquote>\n<ul>\n<li>React, JSX e ES6 suporte de sintaxe.<\/li>\n<li>webpack processo de desenvolvimento\/produ\u00e7\u00e3o por tr\u00e1s do cen\u00e1rio.<\/li>\n<li>Extras de linguagem al\u00e9m do ES6 como o <a href=\"https:\/\/kinsta.com\/pt\/blog\/operador-spread-javascript\/\">operador de propaga\u00e7\u00e3o<\/a> de objetos.<\/li>\n<li>CSS auto-prefixado, ent\u00e3o voc\u00ea n\u00e3o precisa de -webkit ou outros prefixos.<\/li>\n<li>Um script de constru\u00e7\u00e3o para agrupar JS, CSS e imagens para produ\u00e7\u00e3o com source-maps.<\/li>\n<li>Atualiza\u00e7\u00f5es sem complica\u00e7\u00e3o para as ferramentas acima com uma \u00fanica depend\u00eancia cgb-scripts.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Observe a seguinte advert\u00eancia:<\/p>\n<blockquote><p><em>A contrapartida \u00e9 que estas ferramentas s\u00e3o pr\u00e9-configuradas para funcionar de uma forma espec\u00edfica. Se o seu projeto precisa de mais personaliza\u00e7\u00e3o, voc\u00ea pode &#8220;<a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block#--npm-run-eject\">ejetar<\/a>&#8221; e personaliz\u00e1-lo, mas ent\u00e3o voc\u00ea precisar\u00e1 manter esta configura\u00e7\u00e3o.<br \/>\n<\/em><\/p><\/blockquote>\n<p>Uma vez que voc\u00ea tenha um site WordPress local em m\u00e3os, abra sua ferramenta de Linha de Comando, navegue para a pasta <strong>\/wp-content\/plugins<\/strong> da sua instala\u00e7\u00e3o, e execute o seguinte comando:<\/p>\n<pre><code class=\"language-bash\">npx create-guten-block my-first-block<\/code><\/pre>\n<p>Voc\u00ea ter\u00e1 que esperar um ou dois minutos enquanto a estrutura do projeto \u00e9 criada e as depend\u00eancias s\u00e3o baixadas:<\/p>\n<figure id=\"attachment_105147\" aria-describedby=\"caption-attachment-105147\" style=\"width: 1136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-105147\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-guten-block.jpg\" alt=\"Criando um bloco Gutenberg com create-guten-block\" width=\"1136\" height=\"290\"><figcaption id=\"caption-attachment-105147\" class=\"wp-caption-text\">Criando um bloco Gutenberg com create-guten-block<\/figcaption><\/figure>\n<p>Quando o processo estiver completo, voc\u00ea deve ver a seguinte tela:<\/p>\n<figure id=\"attachment_105132\" aria-describedby=\"caption-attachment-105132\" style=\"width: 1130px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-105132\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-guten-block-complete.jpg\" alt=\"Bloco Gutenberg criado com sucesso com create-guten-block\" width=\"1130\" height=\"673\"><figcaption id=\"caption-attachment-105132\" class=\"wp-caption-text\">Bloco Gutenberg criado com sucesso com create-guten-block<\/figcaption><\/figure>\n<p>Esta pr\u00f3xima imagem mostra a estrutura do projeto com o terminal rodando com o <a href=\"https:\/\/kinsta.com\/pt\/blog\/melhores-editores-texto\/#visual-studio-code\">Visual Studio Code<\/a>:<\/p>\n<figure id=\"attachment_105133\" aria-describedby=\"caption-attachment-105133\" style=\"width: 2350px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-105133\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-guten-block-plugin-in-visual-studio-code.jpg\" alt=\"O plugin de bloco no Visual Studio Code\" width=\"2350\" height=\"1484\"><figcaption id=\"caption-attachment-105133\" class=\"wp-caption-text\">O plugin de bloco no Visual Studio Code<\/figcaption><\/figure>\n<p>Agora volte para o seu painel do WordPress. Um novo item deve ser listado na tela Plugins &#8211; que \u00e9 o plugin <strong>my-first-block<\/strong>:<\/p>\n<figure id=\"attachment_105134\" aria-describedby=\"caption-attachment-105134\" style=\"width: 2136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-105134\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/plugins-screen.jpg\" alt=\"A tela de Plugins com um novo plugin criado com create-guten-block\" width=\"2136\" height=\"1155\"><figcaption id=\"caption-attachment-105134\" class=\"wp-caption-text\">A tela de Plugins com um novo plugin criado com create-guten-block<\/figcaption><\/figure>\n<p>Ative o plugin e volte para o terminal. Mude o diret\u00f3rio atual para <strong>my-first-block<\/strong>, ent\u00e3o execute <code>npm start<\/code>:<\/p>\n<pre><code class=\"language-bash\">cd my-first-block\nnpm start<\/code><\/pre>\n<p>Voc\u00ea deve obter a seguinte resposta:<\/p>\n<figure id=\"attachment_105128\" aria-describedby=\"caption-attachment-105128\" style=\"width: 1129px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-105128\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/npm-started.jpg\" alt=\"npm come\u00e7ou.\" width=\"1129\" height=\"390\"><figcaption id=\"caption-attachment-105128\" class=\"wp-caption-text\">npm come\u00e7ou.<\/figcaption><\/figure>\n<p>Novamente, isto permite que voc\u00ea execute o plugin no modo de desenvolvimento. Para criar o c\u00f3digo de produ\u00e7\u00e3o, voc\u00ea deve usar:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n<p>Ative o plugin e crie um novo artigo ou p\u00e1gina, depois navegue pelos seus blocos e selecione o seu novo bloco Gutenberg:<\/p>\n<figure id=\"attachment_105136\" aria-describedby=\"caption-attachment-105136\" style=\"width: 2458px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-105136\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/first-block-created-with-create-guten-block.jpg\" alt=\"Um novo bloco criado com create-guten-block\" width=\"2458\" height=\"1220\"><figcaption id=\"caption-attachment-105136\" class=\"wp-caption-text\">Um novo bloco criado com create-guten-block<\/figcaption><\/figure>\n<p>Para uma vis\u00e3o mais aprofundada ou em caso de erros, consulte a <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block\">documenta\u00e7\u00e3o fornecida por Ahmad Awais<\/a>.<\/p>\n<h2>Uma Introdu\u00e7\u00e3o r\u00e1pida do bloco scaffolding<\/h2>\n<p>Qualquer uma das duas ferramentas de desenvolvimento &#8211; <code>create-block<\/code> ou <code>create-guten-block<\/code> &#8211; que voc\u00ea optar, voc\u00ea agora tem bloco scaffolding que voc\u00ea pode usar como ponto de partida para construir um plugin de bloco. Mas o que \u00e9 exatamente um <a href=\"https:\/\/make.wordpress.org\/core\/2020\/02\/28\/new-wordpress-create-block-package-for-block-scaffolding\/\">bloco scaffolding<\/a>?<\/p>\n<blockquote><p><em>Bloco scaffolding \u00e9 um termo curto que descreve a estrutura de diret\u00f3rio de suporte que voc\u00ea precisa para que o WordPress reconhe\u00e7a um bloco. Tipicamente esse diret\u00f3rio inclui arquivos como <strong>index.php<\/strong>, <strong>index.js<\/strong>, <strong>style.css<\/strong> e outros &#8211; que, por sua vez, seguram chamadas como <code>register_block_type<\/code>.<\/em><\/p><\/blockquote>\n<p>N\u00f3s optamos pela ferramenta oficial <strong>Create Block<\/strong> dev-tool, como <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/\">\u00e9 usada no Manual do Editor de Blocos<\/a>. Mas mesmo que voc\u00ea decida ir com uma ferramenta de terceiros como <code>create-guten-block<\/code>, sua experi\u00eancia n\u00e3o ser\u00e1 muito diferente.<\/p>\n<p>Com isso dito, vamos ver detalhadamente a\u00a0 <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">ferramenta<code>create-block<\/code><\/a>.<\/p>\n<h3>Uma vis\u00e3o detalhada do Bloco Dev-Tool Create<\/h3>\n<p>Como mencionamos acima, <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/create-block\" target=\"_blank\" rel=\"noopener noreferrer\">Create Block<\/a> \u00e9 a ferramenta oficial da linha de comando para criar blocos do Gutenberg. Executando <code>@wordpress\/create-block<\/code> em seu terminal, voc\u00ea gera os arquivos PHP, JS e SCSS e o c\u00f3digo necess\u00e1rio para registrar um novo tipo de bloco:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block [options] [slug]<\/code><\/pre>\n<ul>\n<li><code>[slug]<\/code> (opcional) &#8211; usado para atribuir a slug do bloco e instalar o plugin<\/li>\n<li><code>[options]<\/code> (opcional) &#8211; op\u00e7\u00f5es dispon\u00edveis<\/li>\n<\/ul>\n<p>Por padr\u00e3o, um modelo <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/esnext-js\/\">ESNext<\/a> \u00e9 atribu\u00eddo. Isto significa que voc\u00ea receber\u00e1 a <a href=\"https:\/\/www.freecodecamp.org\/news\/es5-to-esnext-heres-every-feature-added-to-javascript-since-2015-d0c255e13c6e\/\">pr\u00f3xima vers\u00e3o do JavaScript<\/a>, com a adi\u00e7\u00e3o da <a href=\"https:\/\/kinsta.com\/pt\/blog\/sintaxe-jsx\/\">sintaxe JSX<\/a>.<\/p>\n<p>Se voc\u00ea omitir o nome do bloco, o comando \u00e9 executado em modo interativo, permitindo que voc\u00ea personalize v\u00e1rias op\u00e7\u00f5es antes de gerar os arquivos:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block<\/code><\/pre>\n<figure id=\"attachment_133845\" aria-describedby=\"caption-attachment-133845\" style=\"width: 1684px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133845 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/create-block-interactive-mode-1.jpg\" alt=\"Executando Create Block em modo interativo\" width=\"1684\" height=\"1005\"><figcaption id=\"caption-attachment-133845\" class=\"wp-caption-text\">Executando Create Block em modo interativo<\/figcaption><\/figure>\n<p>A imagem abaixo mostra a estrutura de arquivo de um plugin de bloco criado com a ferramenta oficial Create Block:<\/p>\n<figure id=\"attachment_133848\" aria-describedby=\"caption-attachment-133848\" style=\"width: 1404px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133848 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-structure.jpg\" alt=\"Arquivos e pastas de um plugin de bloco criado com @wordpress\/create-block\" width=\"1404\" height=\"960\"><figcaption id=\"caption-attachment-133848\" class=\"wp-caption-text\">Arquivos e pastas de um plugin de bloco criado com @wordpress\/create-block<\/figcaption><\/figure>\n<p>Com isso dito, vamos ver os principais arquivos e pastas do nosso novo plugin de blocos.<\/p>\n<h3 id=\"plugin-file\">O arquivo do Plugin<\/h3>\n<p>Com o arquivo principal do plugin voc\u00ea <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#php-server-side\">registra o bloco no servidor<\/a>:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\/**\n * Plugin Name:       Kinsta Academy Block\n * Plugin URI:        https:\/\/kinsta.com\/\n * Description:       An example block for Kinsta Academy students\n * Requires at least: 5.9\n * Requires PHP:      7.0\n * Version:           0.1.0\n * Author:            Kinsta Students\n * License:           GPL-2.0-or-later\n * License URI:       https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\n * Text Domain:       ka-example-block\n *\n * @package           ka-example-block\n *\/\n\n\/**\n * Registers the block using the metadata loaded from the `block.json` file.\n * Behind the scenes, it registers also all assets so they can be enqueued\n * through the block editor in the corresponding context.\n *\n * @see https:\/\/developer.wordpress.org\/reference\/functions\/register_block_type\/\n *\/\nfunction ka_example_block_ka_example_block_block_init() {\n\tregister_block_type( __DIR__ . '\/build' );\n}\nadd_action( 'init', 'ka_example_block_ka_example_block_block_init' );<\/code><\/pre>\n<p>A fun\u00e7\u00e3o <code>register_block_type<\/code> <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_block_type\/\">registra um tipo de bloco no servidor<\/a> usando os metadados armazenados no arquivo <strong>block.json.<\/strong><\/p>\n<p>A fun\u00e7\u00e3o leva dois par\u00e2metros:<\/p>\n<ul>\n<li>O nome do tipo de bloco incluindo o namespace, ou um caminho para a pasta onde o arquivo <strong>block.json<\/strong> est\u00e1 localizado, ou um objeto <code>WP_Block_Type<\/code> completo<\/li>\n<li>Um conjunto de argumentos do tipo bloco<\/li>\n<\/ul>\n<p>No c\u00f3digo acima, a <a href=\"https:\/\/www.php.net\/manual\/en\/language.constants.magic.php\">constante m\u00e1gica <code>__DIR__<\/code><\/a> retorna a pasta atual. Isso significa que o arquivo <strong>block.json<\/strong> reside na subpasta <em>\/build<\/em>.<\/p>\n<h3 id=\"package-json\">O arquivo package.json<\/h3>\n<p>O <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json\">arquivo package.json<\/a> define as propriedades e scripts JavaScript para o seu projeto. Aqui \u00e9 onde voc\u00ea pode instalar as depend\u00eancias do seu projeto.<\/p>\n<p>Para entender melhor para que serve este arquivo, abra-o com seu <a href=\"https:\/\/kinsta.com\/pt\/blog\/editores-html-gratuitos\/\">editor de c\u00f3digo favorito<\/a>:<\/p>\n<pre><code class=\"language-json\">{\n\t\"name\": \"ka-example-block\",\n\t\"version\": \"0.1.0\",\n\t\"description\": \"An example block for Kinsta Academy students\",\n\t\"author\": \"Kinsta Students\",\n\t\"license\": \"GPL-2.0-or-later\",\n\t\"homepage\": \"https:\/\/kinsta.com\/\",\n\t\"main\": \"build\/index.js\",\n\t\"scripts\": {\n\t\t\"build\": \"wp-scripts build\",\n\t\t\"format\": \"wp-scripts format\",\n\t\t\"lint:css\": \"wp-scripts lint-style\",\n\t\t\"lint:js\": \"wp-scripts lint-js\",\n\t\t\"packages-update\": \"wp-scripts packages-update\",\n\t\t\"plugin-zip\": \"wp-scripts plugin-zip\",\n\t\t\"start\": \"wp-scripts start\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@wordpress\/scripts\": \"^24.1.0\"\n\t},\n\t\"dependencies\": {\n\t\t\"classnames\": \"^2.3.2\"\n\t}\n}<\/code><\/pre>\n<p>A <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/using-npm\/scripts\">propriedade<\/a> <code>scripts<\/code> \u00e9 um <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\">dicion\u00e1rio que cont\u00e9m comandos<\/a> que s\u00e3o executados em v\u00e1rios momentos do <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json\">ciclo de vida de um pacote<\/a> usando <code>npm run [cmd]<\/code>.<\/p>\n<p>Neste artigo, n\u00f3s estaremos usando os <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/wp-plugin\/#package-json\">seguintes comandos<\/a>:<\/p>\n<ul>\n<li><code>npm run build<\/code> &#8211; cria uma estrutura de produ\u00e7\u00e3o (comprimida)<\/li>\n<li><code>npm run start<\/code> ou <code>npm start<\/code> &#8211; cria uma estrutura de desenvolvimento (sem compress\u00e3o)<\/li>\n<\/ul>\n<p><code>dependencies<\/code> e <code>devDependencies<\/code> s\u00e3o dois objetos que mapeiam <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json#dependencies\">um nome de pacote para uma vers\u00e3o<\/a>. <code>dependencies<\/code> s\u00e3o necess\u00e1rios na produ\u00e7\u00e3o, enquanto <code>devDependences<\/code> s\u00e3o necess\u00e1rios apenas para o desenvolvimento local (<a href=\"https:\/\/docs.npmjs.com\/specifying-dependencies-and-devdependencies-in-a-package-json-file\">leia mais<\/a>).<\/p>\n<p>A \u00fanica depend\u00eancia padr\u00e3o do dev \u00e9 o pacote <code>@wordpress\/scripts<\/code>, que \u00e9 <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\">definido como<\/a> &#8220;uma cole\u00e7\u00e3o de scripts reutiliz\u00e1veis feitos sob medida para o desenvolvimento do WordPress&#8221;.<\/p>\n<h3 id=\"block-json\">O arquivo block.json<\/h3>\n<p>Come\u00e7ando com o WordPress 5.8, o <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/\">arquivo de metadados<\/a> <strong>block.json<\/strong> \u00e9 a <a href=\"https:\/\/kinsta.com\/pt\/blog\/wordpress-5-8\/#block-api-enhancements\">forma can\u00f4nica de registrar os tipos de blocos<\/a>.<\/p>\n<p>Ter um arquivo <strong>block.json<\/strong> oferece v\u00e1rios benef\u00edcios, incluindo <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#benefits-using-the-metadata-file\">melhor desempenho<\/a> e melhor visibilidade no <a href=\"https:\/\/wordpress.org\/plugins\/\">Diret\u00f3rio de Plugins do WordPress<\/a>:<\/p>\n<blockquote><p><em>De uma perspectiva de desempenho, quando os temas suportam ativos de lazy loading (carregamento pregui\u00e7oso), os blocos registrados no <strong>block.json<\/strong> ter\u00e3o sua fila de consulta de ativos otimizada fora da caixa. O frontend CSS e os ativos JavaScript listados nas propriedades <code>style<\/code> ou <code>script<\/code> s\u00f3 ser\u00e3o consultados quando o bloco estiver presente na p\u00e1gina, resultando na redu\u00e7\u00e3o do tamanho da p\u00e1gina.<\/em><\/p><\/blockquote>\n<p>A execu\u00e7\u00e3o do comando <code>@wordpress\/create-block<\/code> gera o seguinte arquivo <strong>block.json<\/strong>:<\/p>\n<pre><code class=\"language-json\">{\n\t\"$schema\": \"https:\/\/schemas.wp.org\/trunk\/block.json\",\n\t\"apiVersion\": 2,\n\t\"name\": \"ka-example-block\/ka-example-block\",\n\t\"version\": \"0.1.0\",\n\t\"title\": \"Kinsta Academy Block\",\n\t\"category\": \"widgets\",\n\t\"icon\": \"superhero-alt\",\n\t\"description\": \"An example block for Kinsta Academy students\",\n\t\"supports\": {\n\t\t\"html\": false\n\t},\n\t\"textdomain\": \"ka-example-block\",\n\t\"editorScript\": \"file:.\/index.js\",\n\t\"editorStyle\": \"file:.\/index.css\",\n\t\"style\": \"file:.\/style-index.css\"\n}<\/code><\/pre>\n<p>Aqui est\u00e1 a lista completa de <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#block-api\">propriedades padr\u00e3o<\/a>:<\/p>\n<ul>\n<li><code>apiVersion<\/code> &#8211; a vers\u00e3o da API usada pelo bloco (a vers\u00e3o atual \u00e9 2)<\/li>\n<li><code>name<\/code> &#8211; um identificador \u00fanico para um bloco incluindo um namespace<\/li>\n<li><code>version<\/code> &#8211; a vers\u00e3o atual de um bloco<\/li>\n<li><code>title<\/code> &#8211; um t\u00edtulo de exibi\u00e7\u00e3o para um bloco<\/li>\n<li><code>category<\/code> &#8211; uma categoria de bloco<\/li>\n<li><code>icon<\/code> &#8211; uma slug <a href=\"https:\/\/developer.wordpress.org\/resource\/dashicons\/\">Dashicon<\/a> ou um \u00edcone SVG personalizado<\/li>\n<li><code>description<\/code> &#8211; uma breve descri\u00e7\u00e3o vis\u00edvel no inspetor de bloco<\/li>\n<li><code>supports<\/code> &#8211; um conjunto de op\u00e7\u00f5es para controlar os recursos usados no editor<\/li>\n<li><code>textdomain<\/code> &#8211; o dom\u00ednio de texto do plugin<\/li>\n<li><code>editorScript<\/code> &#8211; defini\u00e7\u00e3o do script do editor<\/li>\n<li><code>editorStyle<\/code> &#8211; defini\u00e7\u00e3o do estilo do editor<\/li>\n<li><code>style<\/code> &#8211; fornece estilos alternativos para um bloco<\/li>\n<\/ul>\n<p>Al\u00e9m das propriedades listadas acima, voc\u00ea pode (e provavelmente ir\u00e1) definir um objeto <code>attributes<\/code> fornecendo informa\u00e7\u00f5es sobre os dados armazenados pelo seu bloco. Em seu <strong>block.json<\/strong> voc\u00ea pode definir qualquer n\u00famero de atributos em pares <em>chave\/valor<\/em>, onde a chave \u00e9 o nome do atributo e o valor \u00e9 a defini\u00e7\u00e3o do atributo.<\/p>\n<p>D\u00ea uma olhada no seguinte exemplo de defini\u00e7\u00f5es de atributos:<\/p>\n<pre><code class=\"language-json\">\"attributes\": {\n\t\"content\": {\n\t\t\"type\": \"array\",\n\t\t\"source\": \"children\",\n\t\t\"selector\": \"p\"\n\t},\n\t\"align\": {\n\t\t\"type\": \"string\",\n\t\t\"default\": \"none\"\n\t},\n\t\"link\": { \n\t\t\"type\": \"string\", \n\t\t\"default\": \"https:\/\/kinsta.com\" \n\t}\n},<\/code><\/pre>\n<p>Veremos com mais detalhes o arquivo <strong>block.json<\/strong> <a href=\"#block-json-at-work\">mais tarde no artigo<\/a>, mas voc\u00ea tamb\u00e9m pode querer verificar o Manual do Editor de Blocos para informa\u00e7\u00f5es mais detalhadas sobre os <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/\">metadados<\/a> e <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">atributos<\/a> do <strong>block.json.<\/strong><\/p>\n<h3 id=\"src-folder\">A pasta src<\/h3>\n<p>A pasta <code>src<\/code> \u00e9 onde o desenvolvimento acontece. Nessa pasta, voc\u00ea encontrar\u00e1 os seguintes arquivos:<\/p>\n<ul>\n<li><strong>index.js<\/strong><\/li>\n<li><strong>edit.js<\/strong><\/li>\n<li><strong>save.js<\/strong><\/li>\n<li><strong>editor.scss<\/strong><\/li>\n<li><strong>style.scss<\/strong><\/li>\n<\/ul>\n<h4>index.js<\/h4>\n<p>O arquivo <strong>index.js<\/strong> \u00e9 o seu ponto de partida. Aqui voc\u00ea ir\u00e1 importar depend\u00eancias e registrar o tipo de bloco no servidor:<\/p>\n<pre><code class=\"language-js\">import { registerBlockType } from '@wordpress\/blocks';\n\nimport '.\/style.scss';\n\nimport Edit from '.\/edit';\nimport save from '.\/save';\nimport metadata from '.\/block.json';\n\nregisterBlockType( metadata.name, {\n\t\/**\n\t * @see .\/edit.js\n\t *\/\n\tedit: Edit,\n\n\t\/**\n\t * @see .\/save.js\n\t *\/\n\tsave,\n} );<\/code><\/pre>\n<p>A primeira declara\u00e7\u00e3o importa a fun\u00e7\u00e3o <code>registerBlockType<\/code> do <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-blocks\/\">pacote<\/a> <code>@wordpress\/blocks<\/code>. As seguintes <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/import\">instru\u00e7\u00f5es de importa\u00e7\u00e3o<\/a> importam a folha de estilo com as fun\u00e7\u00f5es <code>Edit<\/code> e <code>save<\/code>, e um objeto de metadados do arquivo <em>block.json<\/em>.<\/p>\n<p>A fun\u00e7\u00e3o <code>registerBlockType<\/code> <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-registration\/\">registra o componente no cliente<\/a>. A fun\u00e7\u00e3o toma dois par\u00e2metros: um nome de bloco e um objeto de configura\u00e7\u00e3o de bloco.<\/p>\n<p>A fun\u00e7\u00e3o <code>Edit<\/code> fornece a interface do bloco como renderizado no editor de blocos, enquanto a fun\u00e7\u00e3o <code>save<\/code> fornece a estrutura que ser\u00e1 serializada e salva no banco de dados (<a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/\">leia mais<\/a>).<\/p>\n<h4>edit.js<\/h4>\n<p><strong>edit.js<\/strong>\u00a0\u00e9 onde voc\u00ea ir\u00e1 construir a interface de administra\u00e7\u00e3o do bloco:<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps } from '@wordpress\/block-editor';\nimport '.\/editor.scss';\n\nexport default function Edit() {\n\treturn (\n\t\t&lt;p {...useBlockProps()}&gt;\n\t\t\t{__('My First Block \u2013 hello from the editor!', 'my-first-block')}\n\t\t&lt;\/p&gt;\n\t);\n}<\/code><\/pre>\n<p>Primeiro, ele importa a fun\u00e7\u00e3o <code>__<\/code> do pacote <code>@wordpress\/i18n<\/code> (este pacote cont\u00e9m uma vers\u00e3o JavaScript das fun\u00e7\u00f5es de tradu\u00e7\u00e3o), o <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">hook de Rea\u00e7\u00e3o<\/a> <a href=\"https:\/\/make.wordpress.org\/core\/2020\/11\/18\/block-api-version-2\/\"><code>useBlockProps<\/code><\/a>, e o arquivo <code>editor.scss<\/code>.<\/p>\n<p>Depois disso, ele exporta o componente React (leia mais sobre declara\u00e7\u00f5es de <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/import\">importa\u00e7\u00e3o<\/a> e <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/export\">exporta\u00e7\u00e3o<\/a> ).<\/p>\n<h4>save.js<\/h4>\n<p>O arquivo <strong>save.js<\/strong> \u00e9 onde n\u00f3s constru\u00edmos a estrutura do bloco a ser salvo no banco de dados:<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps } from '@wordpress\/block-editor';\n\nexport default function save() {\n\treturn (\n\t\t&lt;p {...useBlockProps.save()}&gt;\n\t\t\t{__(\n\t\t\t\t'My First Block \u2013 hello from the saved content!',\n\t\t\t\t'my-first-block'\n\t\t\t)}\n\t\t&lt;\/p&gt;\n\t);\n}<\/code><\/pre>\n<h4>editor.scss e style.scss<\/h4>\n<p>Al\u00e9m dos scripts, dois arquivos <a href=\"https:\/\/sass-lang.com\/\">SASS<\/a> residem nas pastas <strong>src<\/strong>. O arquivo <strong>editor.scss<\/strong> cont\u00e9m os estilos aplicados ao bloco no contexto do editor, enquanto o arquivo <strong>style.scss<\/strong> cont\u00e9m os estilos do bloco para <a href=\"https:\/\/developer.wordpress.org\/block-editor\/contributors\/code\/coding-guidelines\/#scss-file-naming-conventions-for-blocks\">exibi\u00e7\u00e3o no frontend, bem como no editor<\/a>. Vamos analisar mais a fundo estes arquivos na segunda parte deste guia.<\/p>\n<h3>O node_modules e o build folders<\/h3>\n<p>A pasta <code>node_modules<\/code> cont\u00e9m m\u00f3dulos node e suas depend\u00eancias. N\u00e3o entraremos nesse assunto sobre os pacotes para o node, pois est\u00e1 al\u00e9m do escopo deste artigo, mas voc\u00ea pode ler mais <a href=\"https:\/\/nodejs.dev\/learn\/where-does-npm-install-the-packages\">neste artigo sobre onde o npm instala os pacotes<\/a>.<\/p>\n<p>A pasta <code>build<\/code> cont\u00e9m os arquivos JS e CSS resultantes do processo de constru\u00e7\u00e3o. Voc\u00ea pode ler mais sobre o processo de constru\u00e7\u00e3o nos guias <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/esnext-js\/\">ESNext syntax<\/a> e <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/js-build-setup\/\">JavaScript Build Setup<\/a>.<\/p>\n<h2>O Projeto: Construindo seu primeiro bloco do Gutenberg<\/h2>\n<p>\u00c9 hora de sujar nossas m\u00e3os. Esta se\u00e7\u00e3o ensinar\u00e1 a voc\u00ea como criar um plugin fornecendo um bloco CTA chamado Kinsta Academy Block.<\/p>\n<p>O bloco ser\u00e1 composto de duas colunas, com uma imagem \u00e0 esquerda e um par\u00e1grafo de texto \u00e0 direita. Um bot\u00e3o com um link customiz\u00e1vel ser\u00e1 colocado abaixo do texto:<\/p>\n<figure id=\"attachment_137853\" aria-describedby=\"caption-attachment-137853\" style=\"width: 1502px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-137853 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/custom-block-final-2.jpg\" alt=\"O tipo de bloco que voc\u00ea aprender\u00e1 a construir neste guia.\" width=\"1502\" height=\"808\"><figcaption id=\"caption-attachment-137853\" class=\"wp-caption-text\">O tipo de bloco que voc\u00ea aprender\u00e1 a construir neste guia.<\/figcaption><\/figure>\n<p>Este \u00e9 apenas um exemplo simples, mas nos permite cobrir o b\u00e1sico do desenvolvimento de blocos Gutenberg. Uma vez que voc\u00ea tenha uma compreens\u00e3o clara do b\u00e1sico, voc\u00ea pode ir em frente e criar blocos Gutenberg cada vez mais complexos com a ajuda do <a href=\"https:\/\/developer.wordpress.org\/block-editor\/\">Manual do Editor de Blocos<\/a> e qualquer outro dos vastos recursos dispon\u00edveis l\u00e1 fora.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>O c\u00f3digo dos exemplos fornecidos neste tutorial tamb\u00e9m est\u00e1 <a href=\"https:\/\/gist.github.com\/carlodaniele\/5f3dba8fff19d8ea836bdef5a2be7556\">dispon\u00edvel no Gist<\/a> para sua refer\u00eancia.<\/p>\n<\/aside>\n\n<p>Assumindo que voc\u00ea tenha a \u00faltima vers\u00e3o do WordPress rodando no seu ambiente de desenvolvimento local, aqui est\u00e1 o que voc\u00ea vai aprender daqui em diante:<\/p>\n<ul>\n<li><a href=\"#set-up-the-plugin\">Como configurar o Plugin Starter Block<\/a><\/li>\n<li><a href=\"#block-json-at-work\">block.json em a\u00e7\u00e3o<\/a><\/li>\n<li><a href=\"#using-richtext-component\">Usando componentes embutidos: O componente RichText<\/a><\/li>\n<li><a href=\"#adding-block-toolbar-controls\">Adicionando controles \u00e0 barra de ferramentas de blocos<\/a><\/li>\n<li><a href=\"#settings-sidebar\">Personalizando a barra lateral de configura\u00e7\u00f5es de blocos<\/a><\/li>\n<li><a href=\"#external-link\">Adicionando e customizando um link externo<\/a><\/li>\n<li><a href=\"#multiple-block-styles\">Adicionando m\u00faltiplos estilos de blocos<\/a><\/li>\n<li><a href=\"#innerblocks-component\">Blocos de agrupamento com o componente InnerBlocks<\/a><\/li>\n<li><a href=\"#additional-improvements\">Melhorias adicionais<\/a><\/li>\n<\/ul>\n<p>Prontos&#8230; prontos&#8230; vamos!<\/p>\n<h3 id=\"set-up-the-plugin\">Como configurar o Plugin Starter Block<\/h3>\n<p>Inicie sua ferramenta de linha de comando e navegue at\u00e9 a pasta <strong>\/wp-content\/plugins<\/strong>:<\/p>\n<figure id=\"attachment_105130\" aria-describedby=\"caption-attachment-105130\" style=\"width: 1224px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-105130\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/new-terminal-at-folder.jpg\" alt=\"Novo terminal em pasta no Mac OS\" width=\"1224\" height=\"958\"><figcaption id=\"caption-attachment-105130\" class=\"wp-caption-text\">Novo terminal em pasta no Mac OS<\/figcaption><\/figure>\n<p>Agora, execute o seguinte comando:<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block<\/code><\/pre>\n<p>Este comando gera os arquivos PHP, SCSS e JS para registrar um bloco em modo interativo, permitindo que voc\u00ea adicione facilmente os dados necess\u00e1rios para o seu bloco. Para nosso exemplo vamos usar os seguintes detalhes:<\/p>\n<ul>\n<li><strong>Variante do modelo:<\/strong> est\u00e1tico<\/li>\n<li><strong>Bloco:<\/strong> ka-example-block<\/li>\n<li><strong>Internal namespace:<\/strong> ka-example-block<\/li>\n<li><strong>T\u00edtulo do bloco de exibi\u00e7\u00e3o:<\/strong> Bloco da Kinsta Academy<\/li>\n<li><strong>Breve descri\u00e7\u00e3o do bloco:<\/strong> Um bloco de exemplo para estudantes da Kinsta Academy<\/li>\n<li><strong>Dashicon:<\/strong> super-hero-alt<\/li>\n<li><strong>Nome da categoria:<\/strong> widgets<\/li>\n<li><strong>Voc\u00ea quer personalizar o plugin de WordPress?:<\/strong> sim<\/li>\n<li><strong>A p\u00e1gina inicial do plugin:<\/strong> Kinsta\u00ae Hospedagem na Nuvem para todos os seus projetos Web<\/li>\n<li><strong>Vers\u00e3o atual do plugin:<\/strong> 0.1.0<\/li>\n<li><strong>Autor do plugin:<\/strong> seu nome<\/li>\n<li><strong>Licen\u00e7a:<\/strong> &#8211;<\/li>\n<li><strong>Link para o texto da licen\u00e7a:<\/strong> &#8211;<\/li>\n<li><strong>Caminho de dom\u00ednio personalizado para tradu\u00e7\u00f5es:<\/strong> &#8211;<\/li>\n<\/ul>\n<p>A instala\u00e7\u00e3o do plugin e de todas as depend\u00eancias leva alguns minutos. Quando o processo estiver completo, voc\u00ea ver\u00e1 a seguinte resposta:<\/p>\n<figure id=\"attachment_134076\" aria-describedby=\"caption-attachment-134076\" style=\"width: 1136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134076 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/example-block-installed.jpg\" alt=\"O bloco de exemplo foi instalado e registrado para desenvolvimento.\" width=\"1136\" height=\"682\"><figcaption id=\"caption-attachment-134076\" class=\"wp-caption-text\">O bloco de exemplo foi instalado e registrado para desenvolvimento.<\/figcaption><\/figure>\n<p>Agora, execute o seguinte comando da pasta <strong>\/wp-content\/plugins<\/strong>:<\/p>\n<pre><code class=\"language-bash\">cd ka-example-block<\/code><\/pre>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Se voc\u00ea est\u00e1 rodando seu ambiente WordPress, voc\u00ea deve primeiro iniciar o Docker Desktop, ent\u00e3o rodar <code>wp-env start<\/code> de dentro da pasta do seu plugin. Ent\u00e3o voc\u00ea pode iniciar <em>http:\/\/localhost:8888\/wp-login<\/em> a partir do seu navegador e usar <strong>Username: admin<\/strong> e <strong>Password: senha<\/strong> para entrar no seu painel de controle do WordPress.<\/p>\n<\/aside>\n\n<figure id=\"attachment_105184\" aria-describedby=\"caption-attachment-105184\" style=\"width: 2508px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-105184\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/10\/visual-studio-code-terminal.jpg\" alt=\"Executando comandos a partir do Visual Studio Code Terminal\" width=\"2508\" height=\"1612\"><figcaption id=\"caption-attachment-105184\" class=\"wp-caption-text\">Executando comandos a partir do Visual Studio Code Terminal<\/figcaption><\/figure>\n<p>Finalmente, de dentro da pasta do seu plugin (<strong>ka-example-block<\/strong>\u00a0no nosso exemplo), voc\u00ea pode come\u00e7ar o desenvolvimento com:<\/p>\n<pre><code class=\"language-bash\">npm start<\/code><\/pre>\n<p>Agora abra a tela Plugins para encontrar e ativar o plugin <strong>Kinsta Academy Block<\/strong>:<\/p>\n<figure id=\"attachment_133866\" aria-describedby=\"caption-attachment-133866\" style=\"width: 2214px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133866 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/plugins-screen.jpg\" alt=\"Ativar o bloco de exemplo\" width=\"2214\" height=\"1254\"><figcaption id=\"caption-attachment-133866\" class=\"wp-caption-text\">Ativar o bloco de exemplo<\/figcaption><\/figure>\n<p>Crie um novo artigo, abra o inseridor de blocos e des\u00e7a at\u00e9 a categoria <strong>Design<\/strong>. Clique para adicionar o Kinsta Academy Block:<\/p>\n<figure id=\"attachment_133869\" aria-describedby=\"caption-attachment-133869\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133869 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/starter-block.jpg\" alt=\"Um bloco inicial constru\u00eddo com @wordpress\/create-block\" width=\"2216\" height=\"1242\"><figcaption id=\"caption-attachment-133869\" class=\"wp-caption-text\">Um bloco inicial constru\u00eddo com @wordpress\/create-block<\/figcaption><\/figure>\n<h3 id=\"block-json-at-work\">block.json em a\u00e7\u00e3o<\/h3>\n<p>Como mencionamos anteriormente, o registro do bloco do lado do servidor ocorre no arquivo principal <strong>.php<\/strong>. Entretanto, n\u00f3s n\u00e3o vamos definir as configura\u00e7\u00f5es no arquivo <strong>.php<\/strong>. Ao inv\u00e9s disso, n\u00f3s estaremos usando o arquivo <strong>block.json.<\/strong> Ent\u00e3o, abra o <strong>block.json<\/strong> novamente e d\u00ea uma olhada mais de perto nas configura\u00e7\u00f5es padr\u00e3o:<\/p>\n<pre><code class=\"language-json\">{\n\t\"$schema\": \"https:\/\/schemas.wp.org\/trunk\/block.json\",\n\t\"apiVersion\": 2,\n\t\"name\": \"ka-example-block\/ka-example-block\",\n\t\"version\": \"0.1.0\",\n\t\"title\": \"Kinsta Academy Block\",\n\t\"category\": \"widgets\",\n\t\"icon\": \"superhero-alt\",\n\t\"description\": \"An example block for Kinsta Academy students\",\n\t\"supports\": {\n\t\t\"html\": false\n\t},\n\t\"textdomain\": \"ka-example-block\",\n\t\"editorScript\": \"file:.\/index.js\",\n\t\"editorStyle\": \"file:.\/index.css\",\n\t\"style\": \"file:.\/style-index.css\"\n}<\/code><\/pre>\n<h4 id=\"scripts-and-styles\" class=\"has-anchor-hash\">Scripts e estilos<\/h4>\n<p><code>editorScript<\/code> , <code>editorStyle<\/code>, e <code>style<\/code> propriedades fornecem os caminhos relativos aos scripts e estilos frontend e backend. Voc\u00ea n\u00e3o precisa registrar manualmente os scripts e estilos definidos aqui porque estes s\u00e3o automaticamente registrados e consultados pelo WordPress. Para provar isso, abra o inspetor do navegador e abra a aba <strong>Rede<\/strong>:<\/p>\n<figure id=\"attachment_133870\" aria-describedby=\"caption-attachment-133870\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133870 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/chrome-devtools-network.jpg\" alt=\"Inspe\u00e7\u00e3o de recursos DevTools no Chrome DevTools.\" width=\"2216\" height=\"1256\"><figcaption id=\"caption-attachment-133870\" class=\"wp-caption-text\">Inspe\u00e7\u00e3o de recursos DevTools no Chrome DevTools.<\/figcaption><\/figure>\n<p>Como voc\u00ea pode ver na imagem acima, nosso script <strong>index.js<\/strong> residente na pasta de <strong>constru\u00e7\u00e3o<\/strong> tem sido regularmente consultado <strong>sem a necessidade de adicionar qualquer c\u00f3digo PHP<\/strong>.<\/p>\n<h4>Etiquetas UI<\/h4>\n<p>As propriedades <code>title<\/code> e <code>description<\/code> fornecem etiquetas necess\u00e1rios para identificar o bloco no editor:<\/p>\n<p>\u00a0<\/p>\n<figure id=\"attachment_133871\" aria-describedby=\"caption-attachment-133871\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133871 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-labels.jpg\" alt=\"Nome e descri\u00e7\u00e3o do bloco na barra lateral do bloco\" width=\"2216\" height=\"742\"><figcaption id=\"caption-attachment-133871\" class=\"wp-caption-text\">Nome e descri\u00e7\u00e3o do bloco na barra lateral do bloco<\/figcaption><\/figure>\n<h4>Palavras-chave<\/h4>\n<p>Como mencionamos anteriormente, voc\u00ea pode configurar com precis\u00e3o suas configura\u00e7\u00f5es de bloco usando <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-registration\/\">propriedades<\/a> e <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">atributos<\/a>. Por exemplo, voc\u00ea pode adicionar um ou mais <code>keywords<\/code> para ajudar os usu\u00e1rios a pesquisar blocos:<\/p>\n<pre><code class=\"language-json\">\"keywords\": [ \n\t\t\"kinsta\", \n\t\t\"academy\", \n\t\t\"superhero\" \n\t],<\/code><\/pre>\n<p>Se voc\u00ea agora inserir &#8220;kinsta&#8221;, &#8220;academy&#8221; ou &#8220;superhero&#8221; no inseridor r\u00e1pido, o editor ir\u00e1 sugerir a voc\u00ea o bloco de Kinsta Academy:<\/p>\n<figure id=\"attachment_133969\" aria-describedby=\"caption-attachment-133969\" style=\"width: 2086px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133969 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-keywords.jpg\" alt=\"Procura de um bloco usando uma palavra-chave no inseridor r\u00e1pido\" width=\"2086\" height=\"944\"><figcaption id=\"caption-attachment-133969\" class=\"wp-caption-text\">Procura de um bloco usando uma palavra-chave no inseridor r\u00e1pido<\/figcaption><\/figure>\n<p>\u00a0<\/p>\n<h4>Localiza\u00e7\u00e3o<\/h4>\n<p>Se voc\u00ea est\u00e1 se perguntando como a localiza\u00e7\u00e3o das strings no arquivo JSON acontece, aqui est\u00e1 <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/30293\">a resposta<\/a>:<\/p>\n<blockquote><p><em>Em JavaScript, voc\u00ea pode usar agora o m\u00e9todo <code>registerBlockTypeFromMetadata<\/code> do pacote <code>@wordpress\/blocks<\/code> para registrar um tipo de bloco usando os metadados carregados do arquivo <strong>block.json<\/strong>. Todas as propriedades localizadas s\u00e3o automaticamente envolvidas em <code>_x<\/code> (do pacote <code>@wordpress\/i18n<\/code> ) chamadas de fun\u00e7\u00e3o similares a como funciona em PHP com <code>register_block_type_from_metadata<\/code>. O \u00fanico requisito \u00e9 definir a propriedade <code>textdomain<\/code> no arquivo <strong>block.json<\/strong>.<\/em><\/p><\/blockquote>\n<p>Aqui n\u00f3s estamos usando a fun\u00e7\u00e3o <code>registerBlockType<\/code> ao inv\u00e9s de <code>registerBlockTypeFromMetadata<\/code>, pois esta \u00faltima <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/32030\">foi depreciada<\/a> desde o <a href=\"https:\/\/make.wordpress.org\/core\/2021\/05\/27\/whats-new-in-gutenberg-10-7-26-may\/\">Gutenberg 10.7<\/a>, mas o mecanismo \u00e9 o mesmo.<\/p>\n<h3 id=\"using-richtext-component\">Usando componentes incorporados: O componente RichText<\/h3>\n<p>Os elementos que comp\u00f5em um bloco do Gutenberg s\u00e3o os componentes React, e voc\u00ea pode acessar esses componentes atrav\u00e9s da vari\u00e1vel global <code>wp<\/code>. Por exemplo, tente digitar <code>wp.editor<\/code> no console do seu navegador. Isto lhe dar\u00e1 a lista completa dos componentes inclu\u00eddos no m\u00f3dulo <code>wp.editor<\/code>. Percorra a lista e adivinhe para que componentes s\u00e3o destinados por seus nomes. Da mesma forma, voc\u00ea pode verificar a lista de componentes inclu\u00eddos no m\u00f3dulo <code>wp.components<\/code>:<\/p>\n<figure id=\"attachment_133970\" aria-describedby=\"caption-attachment-133970\" style=\"width: 2288px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133970 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/wp-components.jpg\" alt=\"Componentes do WP\" width=\"2288\" height=\"1392\"><figcaption id=\"caption-attachment-133970\" class=\"wp-caption-text\">Componentes do WP<\/figcaption><\/figure>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p><strong>Programa\u00e7\u00e3o modular<\/strong> \u00e9 uma t\u00e9cnica de projeto de software que enfatiza a separa\u00e7\u00e3o da funcionalidade de um programa em <strong>m\u00f3dulos<\/strong> independentes e intercambi\u00e1veis, de modo que cada um contenha tudo o necess\u00e1rio para executar apenas um aspecto da funcionalidade desejada (Fonte: <a href=\"https:\/\/en.wikipedia.org\/wiki\/Modular_programming\">Wikipedia<\/a>).<\/p>\n<\/aside>\n\n<p>Agora volte para o arquivo <strong>edit.js<\/strong> e d\u00ea uma olhada mais de perto no script:<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps } from '@wordpress\/block-editor';\nimport '.\/editor.scss';\n\nexport default function Edit() {\n\treturn (\n\t\t&lt;p { ...useBlockProps() }&gt;\n\t\t\t{ __(\n\t\t\t\t'Kinsta Academy Block \u2013 hello from the editor!',\n\t\t\t\t'ka-example-block'\n\t\t\t) }\n\t\t&lt;\/p&gt;\n\t);\n}<\/code><\/pre>\n<p>Este c\u00f3digo gera um bloco est\u00e1tico com texto simples e n\u00e3o edit\u00e1vel. Mas n\u00f3s podemos mudar as coisas facilmente:<\/p>\n<figure id=\"attachment_133971\" aria-describedby=\"caption-attachment-133971\" style=\"width: 1400px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133971 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/starter-block-in-code-editor.jpg\" alt=\"O bloco de partida no editor de c\u00f3digo\" width=\"1400\" height=\"772\"><figcaption id=\"caption-attachment-133971\" class=\"wp-caption-text\">O bloco de partida no editor de c\u00f3digo<\/figcaption><\/figure>\n<p>Para tornar o texto edit\u00e1vel, voc\u00ea ter\u00e1 que substituir a tag <code>&lt;p&gt;<\/code> atual por um componente que torne o <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Guide\/HTML\/Editable_content\">conte\u00fado de entrada edit\u00e1vel<\/a>. Para isso, o Gutenberg fornece o <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\">componente RichText<\/a> embutido.<\/p>\n<p>Adicionar um componente incorporado ao seu bloco \u00e9 um processo de 5 passos:<\/p>\n<ol>\n<li><a href=\"#import-components\">Importe os componentes necess\u00e1rios de um pacote WordPress<\/a><\/li>\n<li><a href=\"#jsx-elements\">Inclua os elementos correspondentes em seu c\u00f3digo JSX<\/a><\/li>\n<li><a href=\"#define-attributes\">Defina os atributos necess\u00e1rios no arquivo block.json<\/a><\/li>\n<li><a href=\"#define-event-handlers\">Defina os manipuladores de eventos<\/a><\/li>\n<li><a href=\"#save-data\">Salve os dados<\/a><\/li>\n<\/ol>\n<h4 id=\"import-components\">Passo 1: Importe os componentes necess\u00e1rios de um pacote WordPress<\/h4>\n<p>Agora abra o arquivo <strong>edit.js<\/strong> e mude o seguinte comando <code>import<\/code>:<\/p>\n<pre><code class=\"language-js\">import { useBlockProps } from '@wordpress\/block-editor';<\/code><\/pre>\n<p>&#8230;para:<\/p>\n<pre><code class=\"language-js\">import { useBlockProps, RichText } from '@wordpress\/block-editor';<\/code><\/pre>\n<p>Desta forma, voc\u00ea est\u00e1 importando a fun\u00e7\u00e3o <code>useBlockProps<\/code> e o componente <code>RichText<\/code> do pacote <code>@wordpress\/block-editor<\/code>.<\/p>\n<h5>useBlockProps<\/h5>\n<p>O <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\"><code>useBlockProps<\/code><\/a> e o hook de rea\u00e7\u00e3o marca o <a href=\"https:\/\/make.wordpress.org\/core\/2020\/11\/18\/block-api-version-2\/\">elemento de inv\u00f3lucro do bloco<\/a>:<\/p>\n<blockquote><p><em>Ao usar a API vers\u00e3o 2, voc\u00ea deve usar o novo hook <code>useBlockProps<\/code> na fun\u00e7\u00e3o <code>edit<\/code> do bloco para marcar o elemento de inv\u00f3lucro do bloco. O hook ir\u00e1 inserir atributos e manipuladores de eventos necess\u00e1rios para habilitar o comportamento do bloco. Quaisquer atributos que voc\u00ea queira passar para o elemento de bloco devem ser passados por <code>useBlockProps<\/code> e o valor retornado deve ser espalhado para o elemento.<\/em><\/p><\/blockquote>\n<p>Para simplificar, <code>useBlockProps<\/code> atribui automaticamente atributos e classes ao elemento inv\u00f3lucro (o elemento <code>p<\/code> em nosso exemplo):<\/p>\n<figure id=\"attachment_133973\" aria-describedby=\"caption-attachment-133973\" style=\"width: 2614px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133973 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/useblockprops.jpg\" alt=\"Elementos e classes gerados pelo usoBlockProps\" width=\"2614\" height=\"966\"><figcaption id=\"caption-attachment-133973\" class=\"wp-caption-text\">Elementos e classes gerados pelo usoBlockProps<\/figcaption><\/figure>\n<p>Se voc\u00ea remover <code>useBlockProps<\/code> do elemento do pacote, voc\u00ea ter\u00e1 uma simples sequ\u00eancia do texto sem acesso \u00e0 funcionalidade e estilo de bloqueio:<\/p>\n<figure id=\"attachment_133974\" aria-describedby=\"caption-attachment-133974\" style=\"width: 2614px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133974 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/without-useblockprops.jpg\" alt=\"O mesmo bloco sem usarBlockProps\" width=\"2614\" height=\"1016\"><figcaption id=\"caption-attachment-133974\" class=\"wp-caption-text\">O mesmo bloco sem usarBlockProps<\/figcaption><\/figure>\n<p>Como <a href=\"#additional-improvements\">explicaremos mais tarde<\/a>, voc\u00ea tamb\u00e9m pode passar para <code>useBlockProps<\/code> um objeto de propriedades para personalizar a sa\u00edda.<\/p>\n<h5>RichText<\/h5>\n<p>O componente RichText fornece uma entrada de <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Guide\/HTML\/Editable_content\">conte\u00fado<\/a> que permite aos usu\u00e1rios editar e formatar o conte\u00fado. Voc\u00ea encontrar\u00e1 o componente documentado no GitHub em <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\">gutenberg\/packages\/block-editor\/src\/components\/rich-text\/README.md<\/a>.<\/p>\n<h4 id=\"jsx-elements\">Passo 2: Inclua os elementos correspondentes em seu c\u00f3digo JSX<\/h4>\n<pre><code class=\"language-jsx\">...\n\nconst blockProps = useBlockProps();\n\nreturn (\n\t&lt;RichText \n\t\t{ ...blockProps }\n\t\ttagName=\"p\"\n\t\tonChange={ onChangeContent }\n\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\tvalue={ attributes.content }\n\t\tplaceholder={ __( 'Write your text...' ) }\n\t\/&gt;\n);<\/code><\/pre>\n<p>Vamos comentar sobre o c\u00f3digo linha por linha:<\/p>\n<ul>\n<li><code>tagName<\/code> &#8211; o nome da tag do elemento HTML edit\u00e1vel<\/li>\n<li><code>onChange<\/code> &#8211; fun\u00e7\u00e3o chamada quando o conte\u00fado do elemento muda<\/li>\n<li><code>allowedFormats<\/code> &#8211; um conjunto de formatos permitidos. Por padr\u00e3o, todos os formatos s\u00e3o permitidos<\/li>\n<li><code>value<\/code> &#8211; a string HTML para tornar edit\u00e1vel<\/li>\n<li><code>placeholder<\/code> &#8211; texto do espa\u00e7o reservado para mostrar quando o elemento estiver vazio<\/li>\n<\/ul>\n<h4 id=\"define-attributes\">Passo 3: Defina os atributos necess\u00e1rios no arquivo block.json<\/h4>\n<p><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">Atributos<\/a> fornecem informa\u00e7\u00f5es sobre os dados armazenados por um bloco, tais como conte\u00fado rico, cor de fundo, URLs, etc.<\/p>\n<p>Voc\u00ea pode definir um n\u00famero arbitr\u00e1rio de atributos dentro de um objeto <code>attributes<\/code> em pares chave\/valor, onde a chave \u00e9 o nome do atributo e o valor \u00e9 a defini\u00e7\u00e3o do atributo.<\/p>\n<p>Agora abra o arquivo <strong>block.json<\/strong> e adicione o seguinte <code>attributes<\/code> prop:<\/p>\n<pre><code class=\"language-json\">\"attributes\": {\n\t\"content\": {\n\t\t\"type\": \"string\",\n\t\t\"source\": \"html\",\n\t\t\"selector\": \"p\"\n\t}\n},<\/code><\/pre>\n<p>O atributo <code>content<\/code> permite armazenar o texto digitado pelo usu\u00e1rio no campo edit\u00e1vel:<\/p>\n<ul>\n<li><code>type<\/code> indica o tipo de dados armazenados pelo atributo. O tipo \u00e9 requerido, a menos que voc\u00ea defina uma propriedade <code>enum<\/code>.<\/li>\n<li><code>source<\/code> define como o valor do atributo \u00e9 extra\u00eddo do conte\u00fado do artigo. Em nosso exemplo, \u00e9 o conte\u00fado HTML. Note que se voc\u00ea n\u00e3o fornecer uma propriedade fonte, os dados s\u00e3o armazenados no delimitador de bloco (<a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/#value-source\">leia mais<\/a>).<\/li>\n<li><code>selector<\/code> \u00e9 uma tag HTML ou qualquer outro seletor, tal como um nome de classe ou um atributo id.<\/li>\n<\/ul>\n<p>N\u00f3s iremos passar a fun\u00e7\u00e3o <code>Edit<\/code> como objeto de propriedades. Ent\u00e3o, volte para o arquivo <strong>edit.js<\/strong> e fa\u00e7a a seguinte mudan\u00e7a:<\/p>\n<pre><code class=\"language-js\">export default function Edit( { attributes, setAttributes } ) { ... }<\/code><\/pre>\n<h4 id=\"define-event-handlers\">Etapa 4: Defina os manipuladores de eventos<\/h4>\n<p>O elemento <code>RichText<\/code> tem um atributo <code>onChange<\/code>, fornecendo uma fun\u00e7\u00e3o a ser chamada quando o conte\u00fado do elemento muda.<\/p>\n<p>Vamos definir essa fun\u00e7\u00e3o e ver todo o script do <strong>edit.js:<\/strong><\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps, RichText } from '@wordpress\/block-editor';\nimport '.\/editor.scss';\n\nexport default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\n\tconst onChangeContent = ( newContent ) =&gt; {\n\t\tsetAttributes( { content: newContent } )\n\t}\n\n\treturn (\n\t\t&lt;RichText \n\t\t\t{ ...blockProps }\n\t\t\ttagName=\"p\"\n\t\t\tonChange={ onChangeContent }\n\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\tvalue={ attributes.content }\n\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Agora salve o arquivo e volte ao seu painel de controle do WordPress, crie um novo artigo ou p\u00e1gina e adicione seu bloco personalizado:<\/p>\n<figure id=\"attachment_134001\" aria-describedby=\"caption-attachment-134001\" style=\"width: 2618px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134001 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/rich-text-component.jpg\" alt=\"A sa\u00edda do componente RichText no Editor de Blocos.\" width=\"2618\" height=\"960\"><figcaption id=\"caption-attachment-134001\" class=\"wp-caption-text\">A sa\u00edda do componente RichText no Editor de Blocos.<\/figcaption><\/figure>\n<p>Adicione algum texto e mude para a visualiza\u00e7\u00e3o de c\u00f3digo. Aqui est\u00e1 como seu c\u00f3digo deve ser:<\/p>\n<pre><code class=\"language-html\">&lt;!-- wp:ka-example-block\/ka-example-block --&gt;\n&lt;p class=\"wp-block-ka-example-block-ka-example-block\"&gt;Kinsta Academy Block \u2013 hello from the saved content!&lt;\/p&gt;\n&lt;!-- \/wp:ka-example-block\/ka-example-block --&gt;<\/code><\/pre>\n<p>Como voc\u00ea pode ver, se voc\u00ea mudar para o Editor de C\u00f3digo, o conte\u00fado do seu bloco mudou. Isso porque voc\u00ea tem que modificar o arquivo <strong>save.js<\/strong> para armazenar a entrada do usu\u00e1rio no banco de dados quando o artigo \u00e9 salvo.<\/p>\n<h4 id=\"save-data\">Passo 5: Salve os dados<\/h4>\n<p>Agora abra o arquivo <strong>save.js<\/strong> e mude o script da seguinte forma:<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps, RichText } from '@wordpress\/block-editor';\n\nexport default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ attributes.content } \n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Isso \u00e9 o que estamos fazendo aqui:<\/p>\n<ul>\n<li>Importe o componente <code>RichText<\/code> a partir do pacote <code>block-editor<\/code>.<\/li>\n<li>Passe v\u00e1rias propriedades atrav\u00e9s de um argumento de objeto para a fun\u00e7\u00e3o <code>save<\/code> (neste exemplo, n\u00f3s estamos apenas passando a <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#attributes\">propriedade<code>attributes<\/code><\/a>)<\/li>\n<li>Devolva o conte\u00fado do componente <code>RichText<\/code><\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Sempre que voc\u00ea mudar a fun\u00e7\u00e3o de salvar, voc\u00ea deve apagar qualquer inst\u00e2ncia de bloco na tela do editor e inclu\u00ed-la novamente para v\u00ea-la funcionar corretamente. Leia mais sobre a <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#validation\">valida\u00e7\u00e3o de blocos<\/a>.<\/p>\n<\/aside>\n\n<figure id=\"attachment_134002\" aria-describedby=\"caption-attachment-134002\" style=\"width: 1770px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134002 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-content-in-the-code-editor.jpg\" alt=\"O conte\u00fado do bloco foi salvo no banco de dados\" width=\"1770\" height=\"1000\"><figcaption id=\"caption-attachment-134002\" class=\"wp-caption-text\">O conte\u00fado do bloco foi salvo no banco de dados<\/figcaption><\/figure>\n<p>Voc\u00ea pode ler mais sobre o componente <code>RichText<\/code> no <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/richtext\/\">Block Editor Handbook<\/a> e encontrar a <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/HEAD\/packages\/block-editor\/src\/components\/rich-text\/README.md\">lista completa de adere\u00e7os no Github<\/a>. Agora vamos dar um passo adiante.<\/p>\n<p>Na pr\u00f3xima se\u00e7\u00e3o, voc\u00ea aprender\u00e1 como adicionar controles \u00e0 barra de ferramentas do bloco.<\/p>\n<h3 id=\"adding-block-toolbar-controls\">Adicionando controles \u00e0 barra de ferramentas de bloqueio<\/h3>\n<p>A <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">barra de ferramentas do bloco<\/a> cont\u00e9m um conjunto de controles que permite aos usu\u00e1rios manipularem partes do conte\u00fado do bloco. Para cada controle da barra de ferramentas, voc\u00ea encontrar\u00e1 um componente:<\/p>\n<p>\u00a0<\/p>\n<figure id=\"attachment_134007\" aria-describedby=\"caption-attachment-134007\" style=\"width: 1212px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134007 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/paragraph-toolbar.jpg\" alt=\"A barra de ferramentas do bloco de par\u00e1grafos centrais\" width=\"1212\" height=\"242\"><figcaption id=\"caption-attachment-134007\" class=\"wp-caption-text\">A barra de ferramentas do bloco de par\u00e1grafos centrais<\/figcaption><\/figure>\n<p>Por exemplo, voc\u00ea poderia adicionar um controle de alinhamento de texto para o seu bloco. Tudo o que voc\u00ea precisa fazer \u00e9 importar dois componentes do pacote <code>@wordpress\/block-editor<\/code>.<\/p>\n<p>N\u00f3s vamos passar pelos mesmos passos do exemplo anterior:<\/p>\n<ol>\n<li>Importe os componentes necess\u00e1rios de um pacote WordPress<\/li>\n<li>Inclua os elementos correspondentes em seu c\u00f3digo JSX<\/li>\n<li>Defina os atributos necess\u00e1rios no arquivo <strong>block.json<\/strong><\/li>\n<li>Defina os manipuladores de eventos<\/li>\n<li>Salve os dados<\/li>\n<\/ol>\n<h4>Passo 1: Importa\u00e7\u00e3o de componentes BlockControls e AlignmentControl de @wordpress\/block-editor<\/h4>\n<p>Para adicionar um controle de alinhamento \u00e0 barra de ferramentas do bloco, voc\u00ea precisa de dois componentes:<\/p>\n<ul>\n<li><code>BlockControls<\/code> torna uma barra de ferramentas din\u00e2mica de controles (indocumentada).<\/li>\n<li><code>AlignmentControl<\/code> torna um menu suspenso que exibe op\u00e7\u00f5es de alinhamento para o bloco selecionado (<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/alignment-control\/README.md\">leia mais<\/a>)<\/li>\n<\/ul>\n<p>Abra o arquivo <strong>edit.js<\/strong> e edite a declara\u00e7\u00e3o <code>import<\/code> como mostrado abaixo:<\/p>\n<pre><code class=\"language-js\">import { \n\tuseBlockProps, \n\tRichText, \n\tAlignmentControl, \n\tBlockControls \n} from '@wordpress\/block-editor';<\/code><\/pre>\n<h4>Passo 2: Adicione elementos BlockControls e AlignmentControl<\/h4>\n<p>V\u00e1 para a fun\u00e7\u00e3o <code>Edit<\/code> e insira o elemento <code>&lt;BlockControls \/&gt;<\/code> no mesmo n\u00edvel que <code>&lt;RichText \/&gt;<\/code>. Depois adicione e <code>&lt;AlignmentControl \/&gt;<\/code> dentro do <code>&lt;BlockControls \/&gt;<\/code>:<\/p>\n<pre><code class=\"language-jsx\">export default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\treturn (\n\t\t&lt;&gt;\n\t\t\t&lt;BlockControls&gt;\n\t\t\t\t&lt;AlignmentControl\n\t\t\t\t\tvalue={ attributes.align }\n\t\t\t\t\tonChange={ onChangeAlign }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/BlockControls&gt;\n\t\t\t&lt;RichText \n\t\t\t\t{ ...blockProps }\n\t\t\t\ttagName=\"p\"\n\t\t\t\tonChange={ onChangeContent }\n\t\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\t\tvalue={ attributes.content }\n\t\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\t\tstyle={ { textAlign: attributes.align } }\n\t\t\t\/&gt;\n\t\t&lt;\/&gt;\n\t);\n}<\/code><\/pre>\n<p>No c\u00f3digo acima, <code>&lt;&gt;<\/code> e <code>&lt;\/&gt;<\/code> s\u00e3o a breve sintaxe para declarar <a href=\"https:\/\/reactjs.org\/docs\/fragments.html#short-syntax\">fragmentos do React<\/a>, que \u00e9 como retornamos m\u00faltiplos elementos no React.<\/p>\n<p>Neste exemplo, <code>AlignmentControl<\/code> tem dois atributos:<\/p>\n<ul>\n<li><code>value<\/code> fornece o valor atual para o elemento<\/li>\n<li><code>onChange<\/code> fornece um <a href=\"https:\/\/reactjs.org\/docs\/handling-events.html\">manipulador de eventos<\/a> para executar quando o valor muda<\/li>\n<\/ul>\n<p>N\u00f3s tamb\u00e9m definimos atributos adicionais para o elemento <code>RichText<\/code> (veja a <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\" target=\"_blank\" rel=\"noopener noreferrer\">lista completa de atributos com exemplos<\/a>)<\/p>\n<h4>Passo 3: Defina o atributo de alinhamento no block.json<\/h4>\n<p>Agora v\u00e1 para o arquivo <strong>block.json<\/strong> e adicione o atributo <code>align<\/code>:<\/p>\n<pre><code class=\"language-json\">\"align\": {\n\t\"type\": \"string\",\n\t\"default\": \"none\"\n}<\/code><\/pre>\n<p>Quando terminar, volte ao editor de blocos, atualize a p\u00e1gina e selecione o bloco. Voc\u00ea deve ver uma mensagem de erro dentro do seu bloco.<\/p>\n<figure id=\"attachment_134008\" aria-describedby=\"caption-attachment-134008\" style=\"width: 1770px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134008 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-showing-an-error-message.jpg\" alt=\"O bloco exibe uma mensagem de erro\" width=\"1770\" height=\"818\"><figcaption id=\"caption-attachment-134008\" class=\"wp-caption-text\">O bloco exibe uma mensagem de erro<\/figcaption><\/figure>\n<p>A raz\u00e3o \u00e9 que ainda n\u00e3o definimos nosso organizador de eventos.<\/p>\n<h4>Passo 4: Defina os manipuladores de eventos<\/h4>\n<p>Agora defina <code>onChangeAlign<\/code>:<\/p>\n<pre><code class=\"language-js\">const onChangeAlign = ( newAlign ) =&gt; {\n\tsetAttributes( { \n\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t} )\n}<\/code><\/pre>\n<p>Se <code>newAlign<\/code> \u00e9 <code>undefined<\/code>, ent\u00e3o n\u00f3s definimos <code>newAlign<\/code> para <code>none<\/code>. Caso contr\u00e1rio, n\u00f3s usamos <code>newAlign<\/code>.<\/p>\n<p>Nosso script <strong>edit.js<\/strong> deve estar completo (por enquanto):<\/p>\n<pre><code class=\"language-jsx\">export default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\tconst onChangeContent = ( newContent ) =&gt; {\n\t\tsetAttributes( { content: newContent } )\n\t}\n\tconst onChangeAlign = ( newAlign ) =&gt; {\n\t\tsetAttributes( { \n\t\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t\t} )\n\t}\n\treturn (\n\t\t&lt;&gt;\n\t\t\t&lt;BlockControls&gt;\n\t\t\t\t&lt;AlignmentControl\n\t\t\t\t\tvalue={ attributes.align }\n\t\t\t\t\tonChange={ onChangeAlign }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/BlockControls&gt;\n\t\t\t&lt;RichText \n\t\t\t\t{ ...blockProps }\n\t\t\t\ttagName=\"p\"\n\t\t\t\tonChange={ onChangeContent }\n\t\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\t\tvalue={ attributes.content }\n\t\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\t\tstyle={ { textAlign: attributes.align } }\n\t\t\t\/&gt;\n\t\t&lt;\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Agora voc\u00ea pode voltar para o editor e alinhar o conte\u00fado do bloco. Seu bloco deve agora exibir orgulhosamente uma Barra de Ferramentas de Alinhamento.<\/p>\n<figure id=\"attachment_134009\" aria-describedby=\"caption-attachment-134009\" style=\"width: 1772px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134009 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/alignment-toolbar.jpg\" alt=\"Nosso bloco agora tem uma Barra de Ferramentas de Alinhamento\" width=\"1772\" height=\"702\"><figcaption id=\"caption-attachment-134009\" class=\"wp-caption-text\">Nosso bloco agora tem uma Barra de Ferramentas de Alinhamento<\/figcaption><\/figure>\n<p>Mas se voc\u00ea salvar o artigo, ver\u00e1 que o conte\u00fado do seu bloco n\u00e3o est\u00e1 alinhado no frontend como est\u00e1 no editor do bloco. Isso porque precisamos modificar a fun\u00e7\u00e3o de <code>save<\/code> para armazenar o conte\u00fado e os atributos do bloco no banco de dados.<\/p>\n<h4>Passo 5: Salve os dados<\/h4>\n<p>Abra o <strong>save.js<\/strong> e mude a fun\u00e7\u00e3o <code>save<\/code> da seguinte forma:<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ attributes.content } \n\t\t\tstyle={ { textAlign: attributes.align } }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Finalmente, para tornar o c\u00f3digo mais leg\u00edvel, voc\u00ea pode extrair as propriedades individuais do objeto <code>attribute<\/code> usando a <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Operators\/Destructuring_assignment\">sintaxe de atribui\u00e7\u00e3o de desestrutura\u00e7\u00e3o<\/a>:<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\tconst { content, align } = attributes;\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ content } \n\t\t\tstyle={ { textAlign: align } }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Voc\u00ea pode fazer o mesmo no arquivo <strong>edit.js<\/strong>.<\/p>\n<p>Agora salve o arquivo e mude para o Editor de C\u00f3digo. O c\u00f3digo do bloco deve ser algo parecido com isto:<\/p>\n<pre><code class=\"language-html\">&lt;!-- wp:ka-example-block\/ka-example-block {\"align\":\"right\"} --&gt;\n&lt;p class=\"wp-block-ka-example-block-ka-example-block\" style=\"text-align:right\"&gt;This is my first editable &lt;strong&gt;Gutenberg&lt;\/strong&gt; &lt;em&gt;block&lt;\/em&gt; \ud83d\ude0e&lt;\/p&gt;\n&lt;!-- \/wp:ka-example-block\/ka-example-block --&gt;<\/code><\/pre>\n<figure id=\"attachment_134010\" aria-describedby=\"caption-attachment-134010\" style=\"width: 1446px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134010 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-toolbar-controls.jpg\" alt=\"Verifica\u00e7\u00e3o dos controles da barra de ferramentas do bloco\" width=\"1446\" height=\"498\"><figcaption id=\"caption-attachment-134010\" class=\"wp-caption-text\">Verifica\u00e7\u00e3o dos controles da barra de ferramentas do bloco<\/figcaption><\/figure>\n<p>E \u00e9 isso! Voc\u00ea acabou de adicionar um controle de alinhamento \u00e0 barra de ferramentas do seu bloco \ud83e\udd13<\/p>\n<p>Voc\u00ea pode ler mais sobre os <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">controles da barra de ferramentas de blocos<\/a> no Manual do Editor de Blocos.<\/p>\n<h3 id=\"settings-sidebar\">Personalizando a barra lateral de configura\u00e7\u00f5es de blocos<\/h3>\n<p>Voc\u00ea tamb\u00e9m pode adicionar controles ao bloco <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">configura\u00e7\u00f5es da barra lateral<\/a> (ou at\u00e9 mesmo criar uma nova barra lateral para o seu aplicativo).<\/p>\n<p>A API fornece um <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/inspector-controls\/README.md\">componente<code>InspectorControls<\/code><\/a> para isso.<\/p>\n<p>O Manual do Editor de Blocos explica <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/#settings-sidebar\">como usar a Barra Lateral de Configura\u00e7\u00f5es<\/a>:<\/p>\n<blockquote><p><em>A Barra lateral de configura\u00e7\u00f5es \u00e9 usada para exibir configura\u00e7\u00f5es menos utilizadas ou configura\u00e7\u00f5es que requerem mais espa\u00e7o na tela. A Barra lateral de configura\u00e7\u00f5es deve ser usada <strong>somente<\/strong> para <strong>configura\u00e7\u00f5es de n\u00edvel de bloco<\/strong><\/em>.<\/p>\n<p><em>Se voc\u00ea tem configura\u00e7\u00f5es que afetam apenas o conte\u00fado selecionado dentro de um bloco (exemplo: a configura\u00e7\u00e3o &#8220;negrito&#8221; para o texto selecionado dentro de um par\u00e1grafo): <\/em>n\u00e3o o coloque dentro da barra lateral de configura\u00e7\u00f5es.<em> A Barra lateral de configura\u00e7\u00f5es \u00e9 exibida mesmo quando se edita um bloco no modo HTML, ent\u00e3o ela s\u00f3 deve conter configura\u00e7\u00f5es de n\u00edvel de bloco.<\/em><\/p><\/blockquote>\n<p>Novamente:<\/p>\n<ol>\n<li>Importe os componentes necess\u00e1rios de um pacote WordPress<\/li>\n<li>Inclua os elementos correspondentes em seu c\u00f3digo JSX<\/li>\n<li>Defina os atributos necess\u00e1rios no arquivo block.json<\/li>\n<li>Defina os manipuladores de eventos<\/li>\n<li>Salve os dados<\/li>\n<\/ol>\n<h4>Passo 1. Importe os componentes InspectorControls e PanelColorSettings do @wordpress\/block-editor<\/h4>\n<p>Voc\u00ea pode adicionar v\u00e1rios controles para permitir que os usu\u00e1rios personalizem aspectos espec\u00edficos do bloco. Por exemplo, voc\u00ea pode fornecer um painel de controle colorido. Para fazer isso, voc\u00ea precisar\u00e1 importar os componentes <code>InspectorControls<\/code> e <code>PanelColorSettings<\/code> do m\u00f3dulo <code>block-editor<\/code>:<\/p>\n<pre><code class=\"language-js\">import { \n\tuseBlockProps, \n\tRichText, \n\tAlignmentControl, \n\tBlockControls,\n\tInspectorControls,\n\tPanelColorSettings\n} from '@wordpress\/block-editor';<\/code><\/pre>\n<h4>Passo 2: Inclua os elementos correspondentes em seu c\u00f3digo JSX<\/h4>\n<p>Agora voc\u00ea pode adicionar os elementos correspondentes ao JSX retornado pela fun\u00e7\u00e3o <code>Edit<\/code>:<\/p>\n<pre><code class=\"language-jsx\">export default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\n\tconst { content, align, backgroundColor, textColor } = attributes;\n\n\tconst onChangeContent = ( newContent ) =&gt; {\n\t\tsetAttributes( { content: newContent } )\n\t}\n\tconst onChangeAlign = ( newAlign ) =&gt; {\n\t\tsetAttributes( { \n\t\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t\t} )\n\t}\n\treturn (\n\t\t&lt;&gt;\n\t\t\t&lt;InspectorControls&gt;\n\t\t\t\t&lt;PanelColorSettings \n\t\t\t\t\ttitle={ __( 'Color settings', 'ka-example-block' ) }\n\t\t\t\t\tinitialOpen={ false }\n\t\t\t\t\tcolorSettings={ [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t  value: textColor,\n\t\t\t\t\t\t  onChange: onChangeTextColor,\n\t\t\t\t\t\t  label: __( 'Text color', 'ka-example-block' )\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t  value: backgroundColor,\n\t\t\t\t\t\t  onChange: onChangeBackgroundColor,\n\t\t\t\t\t\t  label: __( 'Background color', 'ka-example-block' )\n\t\t\t\t\t\t}\n\t\t\t\t\t] }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/InspectorControls&gt;\n\t\t\t&lt;BlockControls&gt;\n\t\t\t\t&lt;AlignmentControl\n\t\t\t\t\tvalue={ align }\n\t\t\t\t\tonChange={ onChangeAlign }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/BlockControls&gt;\n\t\t\t&lt;RichText \n\t\t\t\t{ ...blockProps }\n\t\t\t\ttagName=\"p\"\n\t\t\t\tonChange={ onChangeContent }\n\t\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\t\tvalue={ content }\n\t\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\t\tstyle={ { textAlign: align, backgroundColor: backgroundColor, color: textColor } }\n\t\t\t\/&gt;\n\t\t&lt;\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Note que n\u00f3s tamb\u00e9m atualizamos o atributo <code>style<\/code> do elemento <code>RichText<\/code>:<\/p>\n<pre><code class=\"language-jsx\">&lt;RichText \n\t { ...blockProps }\n\t tagName=\"p\"\n\t onChange={ onChangeContent }\n\t allowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t value={ content }\n\t placeholder={ __( 'Write your text...' ) }\n\t style={ { textAlign: align, backgroundColor: backgroundColor, color: textColor } }\n\/&gt;<\/code><\/pre>\n<h4>Passo 3: Defina os atributos necess\u00e1rios no block.json<\/h4>\n<p>Agora defina os atributos <code>backgroundColor<\/code> e <code>textColor<\/code> no arquivo <strong>block.json<\/strong>:<\/p>\n<pre><code class=\"language-json\">\"attributes\": {\n\t\"content\": {\n\t\t\"type\": \"string\",\n\t\t\"source\": \"html\",\n\t\t\"selector\": \"p\"\n\t},\n\t\"align\": {\n\t\t\"type\": \"string\",\n\t\t\"default\": \"none\"\n\t},\n\t\"backgroundColor\": {\n\t\t\"type\": \"string\"\n\t},\t \n\t\"textColor\": {\n\t\t\"type\": \"string\"\n\t}\n},<\/code><\/pre>\n<h4>Etapa 4: Defina os manipuladores de eventos<\/h4>\n<p>Agora voc\u00ea precisa definir duas fun\u00e7\u00f5es para atualizar <code>backgroundColor<\/code> e <code>textColor<\/code> na entrada do usu\u00e1rio:<\/p>\n<pre><code class=\"language-js\">const onChangeBackgroundColor = ( newBackgroundColor ) =&gt; {\n\tsetAttributes( { backgroundColor: newBackgroundColor } )\n}\nconst onChangeTextColor = ( newTextColor ) =&gt; {\n\tsetAttributes( { textColor: newTextColor } )\n}<\/code><\/pre>\n<h4>Passo 5: Salve os dados<\/h4>\n<p>Um \u00faltimo passo: Abra o arquivo <strong>save.js<\/strong> e mude o script como a seguir:<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\tconst { content, align, backgroundColor, textColor } = attributes;\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ content } \n\t\t\tstyle={ { textAlign: align, backgroundColor: backgroundColor, color: textColor } }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Salve o arquivo e verifique o bloco no editor. Voc\u00ea pode encontrar uma surpresa indesejada: uma mensagem de erro informando que o bloco cont\u00e9m conte\u00fado inesperado ou inv\u00e1lido.<\/p>\n<figure id=\"attachment_134011\" aria-describedby=\"caption-attachment-134011\" style=\"width: 1396px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134011 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/unexpected-or-invalid-content.jpg\" alt=\"Mensagem de erro de conte\u00fado inesperado ou inv\u00e1lido\" width=\"1396\" height=\"542\"><figcaption id=\"caption-attachment-134011\" class=\"wp-caption-text\">Mensagem de erro de conte\u00fado inesperado ou inv\u00e1lido<\/figcaption><\/figure>\n<p>Isso acontece porque o arquivo <strong>save.js<\/strong> \u00e9 alterado e o c\u00f3digo salvo no banco de dados n\u00e3o corresponde ao c\u00f3digo usado no editor.<\/p>\n<p>Para corrigir isso, atualize a p\u00e1gina, apague qualquer inst\u00e2ncia do seu bloco e adicione-a novamente ao seu artigo:<\/p>\n<figure id=\"attachment_134012\" aria-describedby=\"caption-attachment-134012\" style=\"width: 1962px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134012 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/color-settings-panel.jpg\" alt=\"O painel Configura\u00e7\u00f5es de cores no bloco Configura\u00e7\u00f5es da barra lateral\" width=\"1962\" height=\"1020\"><figcaption id=\"caption-attachment-134012\" class=\"wp-caption-text\">O painel Configura\u00e7\u00f5es de cores no bloco Configura\u00e7\u00f5es da barra lateral<\/figcaption><\/figure>\n<p>Fa\u00e7a suas mudan\u00e7as, salve o artigo e visualize-o no frontend. Agora as mudan\u00e7as que voc\u00ea fez no editor de blocos devem ser refletidas no site.<\/p>\n<figure id=\"attachment_134013\" aria-describedby=\"caption-attachment-134013\" style=\"width: 1918px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134013 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/custom-settings-applied.jpg\" alt=\"O bloco personalizado agora funciona corretamente no frontend.\" width=\"1918\" height=\"628\"><figcaption id=\"caption-attachment-134013\" class=\"wp-caption-text\">O bloco personalizado agora funciona corretamente no frontend.<\/figcaption><\/figure>\n<h3 id=\"external-link\">Adicionando e customizando um link externo<\/h3>\n<p>Nesta se\u00e7\u00e3o, voc\u00ea ir\u00e1 adicionar novos componentes ao seu tipo de bloco:<\/p>\n<ul>\n<li>Um componente <code>ExternalLink<\/code> que permite aos usu\u00e1rios adicionar um link customiz\u00e1vel ao seu bloco personalizado<\/li>\n<li>V\u00e1rios controles da barra lateral permitindo aos usu\u00e1rios personalizar as configura\u00e7\u00f5es dos links<\/li>\n<\/ul>\n<h4>Passo 1. Importe os componentes do @wordpress\/componentes<\/h4>\n<p>Agora voc\u00ea precisa importar v\u00e1rios componentes do <code>@wordpress\/components<\/code>. Abra seu arquivo edit.js e adicione a seguinte declara\u00e7\u00e3o <code>import<\/code>:<\/p>\n<pre><code class=\"language-js\">import {\n\tTextControl,\n\tPanelBody,\n\tPanelRow,\n\tToggleControl,\n\tExternalLink\n} from '@wordpress\/components';<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/panel\/README.md#panelbody\"><code>PanelBody<\/code><\/a> adiciona um cont\u00eainer colaps\u00e1vel \u00e0 barra lateral de ajustes.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/panel\/README.md#panelrow\"><code>PaneRow<\/code><\/a> produz um recipiente gen\u00e9rico para controles da barra lateral.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/text-control\/README.md\"><code>TextControl<\/code><\/a> fornece um controle de entrada de texto.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/toggle-control\/README.md\"><code>ToggleControl<\/code><\/a> fornece uma chave que permite aos usu\u00e1rios ativar\/desativar uma op\u00e7\u00e3o espec\u00edfica.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/external-link\/README.md\"><code>ExternalLink<\/code><\/a> \u00e9 um componente simples para adicionar um link externo.<\/li>\n<\/ul>\n<h4>Passo 2. Inclua os elementos correspondentes em seu c\u00f3digo JSX<\/h4>\n<p>Primeiro voc\u00ea adicionar\u00e1 o elemento <code>ExternalLink<\/code> no mesmo n\u00edvel que o <code>RichText<\/code> em um cont\u00eainer <code>div<\/code>:<\/p>\n<pre><code class=\"language-jsx\">&lt;div { ...blockProps }&gt;\n\t&lt;RichText \n\t\t...\n\t\/&gt;\n\t&lt;ExternalLink \n\t\thref={ kaLink }\n\t\tclassName=\"ka-button\"\n\t\trel={ hasLinkNofollow ? \"nofollow\" : \"\" }\n\t&gt;\n\t\t\t{ linkLabel }\n\t&lt;\/ExternalLink&gt;\n\n&lt;\/div&gt;<\/code><\/pre>\n<p>O componente <code>ExternalLink<\/code> n\u00e3o est\u00e1 documentado, ent\u00e3o n\u00f3s nos referimos ao <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/external-link\/index.js\">pr\u00f3prio componente<\/a> para obter a lista de atributos dispon\u00edveis. Aqui n\u00f3s estamos usando os atributos <code>href<\/code>, <code>className<\/code> e <code>rel<\/code>.<\/p>\n<p>Por padr\u00e3o, o valor do atributo <code>rel<\/code> est\u00e1 definido para <code>noopener noreferrer<\/code>. Nosso c\u00f3digo ir\u00e1 adicionar a <a href=\"https:\/\/kinsta.com\/pt\/blog\/adicionar-links-nofollow-no-wordpress\/\">palavra-chave<code>nofollow<\/code><\/a> ao atributo <code>rel<\/code> da tag <code>a<\/code> resultante quando o controle de altern\u00e2ncia estiver <strong>ligado<\/strong>.<\/p>\n<p>Agora voc\u00ea pode adicionar configura\u00e7\u00f5es de link \u00e0 barra lateral do bloco.<\/p>\n<p>Primeiro, voc\u00ea adicionar\u00e1 um elemento <code>PanelBody<\/code> dentro de <code>InspectorControls<\/code> no mesmo n\u00edvel do <code>PanelColorSettings<\/code>:<\/p>\n<pre><code class=\"language-jsx\">&lt;InspectorControls&gt;\n\t&lt;PanelColorSettings \n\t...\n\t\/&gt;\n\t&lt;PanelBody \n\t\ttitle={ __( 'Link Settings' )}\n\t\tinitialOpen={true}\n\t&gt;\n\t...\n\t&lt;\/PanelBody&gt;\n&lt;\/InspectorControls&gt;<\/code><\/pre>\n<p>Aqui est\u00e1 o que estamos fazendo com isto:<\/p>\n<ol>\n<li>O atributo <code>title<\/code> fornece o t\u00edtulo do painel.<\/li>\n<li><code>initialOpen<\/code> define se o painel est\u00e1 ou n\u00e3o inicialmente aberto.<\/li>\n<\/ol>\n<p>Em seguida, vamos adicionar dois elementos <code>PanelRow<\/code> dentro de <code>PanelBody<\/code>, e um elemento <code>TextControl<\/code> dentro de cada <code>PanelRow<\/code>:<\/p>\n<pre><code class=\"language-jsx\">&lt;PanelBody \n\ttitle={ __( 'Link Settings', 'ka-example-block' )}\n\tinitialOpen={true}\n&gt;\n\t&lt;PanelRow&gt;\n\t\t&lt;fieldset&gt;\n\t\t\t&lt;TextControl\n\t\t\t\tlabel={__( 'KA link', 'ka-example-block' )}\n\t\t\t\tvalue={ kaLink }\n\t\t\t\tonChange={ onChangeKaLink }\n\t\t\t\thelp={ __( 'Add your Academy link', 'ka-example-block' )}\n\t\t\t\/&gt;\n\t\t&lt;\/fieldset&gt;\n\t&lt;\/PanelRow&gt;\n\t&lt;PanelRow&gt;\n\t\t&lt;fieldset&gt;\n\t\t\t&lt;TextControl\n\t\t\t\tlabel={__( 'Link label', 'ka-example-block' )}\n\t\t\t\tvalue={ linkLabel }\n\t\t\t\tonChange={ onChangeLinkLabel }\n\t\t\t\thelp={ __( 'Add link label', 'ka-example-block' )}\n\t\t\t\/&gt;\n\t\t&lt;\/fieldset&gt;\n\t&lt;\/PanelRow&gt;\n&lt;\/PanelBody&gt;<\/code><\/pre>\n<p>O c\u00f3digo acima deve agora parecer bastante simples. Os dois controles de texto permitem que os usu\u00e1rios definam o r\u00f3tulo e a URL do link.<\/p>\n<p>N\u00f3s tamb\u00e9m adicionaremos um adicional <code>PanelRow<\/code> com um <code>ToggleControl<\/code> para ligar\/desligar uma op\u00e7\u00e3o espec\u00edfica, como a inclus\u00e3o ou n\u00e3o de um atributo:<\/p>\n<pre><code class=\"language-jsx\">&lt;PanelRow&gt;\n\t&lt;fieldset&gt;\n\t\t&lt;ToggleControl\n\t\t\tlabel=\"Add rel = nofollow\"\n\t\t\thelp={\n\t\t\t\thasLinkNofollow\n\t\t\t\t\t? 'Has rel nofollow.'\n\t\t\t\t\t: 'No rel nofollow.'\n\t\t\t}\n\t\t\tchecked={ hasLinkNofollow }\n\t\t\tonChange={ toggleNofollow }\n\t\t\/&gt;\n\t&lt;\/fieldset&gt;\n&lt;\/PanelRow&gt;<\/code><\/pre>\n<h4>Passo 3: Defina os atributos necess\u00e1rios no block.json<\/h4>\n<p>Agora defina os atributos <code>kaLink<\/code>, <code>linkLabel<\/code>, e <code>hasLinkNofollow<\/code> no arquivo <strong>block.json<\/strong>:<\/p>\n<pre><code class=\"language-json\">\"kaLink\": {\n\t\"type\": \"string\",\n\t\"default\": \"\"\n},\n\"linkLabel\": {\n\t\"type\": \"string\",\n\t\"default\": \"Check it out!\"\n},\n\"hasLinkNofollow\": {\n\t\"type\": \"boolean\",\n\t\"default\": false\n}<\/code><\/pre>\n<p>Nada mais a acrescentar aqui! Vamos passar para a defini\u00e7\u00e3o das <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Events\/Event_handlers\">fun\u00e7\u00f5es de tratamento de eventos<\/a>.<\/p>\n<h4>Passo 4: Defina os manipuladores de eventos<\/h4>\n<p>Volte para o arquivo <strong>edit.js<\/strong>, adicione os novos atributos ao objeto de atributos, e adicione as seguintes fun\u00e7\u00f5es:<\/p>\n<pre><code class=\"language-js\">const { content, align, backgroundColor, textColor, kaLink, linkLabel, hasLinkNofollow } = attributes;\n\nconst onChangeKaLink = ( newKaLink ) =&gt; {\n\tsetAttributes( { kaLink: newKaLink === undefined ? '' : newKaLink } )\n}\n\nconst onChangeLinkLabel = ( newLinkLabel ) =&gt; {\n\tsetAttributes( { linkLabel: newLinkLabel === undefined ? '' : newLinkLabel } )\n}\n\nconst toggleNofollow = () =&gt; {\n\tsetAttributes( { hasLinkNofollow: ! hasLinkNofollow } )\n}<\/code><\/pre>\n<p>Estas fun\u00e7\u00f5es atualizam os valores dos atributos correspondentes na entrada do usu\u00e1rio.<\/p>\n<h4>Passo 5: Salve os dados<\/h4>\n<p>Por \u00faltimo, temos que atualizar a fun\u00e7\u00e3o <code>save<\/code> no <strong>save.js<\/strong>:<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\t\n\tconst { content, align, backgroundColor, textColor, kaLink, linkLabel, hasLinkNofollow } = attributes;\n\n\tconst blockProps = useBlockProps.save( {\n\t\tclassName: `has-text-align-${ align }`\n\t} );\n\t\n\treturn (\n\t\t&lt;div \n\t\t\t{ ...blockProps }\n\t\t\tstyle={ { backgroundColor: backgroundColor } }\n\t\t&gt;\n\t\t\t&lt;RichText.Content \n\t\t\t\ttagName=\"p\" \n\t\t\t\tvalue={ content } \n\t\t\t\tstyle={ { color: textColor } }\n\t\t\t\/&gt;\n\t\t\t&lt;p&gt;\n\t\t\t\t&lt;a \n\t\t\t\t\thref={ kaLink }\n\t\t\t\t\tclassName=\"ka-button\"\n\t\t\t\t\trel={ hasLinkNofollow ? \"nofollow\" : \"noopener noreferrer\" }\n\t\t\t\t&gt;\n\t\t\t\t\t{ linkLabel }\n\t\t\t\t&lt;\/a&gt;\n\t\t\t&lt;\/p&gt;\n\t\t&lt;\/div&gt;\n\t);\n}<\/code><\/pre>\n<p>Note que aqui n\u00f3s usamos um elemento regular <code>a<\/code> ao inv\u00e9s de <code>ExternalLink.<\/code><\/p>\n<p>Voc\u00ea pode ver o resultado na imagem abaixo.<\/p>\n<figure id=\"attachment_134015\" aria-describedby=\"caption-attachment-134015\" style=\"width: 1964px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134015 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/link-settings.jpg\" alt=\"A barra lateral de configura\u00e7\u00f5es de link no bloco\" width=\"1964\" height=\"1146\"><figcaption id=\"caption-attachment-134015\" class=\"wp-caption-text\">A barra lateral de configura\u00e7\u00f5es de link no bloco<\/figcaption><\/figure>\n<h3 id=\"multiple-block-styles\">Adicionando m\u00faltiplos estilos de bloco<\/h3>\n<p>Em uma se\u00e7\u00e3o anterior, voc\u00ea aprendeu como adicionar um controle de barra de ferramentas de bloco permitindo que os usu\u00e1rios alinhem a entrada do usu\u00e1rio. N\u00f3s podemos adicionar mais controles de estilo \u00e0 barra de ferramentas do bloco, mas tamb\u00e9m podemos fornecer um conjunto de estilos de bloco predefinidos que o usu\u00e1rio pode escolher com um \u00fanico clique.<\/p>\n<p>Para este prop\u00f3sito, n\u00f3s vamos usar um recurso \u00fatil do API do Bloco: <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#block-styles\">Estilos de Bloco<\/a>.<\/p>\n<p>Tudo o que voc\u00ea precisa fazer \u00e9 definir a propriedade <strong>block.json<\/strong> <code>styles<\/code> e declarar os estilos correspondentes no stylesheets (folhas de estilo).<\/p>\n<p>Por exemplo, voc\u00ea pode adicionar a seguinte gama de estilos:<\/p>\n<pre><code class=\"language-json\">\"styles\": [\n\t{\n\t\t\"name\": \"default\",\n\t\t\"label\": \"Default\",\n\t\t\"isDefault\": true\n\t},\n\t{\n\t\t\"name\": \"border\",\n\t\t\"label\": \"Border\"\n\t}\n],<\/code><\/pre>\n<p>Com isso, voc\u00ea acabou de adicionar um estilo padr\u00e3o e um estilo adicional chamado <code>border<\/code>. Agora volte para o editor de blocos:<\/p>\n<figure id=\"attachment_134064\" aria-describedby=\"caption-attachment-134064\" style=\"width: 1874px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134064 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-styles.jpg\" alt=\"Dois estilos de blocos pr\u00e9-constru\u00eddos.\" width=\"1874\" height=\"1034\"><figcaption id=\"caption-attachment-134064\" class=\"wp-caption-text\">Dois estilos de blocos pr\u00e9-constru\u00eddos.<\/figcaption><\/figure>\n<p>Os estilos estar\u00e3o dispon\u00edveis para o usu\u00e1rio clicando na <a href=\"https:\/\/kinsta.com\/pt\/blog\/wordpress-5-8\/#normalized-block-toolbars\">chave de bloco<\/a> e depois procurando pelo <strong>Styles panel<\/strong> na <strong>Block Settings Sidebar<\/strong>.<\/p>\n<p>Selecione um estilo e verifique as classes aplicadas ao elemento <code>p<\/code>. Clique com o bot\u00e3o direito do mouse sobre o bloco e <strong>Inspect<\/strong>. Uma nova classe foi adicionada com um nome estruturado como a seguir:<\/p>\n<pre><code class=\"language-css\">is-style-{style-name}<\/code><\/pre>\n<p>Se voc\u00ea verificou o estilo &#8220;Border&#8221;, ent\u00e3o uma classe <code>is-style-border<\/code> ser\u00e1 adicionada ao elemento <code>p<\/code>. Se voc\u00ea marcou o estilo &#8220;Default&#8221;, ent\u00e3o uma classe <code>is-style-default<\/code> ser\u00e1 adicionada ao inv\u00e9s disso.<\/p>\n<p>Agora voc\u00ea s\u00f3 tem que declarar as propriedades do CSS. Abra o arquivo <strong>editor.scss<\/strong> e substitua os estilos atuais com o seguinte:<\/p>\n<pre><code class=\"language-css\">.wp-block-ka-example-block-ka-example-block {\n    padding: 4px;\n}<\/code><\/pre>\n<p>Agora voc\u00ea pode fazer o mesmo com <strong>style.scss<\/strong>. Como mencionamos acima, os estilos definidos em <strong>style.scss<\/strong> s\u00e3o aplicados tanto no frontend quanto no editor:<\/p>\n<pre><code class=\"language-css\">.wp-block-ka-example-block-ka-example-block {\n\t&.is-style-default{\n\t\tborder: 0;\n        background-color: #FFE2C7;\n\t}\n\t&.is-style-border{\n\t\tborder: 2px solid #000;\n        border-radius: 16px;\n        background-color: #F6F6F6;\n\t}\n}<\/code><\/pre>\n<p>E \u00e9 isso a\u00ed! Refresque a p\u00e1gina, e divirta-se com seus novos estilos de blocos:<\/p>\n<figure id=\"attachment_134067\" aria-describedby=\"caption-attachment-134067\" style=\"width: 1876px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134067 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-styles-compared.jpg\" alt=\"Estilos de blocos comparados\" width=\"1876\" height=\"960\"><figcaption id=\"caption-attachment-134067\" class=\"wp-caption-text\">Estilos de blocos comparados<\/figcaption><\/figure>\n<h3 id=\"innerblocks-component\">Agrupando blocos Gutenberg com o componente InnerBlocks<\/h3>\n<p>Embora totalmente funcional, nosso bloco personalizado ainda n\u00e3o \u00e9 muito atrativo. Para torn\u00e1-lo mais atrativo para o p\u00fablico, poder\u00edamos acrescentar uma imagem.<\/p>\n<p>Isto pode acrescentar uma camada de complexidade ao nosso bloco, mas felizmente, voc\u00ea n\u00e3o precisa reinventar a roda porque Gutenberg fornece um componente espec\u00edfico que voc\u00ea pode usar para criar uma estrutura de <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/nested-blocks-inner-blocks\/\">blocos agrupados<\/a>.<\/p>\n<p>O componente <code>InnerBlocks<\/code> \u00e9 <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/inner-blocks\/README.md\">definido da seguinte forma<\/a>:<\/p>\n<blockquote><p><em>O<code>InnerBlocks<\/code> exporta um par de componentes que podem ser usados em implementa\u00e7\u00f5es de blocos para permitir o conte\u00fado de blocos agrupados.<\/em><\/p><\/blockquote>\n<p>Primeiro, voc\u00ea precisar\u00e1 criar um novo arquivo <strong>.js<\/strong> na pasta <strong>src<\/strong>. Em nosso exemplo, n\u00f3s chamaremos este arquivo <strong>container.js<\/strong>.<\/p>\n<p>Agora voc\u00ea precisar\u00e1 importar o novo recurso para o arquivo <strong>index.js<\/strong>:<\/p>\n<pre><code class=\"language-js\">import '.\/container';<\/code><\/pre>\n<p>Volte para <strong>container.js<\/strong> e importe os componentes necess\u00e1rios:<\/p>\n<pre><code class=\"language-js\">import { registerBlockType } from \"@wordpress\/blocks\";\nimport { __ } from \"@wordpress\/i18n\";\nimport {\n\tuseBlockProps, \n\tInnerBlocks \n} from \"@wordpress\/block-editor\";<\/code><\/pre>\n<p>O pr\u00f3ximo passo \u00e9 definir um modelo fornecendo a estrutura dentro da qual os blocos ser\u00e3o colocados. No exemplo a seguir, definimos um modelo que consiste em duas colunas contendo um bloco de imagem central e nosso bloco personalizado:<\/p>\n<pre><code class=\"language-js\">const TEMPLATE = [ [ 'core\/columns', { backgroundColor: 'yellow', verticalAlignment: 'center' }, [\n\t[ 'core\/column', { templateLock: 'all' }, [\n\t\t[ 'core\/image' ],\n\t] ],\n\t[ 'core\/column', { templateLock: 'all' }, [\n\t\t[ 'ka-example-block\/ka-example-block', { placeholder: 'Enter side content...' } ],\n\t] ],\n] ] ];<\/code><\/pre>\n<p>O modelo \u00e9 estruturado como um <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/docs\/reference-guides\/block-api\/block-templates.md\">conjunto de tipos de bloco<\/a> (nome do bloco e atributos opcionais).<\/p>\n<p>No c\u00f3digo acima, usamos v\u00e1rios atributos para configurar as Colunas e Blocos de Colunas. Especificamente, o atributo <code>templateLock: 'all'<\/code> bloqueia os blocos de colunas para que o usu\u00e1rio n\u00e3o adicione, reordene ou exclua blocos existentes. <code>templateLock<\/code> pode assumir um dos seguintes valores:<\/p>\n<ul>\n<li><code>all<\/code> &#8211; <code>InnerBlocks<\/code> est\u00e1 bloqueado, e nenhum bloco pode ser adicionado, reordenado ou removido.<\/li>\n<li><code>insert<\/code> &#8211; Os blocos s\u00f3 podem ser reordenados ou removidos.<\/li>\n<li><code>false<\/code> &#8211; O modelo n\u00e3o est\u00e1 bloqueado.<\/li>\n<\/ul>\n<p>O modelo \u00e9 ent\u00e3o designado para o elemento <code>InnerBlocks<\/code>:<\/p>\n<pre><code class=\"language-jsx\">&lt;InnerBlocks\n\ttemplate={ TEMPLATE }\n\ttemplateLock=\"all\"\n\/&gt;<\/code><\/pre>\n<p>Para evitar qualquer problema de compatibilidade, n\u00f3s tamb\u00e9m adicionamos um atributo <code>templateLock<\/code> ao componente <code>InnerBlocks<\/code> (veja tamb\u00e9m o n\u00famero #<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/issues\/17262\">17262<\/a> e o n\u00famero #<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/26128\">26128<\/a>).<\/p>\n<p>Aqui est\u00e1 nosso arquivo final <strong>container.js:<\/strong><\/p>\n<pre><code class=\"language-jsx\">registerBlockType('ka-example-block\/ka-example-container-block', {\n\ttitle: __( 'KA Container block', 'ka-example-block' ),\n\tcategory: 'design',\n\n\tedit( { className } ) {\n\t\t\n\t\treturn(\n\t\t\t&lt;div className={ className }&gt;\n\t\t\t\t&lt;InnerBlocks\n\t\t\t\t\ttemplate={ TEMPLATE }\n\t\t\t\t\ttemplateLock=\"all\"\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/div&gt;\n\t\t)\n\t},\n\n\tsave() {\n\t\tconst blockProps = useBlockProps.save();\n\t\treturn(\n\t\t\t&lt;div { ...blockProps }&gt;\n\t\t\t\t&lt;InnerBlocks.Content \/&gt;\n\t\t\t&lt;\/div&gt;\n\t\t)\n\t},\n});<\/code><\/pre>\n<figure id=\"attachment_134068\" aria-describedby=\"caption-attachment-134068\" style=\"width: 2060px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134068 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/09\/block-final.jpg\" alt=\"O bloco final no editor de blocos\" width=\"2060\" height=\"1326\"><figcaption id=\"caption-attachment-134068\" class=\"wp-caption-text\">O bloco final no editor de blocos<\/figcaption><\/figure>\n<h3 id=\"additional-improvements\">Melhorias adicionais<\/h3>\n<p>Nosso bloco \u00e9 totalmente funcional, mas n\u00f3s poder\u00edamos melhor\u00e1-lo um pouco com algumas pequenas mudan\u00e7as.<\/p>\n<p>N\u00f3s atribu\u00edmos o atributo <code>backgroundColor<\/code> ao par\u00e1grafo gerado pelo componente <code>RichText<\/code>. Entretanto, podemos preferir atribuir a cor de fundo ao recipiente <code>div<\/code>:<\/p>\n<p>Ent\u00e3o, mude o arquivo <strong>edit.js<\/strong> e <strong>salve.js<\/strong> <code>div<\/code>s da seguinte forma:<\/p>\n<pre><code class=\"language-jsx\">&lt;div \n\t{ ...blockProps }\n\tstyle={ { backgroundColor: backgroundColor } }\n&gt;\n...\n&lt;\/div&gt;<\/code><\/pre>\n<p>Isto permitir\u00e1 que o usu\u00e1rio mude o fundo do bloco inteiro.<\/p>\n<p>Por outro lado, uma mudan\u00e7a mais relevante envolve o m\u00e9todo <code>useBlockProps<\/code>. No c\u00f3digo original, n\u00f3s definimos a constante <code>blockProps<\/code> como segue:<\/p>\n<pre><code class=\"language-js\">const blockProps = useBlockProps();<\/code><\/pre>\n<p>Mas n\u00f3s podemos usar o <code>useBlockProps<\/code> mais efetivamente <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">passando um conjunto de propriedades<\/a>. Por exemplo, n\u00f3s podemos importar <code>classnames<\/code> do m\u00f3dulo <code>classnames<\/code> e definir o nome da classe do pacote de acordo.<\/p>\n<p>No exemplo a seguir, n\u00f3s atribu\u00edmos um nome de classe baseado no valor do atributo <code>align<\/code> (<strong>edit.js<\/strong>).<\/p>\n<pre><code class=\"language-js\">import classnames from 'classnames';\n\n...\n\nexport default function Edit( { attributes, setAttributes } ) {\n\t...\n\t\n\tconst onChangeAlign = ( newAlign ) =&gt; {\n\t\tsetAttributes( { \n\t\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t\t} )\n\t}\n\n\tconst blockProps = useBlockProps( {\n\t\tclassName: `has-text-align-${ align }`\n\t} );\n\t...\n}<\/code><\/pre>\n<p>N\u00f3s faremos a mesma mudan\u00e7a no arquivo <strong>save.js:<\/strong><\/p>\n<pre><code class=\"language-js\">import classnames from 'classnames';\n\n...\n\nexport default function save( { attributes } ) {\n\t...\n\tconst { content, align, backgroundColor, textColor, kaLink, linkLabel, hasLinkNofollow } = attributes;\n\n\tconst blockProps = useBlockProps.save( {\n\t\tclassName: `has-text-align-${ align }`\n\t} );\n\t...\n}<\/code><\/pre>\n<p>E isso \u00e9 um final! Agora voc\u00ea pode <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-scripts\/#build\">executar o desenvolvimento para produ\u00e7\u00e3o<\/a>:<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n\n<h2>Resumo<\/h2>\n<p>E aqui estamos n\u00f3s, no final desta incr\u00edvel jornada! N\u00f3s come\u00e7amos com a configura\u00e7\u00e3o do ambiente de desenvolvimento e acabamos criando um tipo de bloco completo.<\/p>\n<p>Como mencionamos na introdu\u00e7\u00e3o, um conhecimento s\u00f3lido do Node.js, Webpack, Babel e React \u00e9 essencial para criar blocos Gutenberg avan\u00e7ados e se posicionar no mercado como um desenvolvedor Gutenberg profissional.<\/p>\n<p>Mas voc\u00ea n\u00e3o precisa ter experi\u00eancia de React estabelecida para come\u00e7ar a se divertir com o desenvolvimento de blocos. O desenvolvimento de blocos pode lhe dar motiva\u00e7\u00e3o e objetivos para ganhar habilidades cada vez mais amplas nas tecnologias por tr\u00e1s dos blocos Gutenberg.<\/p>\n<p>Este guia, portanto, est\u00e1 longe de ser completo. \u00c9 apenas uma introdu\u00e7\u00e3o a uma grande variedade de t\u00f3picos que ir\u00e3o ajud\u00e1-lo a come\u00e7ar a construir seus primeiros blocos Gutenberg.<\/p>\n<p>Por esta raz\u00e3o, n\u00f3s recomendamos que voc\u00ea aprofunde seu conhecimento lendo cuidadosamente a documenta\u00e7\u00e3o e os guias online. Entre os muitos recursos dispon\u00edveis l\u00e1 fora, n\u00f3s recomendamos o seguinte:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">Tutorial Oficial Criar um Tutorial de Blocos<\/a> para iniciantes<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/\">Tutorial Oficial de Bloco<\/a> para desenvolvedores intermedi\u00e1rios<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/creating-dynamic-blocks\/\">Blocos Din\u00e2micos<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/pt\/blog\/blocos-dinamicos-gutenberg\/\">Como Criar Blocos Din\u00e2micos para Gutenberg<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/metabox\/\" target=\"_blank\" rel=\"noopener noreferrer\">Meta Boxes<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/plugin-sidebar-0\/\">Criando uma barra lateral para o seu Plugin<\/a><\/li>\n<\/ul>\n<p>Se voc\u00ea est\u00e1 apenas come\u00e7ando com o desenvolvimento do WordPress, voc\u00ea pode querer entender os conceitos b\u00e1sicos de desenvolvimento frontend. Aqui est\u00e1 uma lista r\u00e1pida de recursos que podem ajudar voc\u00ea a come\u00e7ar:<\/p>\n<ul>\n<li><a href=\"https:\/\/kinsta.com\/pt\/ebooks\/wordpress\/wordpress-desenvolvimento-local\/\">Como instalar o WordPress localmente<\/a> (ebook gratuito)<\/li>\n<li><a href=\"https:\/\/kinsta.com\/pt\/ebooks\/wordpress\/hospedagem-gerenciada-wordpress\/\">O verdadeiro valor da hospedagem gerenciada de WordPress<\/a> (ebook gratuito)<\/li>\n<li><a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-javascript\/\">O que \u00e9 JavaScript?<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/pt\/blog\/html-vs-html5\/\">HTML vs HTML5<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/pt\/blog\/css-wordpress\/\">Como editar CSS no WordPress<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-php\/\">O que \u00e9 PHP?<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/\">O WordPress Hooks Bootcamp: Como Usar A\u00e7\u00f5es, Filtros e Hooks Personalizados<\/a><\/li>\n<\/ul>\n<p>E lembre-se que o c\u00f3digo completo dos exemplos deste guia est\u00e1 <a href=\"https:\/\/gist.github.com\/carlodaniele\/5f3dba8fff19d8ea836bdef5a2be7556\">dispon\u00edvel no Gist<\/a>.<\/p>\n<p>Agora \u00e9 \u00e0 sua vez: Voc\u00ea j\u00e1 desenvolveu algum bloco Gutenberg? Quais s\u00e3o as principais dificuldades que voc\u00ea experimentou at\u00e9 agora? Informe-nos sobre \u00e0 sua experi\u00eancia nos coment\u00e1rios!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Muitas pessoas reclamam sobre os obst\u00e1culos para come\u00e7ar a construir blocos e aplicativos Gutenberg. A curva de aprendizado \u00e9 \u00edngreme, principalmente devido \u00e0 dificuldade de instalar &#8230;<\/p>\n","protected":false},"author":36,"featured_media":44796,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[518,439,65],"topic":[1026],"class_list":["post-44791","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-block-editor","tag-development","tag-gutenberg","topic-desenvolvimento-wordpress"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Construindo Blocos Personalizados no Gutenberg : O Tutorial Definitivo Sobre o Desenvolvimento de Blocos<\/title>\n<meta name=\"description\" content=\"Construir blocos Gutenberg pode parecer assustador no in\u00edcio. Mas n\u00e3o \u00e9! Este guia aprofundado lhe mostrar\u00e1 como criar seu primeiro bloco WP.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Construindo Blocos Personalizados no Gutenberg : O Tutorial Definitivo Sobre o Desenvolvimento de Blocos\" \/>\n<meta property=\"og:description\" content=\"Construir blocos Gutenberg pode parecer assustador no in\u00edcio. Mas n\u00e3o \u00e9! Este guia aprofundado lhe mostrar\u00e1 como criar seu primeiro bloco WP.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2021-10-21T11:55:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-02-07T13:55:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/10\/Gutenberg-blocks_Blog_cover.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Carlo Daniele\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Construir blocos Gutenberg pode parecer assustador no in\u00edcio. Mas n\u00e3o \u00e9! Este guia aprofundado lhe mostrar\u00e1 como criar seu primeiro bloco WP.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/10\/Gutenberg-blocks_Blog_cover.png\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"54 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Construindo Blocos Personalizados no Gutenberg : O Tutorial Definitivo Sobre o Desenvolvimento de Blocos\",\"datePublished\":\"2021-10-21T11:55:41+00:00\",\"dateModified\":\"2025-02-07T13:55:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/\"},\"wordCount\":9165,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/10\/Gutenberg-blocks_Blog_cover.png\",\"keywords\":[\"Block Editor\",\"development\",\"Gutenberg\"],\"articleSection\":[\"Desenvolvimento WordPress\"],\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/\",\"name\":\"Construindo Blocos Personalizados no Gutenberg : O Tutorial Definitivo Sobre o Desenvolvimento de Blocos\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/10\/Gutenberg-blocks_Blog_cover.png\",\"datePublished\":\"2021-10-21T11:55:41+00:00\",\"dateModified\":\"2025-02-07T13:55:40+00:00\",\"description\":\"Construir blocos Gutenberg pode parecer assustador no in\u00edcio. Mas n\u00e3o \u00e9! Este guia aprofundado lhe mostrar\u00e1 como criar seu primeiro bloco WP.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/10\/Gutenberg-blocks_Blog_cover.png\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/10\/Gutenberg-blocks_Blog_cover.png\",\"width\":1460,\"height\":730,\"caption\":\"Construindo Blocos Personalizados Gutenberg: O Tutorial Definitivo de Desenvolvimento de Blocos\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Desenvolvimento WordPress\",\"item\":\"https:\/\/kinsta.com\/pt\/topicos\/desenvolvimento-wordpress\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Construindo Blocos Personalizados no Gutenberg : O Tutorial Definitivo Sobre o Desenvolvimento de Blocos\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/pt\/#website\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"caption\":\"Carlo Daniele\"},\"description\":\"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.\",\"sameAs\":[\"https:\/\/frammentidicodice.com\/\",\"https:\/\/x.com\/carlodaniele\"],\"url\":\"https:\/\/kinsta.com\/pt\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Construindo Blocos Personalizados no Gutenberg : O Tutorial Definitivo Sobre o Desenvolvimento de Blocos","description":"Construir blocos Gutenberg pode parecer assustador no in\u00edcio. Mas n\u00e3o \u00e9! Este guia aprofundado lhe mostrar\u00e1 como criar seu primeiro bloco WP.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/","og_locale":"pt_PT","og_type":"article","og_title":"Construindo Blocos Personalizados no Gutenberg : O Tutorial Definitivo Sobre o Desenvolvimento de Blocos","og_description":"Construir blocos Gutenberg pode parecer assustador no in\u00edcio. Mas n\u00e3o \u00e9! Este guia aprofundado lhe mostrar\u00e1 como criar seu primeiro bloco WP.","og_url":"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2021-10-21T11:55:41+00:00","article_modified_time":"2025-02-07T13:55:40+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/10\/Gutenberg-blocks_Blog_cover.png","type":"image\/png"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"Construir blocos Gutenberg pode parecer assustador no in\u00edcio. Mas n\u00e3o \u00e9! Este guia aprofundado lhe mostrar\u00e1 como criar seu primeiro bloco WP.","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/10\/Gutenberg-blocks_Blog_cover.png","twitter_creator":"@carlodaniele","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Carlo Daniele","Tempo estimado de leitura":"54 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Construindo Blocos Personalizados no Gutenberg : O Tutorial Definitivo Sobre o Desenvolvimento de Blocos","datePublished":"2021-10-21T11:55:41+00:00","dateModified":"2025-02-07T13:55:40+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/"},"wordCount":9165,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/10\/Gutenberg-blocks_Blog_cover.png","keywords":["Block Editor","development","Gutenberg"],"articleSection":["Desenvolvimento WordPress"],"inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/","url":"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/","name":"Construindo Blocos Personalizados no Gutenberg : O Tutorial Definitivo Sobre o Desenvolvimento de Blocos","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/10\/Gutenberg-blocks_Blog_cover.png","datePublished":"2021-10-21T11:55:41+00:00","dateModified":"2025-02-07T13:55:40+00:00","description":"Construir blocos Gutenberg pode parecer assustador no in\u00edcio. Mas n\u00e3o \u00e9! Este guia aprofundado lhe mostrar\u00e1 como criar seu primeiro bloco WP.","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/10\/Gutenberg-blocks_Blog_cover.png","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/10\/Gutenberg-blocks_Blog_cover.png","width":1460,"height":730,"caption":"Construindo Blocos Personalizados Gutenberg: O Tutorial Definitivo de Desenvolvimento de Blocos"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/pt\/blog\/blocos-personalizados-gutenberg\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"Desenvolvimento WordPress","item":"https:\/\/kinsta.com\/pt\/topicos\/desenvolvimento-wordpress\/"},{"@type":"ListItem","position":3,"name":"Construindo Blocos Personalizados no Gutenberg : O Tutorial Definitivo Sobre o Desenvolvimento de Blocos"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/pt\/#website","url":"https:\/\/kinsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","caption":"Carlo Daniele"},"description":"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.","sameAs":["https:\/\/frammentidicodice.com\/","https:\/\/x.com\/carlodaniele"],"url":"https:\/\/kinsta.com\/pt\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/44791","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/comments?post=44791"}],"version-history":[{"count":15,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/44791\/revisions"}],"predecessor-version":[{"id":61821,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/44791\/revisions\/61821"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/44791\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/44791\/translations\/fr"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/44791\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/44791\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/44791\/translations\/pt"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/44791\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/44791\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/44791\/translations\/jp"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/44791\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/44791\/translations\/se"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/44791\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/44796"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=44791"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=44791"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=44791"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}