{"id":233923,"date":"2023-02-24T13:34:00","date_gmt":"2023-02-24T10:34:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233923"},"modified":"2022-11-11T13:12:09","modified_gmt":"2022-11-11T10:12:09","slug":"criar-bloco-personalizado-do-gutenberg-parte-3-aderecos-e-componentes-do-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/criar-bloco-personalizado-do-gutenberg-parte-3-aderecos-e-componentes-do-wordpress\/","title":{"rendered":"Criar bloco personalizado do Gutenberg &#8211; Parte 3: adere\u00e7os e componentes do WordPress"},"content":{"rendered":"\n<p>A <a href=\"https:\/\/awhitepixel.com\/blog\/wordpress-gutenberg-create-custom-blocks-part-2-register-block\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">etapa anterior<\/a> desta s\u00e9rie de tutoriais passou por como registrar um bloco personalizado, tanto em Javascript quanto em PHP. Nesta etapa, aprenderemos como usar os componentes do WordPress para adicionar diferentes tipos de campos e configura\u00e7\u00f5es.<\/p>\n<p>Para utilizar os componentes do WordPress em nosso bloco, precisamos primeiro conhecer os adere\u00e7os.<\/p>\n<h2>Adere\u00e7os<\/h2>\n<p>Props \u00e9 um recurso importante no React e \u00e9 basicamente uma maneira de passar vari\u00e1veis \u200b\u200bou fun\u00e7\u00f5es para outros componentes. Se voc\u00ea n\u00e3o est\u00e1 familiarizado com os adere\u00e7os do React, voc\u00ea pode ler <a href=\"https:\/\/reactjs.org\/docs\/components-and-props.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o tutorial oficial do React<\/a> sobre isso.<\/p>\n<p>O WordPress fornece alguns adere\u00e7os para as fun\u00e7\u00f5es <code>edit<\/code>e em. Dentro dessas props temos acesso a coisas cr\u00edticas, como atributos e um m\u00e9todo para atualizar nossos atributos. Veremos os atributos em detalhes na <a href=\"https:\/\/awhitepixel.com\/blog\/how-to-create-custom-gutenberg-blocks-part-4-attributes\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pr\u00f3xima etapa<\/a>! <code>save``registerBlockType()<\/code><a href=\"https:\/\/awhitepixel.com\/blog\/how-to-create-custom-gutenberg-blocks-part-4-attributes\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external\"><\/a><\/p>\n<p>At\u00e9 agora, em nosso bloco, escrevemos a fun\u00e7\u00e3o for <code>edit<\/code>e <code>save<\/code>assim:<\/p>\n<pre><code>edit:() =&gt; { \n    return &lt;div&gt;:)&lt;\/div&gt; \n},<\/code><\/pre>\n<p>Voc\u00ea deve se acostumar a adicionar o par\u00e2metro <code>props<\/code>a <code>edit<\/code>and <code>save<\/code>, assim:<\/p>\n<pre><code>edit: (props) =&gt; { \n    return &lt;div&gt;:)&lt;\/div&gt; \n},<\/code><\/pre>\n<p>Agora voc\u00ea tem acesso total \u00e0 vari\u00e1vel <code>props<\/code>e tudo que ela cont\u00e9m de dentro <code>edit<\/code>e <code>save<\/code>. Se voc\u00ea estiver curioso, pode adicionar um <code>console.log(props);<\/code>na <code>edit<\/code>fun\u00e7\u00e3o antes da <code>return<\/code>instru\u00e7\u00e3o. Voc\u00ea deve ver quais adere\u00e7os est\u00e3o dispon\u00edveis no depurador do console.<\/p>\n<h2>Usando os componentes do WordPress<\/h2>\n<p>Como mencionado anteriormente, temos acesso a uma enorme biblioteca de componentes e fun\u00e7\u00f5es \u00fateis dentro do pacote global <code>wp<\/code>. Voc\u00ea encontrar\u00e1 componentes prontos para uso para qualquer tipo de componente relacionado a entrada que voc\u00ea possa imaginar. Os exemplos incluem entradas de texto, entradas de rich text, menus suspensos, altern\u00e2ncia, caixas de sele\u00e7\u00e3o, bot\u00f5es em estilos diferentes, carregador de m\u00eddia e seletores de cores. Existem tamb\u00e9m fun\u00e7\u00f5es e componentes para funcionalidades mais avan\u00e7adas. Como consultar o WordPress por conte\u00fado (postagens, categorias, etc.) com fun\u00e7\u00f5es integradas ou buscar com a API REST.<\/p>\n<p>\u00c9 mais f\u00e1cil e recomendado usar os componentes de interface do usu\u00e1rio do WordPress. Isso \u00e9 para garantir que o design e a funcionalidade sejam o mais simplificados poss\u00edvel para n\u00e3o confundir ou incomodar os usu\u00e1rios.<\/p>\n<p>Mas, infelizmente, no momento em que escrevo isso, a documenta\u00e7\u00e3o de Gutenberg \u00e9 muito escassa. Eu encontrei a melhor maneira de aprender sobre o que existe dentro do <code>wp<\/code>pacote e como os componentes funcionam, na verdade, olhando em seu reposit\u00f3rio oficial do <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Github do Gutenberg<\/a>. Alguns dos pacotes (pastas) t\u00eam um texto leia-me que oferece um pouco de documenta\u00e7\u00e3o. D\u00ea uma olhada no leia-me para um <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/button\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">bot\u00e3o<\/a> ou a <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\/toggle-control\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">altern\u00e2ncia<\/a>, por exemplo.<\/p>\n<p>O reposit\u00f3rio do Github deve corresponder ao que est\u00e1 dentro do <code>wp<\/code>pacote (dependendo de qual vers\u00e3o voc\u00ea possui e de qual branch voc\u00ea est\u00e1 procurando no Github). Isso significa que cada pasta que voc\u00ea v\u00ea no diret\u00f3rio raiz <code>packages<\/code>do Github reside no <code>wp<\/code>pacote global. Como exemplo, lembre-se de que a fun\u00e7\u00e3o que usamos na etapa anterior, <code>registerBlockType()<\/code>, estava dentro <code>wp.blocks<\/code>de, o que significa que voc\u00ea encontrar\u00e1 o c\u00f3digo-fonte dessa fun\u00e7\u00e3o exportado dentro de <code>packages\/blocks\/<\/code>.<\/p>\n<p>Como desenvolvi v\u00e1rios blocos personalizados do Gutenberg e pesquisei bastante no reposit\u00f3rio do Github, descobri que existem alguns pacotes que cont\u00eam a funcionalidade mais comum usada para criar blocos personalizados. Vou inclu\u00ed-los abaixo.<\/p>\n<p>Para uma vis\u00e3o mais completa dos componentes dispon\u00edveis, recomendo baixar meu eBook gratuito cobrindo os componentes dispon\u00edveis em Gutenberg! Ele cont\u00e9m os componentes mais comuns e \u00fateis com documenta\u00e7\u00e3o sobre props e exemplos de c\u00f3digo:<\/p>\n<h3>Uma vis\u00e3o geral r\u00e1pida dos pacotes mais comuns que voc\u00ea usar\u00e1 para blocos<\/h3>\n<p>Obviamente h\u00e1 muito mais dispon\u00edvel, mas o abaixo \u00e9 o mais comum para o desenvolvimento de blocos. Usaremos a maioria, se n\u00e3o todos, nesta s\u00e9rie de tutoriais. Sempre que voc\u00ea quiser usar um componente, voc\u00ea precisa saber em qual pacote ele est\u00e1.<\/p>\n<h4>wp.components<\/h4>\n<p>Voc\u00ea encontrar\u00e1 a maioria dos componentes de entrada da interface do usu\u00e1rio dentro do <code>wp.components<\/code>. Exemplos s\u00e3o diferentes entradas de texto, sele\u00e7\u00e3o, caixas de sele\u00e7\u00e3o, bot\u00f5es de op\u00e7\u00e3o, componentes arrast\u00e1veis, bot\u00f5es, seletor de cores, seletor de data e assim por diante. Voc\u00ea tamb\u00e9m encontrar\u00e1 componentes de interface do usu\u00e1rio que podem ser usados \u200b\u200bpara a barra de ferramentas do bloco e o conte\u00fado da barra lateral de configura\u00e7\u00f5es (chamadas InspectorControls) no editor.<\/p>\n<p>Confira as pastas no reposit\u00f3rio do <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/components\/src\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Github<\/a>.<\/p>\n<h4>wp.blockEditor e wp.editor<\/h4>\n<p>Nesses dois pacotes, voc\u00ea encontrar\u00e1 componentes \u00fateis para rich text, manipula\u00e7\u00e3o de imagens\/carregador de m\u00eddia e componentes para adicionar barras de ferramentas ou pain\u00e9is personalizados do Inspetor (barra lateral).<\/p>\n<p>No final desta s\u00e9rie, veremos a constru\u00e7\u00e3o de blocos din\u00e2micos nos quais usaremos PHP para renderizar a sa\u00edda do bloco e, para isso, usaremos um componente de <code>wp.editor<\/code>.<\/p>\n<p>Pelo que entendi, a maioria dos componentes come\u00e7ou nos <code>wp.editor<\/code>primeiros dias de Gutenberg, mas especialmente ap\u00f3s o WordPress 5.3, muitos deles foram movidos para o <code>wp.blockEditor<\/code>. Se voc\u00ea usar um componente em <code>wp.editor<\/code>que o WordPress planeja migrar para <code>wp.blockEditor<\/code>ele, n\u00e3o falhar\u00e1 a partir de agora, mas no depurador do console, voc\u00ea receber\u00e1 avisos de que ele foi preterido e que voc\u00ea deve mudar para <code>wp.blockEditor<\/code>quando puder. E reversivelmente, se voc\u00ea estiver seguindo esta s\u00e9rie com uma vers\u00e3o mais antiga do WordPress por algum motivo, poder\u00e1 encontrar erros ao chamar componentes que <code>wp.blockEditor<\/code>ainda n\u00e3o foram movidos.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151760-61e4cf23c1355.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151760-61e4cf23c1355.png\" alt=\"Criar bloco personalizado do Gutenberg - Parte 3: adere\u00e7os e componentes do WordPress\" ><\/a><\/p>\n<h4>wp.element<\/h4>\n<p>Dentro <code>wp.element<\/code>voc\u00ea encontrar\u00e1 componentes que correspondem aos componentes React. Por exemplo <code>Component<\/code>(que corresponde a <code>React.Component<\/code>) e <code>Fragment<\/code>( <code>React.Fragment<\/code>). N\u00f3s os usaremos quando come\u00e7armos a dividir nosso c\u00f3digo em componentes separados.<\/p>\n<h4>wp.i18n<\/h4>\n<p>Como o nome indica, o <code>wp.i18n<\/code>pacote cont\u00e9m fun\u00e7\u00f5es para lidar com a tradu\u00e7\u00e3o. Ele cont\u00e9m as mesmas fun\u00e7\u00f5es de tradu\u00e7\u00e3o que conhecemos no PHP; por exemplo <code>__()<\/code>e <code>_e()<\/code>. Veremos isso em detalhes em &lt;&lt;&lt;&gt;&gt;&gt;&gt; quando aprendermos como traduzir nosso bloco.<\/p>\n<h4>wp.data<\/h4>\n<p>O <code>wp.data<\/code>pacote \u00e9 para consultar o WordPress para dados fora do editor. Existem componentes para despachar mensagens <code>withSelect<\/code>e <code>select<\/code>que usaremos posteriormente nesta s\u00e9rie para consultar postagens dentro de nosso bloco.<\/p>\n<h4>wp.compose<\/h4>\n<p>O pacote anterior e <code>wp.compose<\/code>s\u00e3o para constru\u00e7\u00e3o de blocos mais avan\u00e7ada. Dentro deste pacote, encontraremos componentes e fun\u00e7\u00f5es para criar os chamados componentes de ordem superior. <a href=\"https:\/\/reactjs.org\/docs\/higher-order-components.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Componentes de ordem superior<\/a> \u00e9 uma t\u00e9cnica de padr\u00e3o no React para reutilizar componentes e l\u00f3gica, e usaremos isso em combina\u00e7\u00e3o com <code>wp.data<\/code>para consultar postagens.<\/p>\n<h2>Chega de conversa \u2013 como voc\u00ea usa alguns desses componentes na pr\u00e1tica?<\/h2>\n<p>Como mencionado anteriormente; para usar os componentes do WordPress voc\u00ea precisa saber onde eles est\u00e3o. Espero que minha vis\u00e3o geral acima combinada com o reposit\u00f3rio do <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/tree\/master\/packages\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Github<\/a> d\u00ea uma ideia de onde obt\u00ea-los.<\/p>\n<p>N\u00e3o se esque\u00e7a de que voc\u00ea sempre pode adicionar qualquer tag HTML normal, como div, span, t\u00edtulos e assim por diante. Apenas lembre-se de seguir <a href=\"https:\/\/reactjs.org\/docs\/dom-elements.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as diretrizes do React<\/a> em atributos. Por exemplo <code>class<\/code>, \u00e9 uma palavra-chave reservada no React (para criar componentes baseados em classe), portanto, se voc\u00ea deseja adicionar uma classe a um elemento HTML, precisa usar <code>className<\/code>.<\/p>\n<p>Nota: Durante o desenvolvimento, n\u00e3o se esque\u00e7a de iniciar <code>npm run start<\/code>a compila\u00e7\u00e3o do seu c\u00f3digo.<\/p>\n<p>Como um exemplo simples, vamos experimentar alguns componentes para ver como eles se parecem. N\u00f3s os desestruturamos de seus pacotes correspondentes e os utilizamos em nossa <code>edit<\/code>fun\u00e7\u00e3o.<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\nconst { RichText } = wp.blockEditor;\nconst { TextControl, TextareaControl } = wp.components;\n\u00a0\nregisterBlockType('awp\/firstblock', {\n    ...\n    edit: (props) =&gt; { \n        return (&lt;div&gt;\n                Text input:\n                &lt;TextControl \/&gt; \n                Textarea:\n                &lt;TextareaControl \/&gt;\n                Richtext:\n                &lt;RichText \/&gt;\n            &lt;\/div&gt;\n        );\n    },\n    ...\n});<\/code><\/pre>\n<p>Isso, por exemplo, resultar\u00e1 em nosso bloco assim no editor.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151760-61e4cf248ce0b.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151760-61e4cf248ce0b.png\" alt=\"Criar bloco personalizado do Gutenberg - Parte 3: adere\u00e7os e componentes do WordPress\" ><\/a><\/p>\n<p>Voc\u00ea notar\u00e1 que receber\u00e1 mensagens de erro no Console ao digit\u00e1-las e que n\u00e3o salvar\u00e1 o que voc\u00ea digitar ao atualizar a postagem (e atualizar). Isso ocorre porque nos faltam props nos componentes que s\u00e3o a conex\u00e3o com os atributos, onde todos os dados do nosso bloco s\u00e3o armazenados. As props s\u00e3o respons\u00e1veis \u200b\u200bpor passar os valores salvos e fun\u00e7\u00f5es respons\u00e1veis \u200b\u200bpor atualizar nossos atributos quando algo \u00e9 alterado em nossas entradas. Isso \u00e9 o que faremos na pr\u00f3xima etapa, onde finalmente come\u00e7aremos a escrever algum c\u00f3digo de verdade.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Na etapa anterior, registramos um bloco personalizado do Gutenberg. Nesta etapa, aprenderemos como usar os componentes do WordPress para adicionar diferentes configura\u00e7\u00f5es de tipo.<\/p>\n","protected":false},"author":1,"featured_media":151761,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,898,722,722,941,941,1110,816,816,846,846,867,867],"tags":[1170],"class_list":["post-233923","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-gutenberg-8","category-n-a","category-plug-ins","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233923","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=233923"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233923\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/151761"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=233923"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=233923"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=233923"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}