{"id":228774,"date":"2022-10-16T11:11:00","date_gmt":"2022-10-16T08:11:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228774"},"modified":"2022-11-09T04:13:31","modified_gmt":"2022-11-09T01:13:31","slug":"usando-php-para-renderizar-um-bloco-no-editor-do-wordpress-gutenberg","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/usando-php-para-renderizar-um-bloco-no-editor-do-wordpress-gutenberg\/","title":{"rendered":"Usando PHP para renderizar um bloco no editor do WordPress (Gutenberg)"},"content":{"rendered":"\n<p><a href=\"https:\/\/hashnode.com\/@wholesomecode\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external\"><\/a><\/p>\n<p>Ao criar um bloco no WordPress Block Editor (Gutenberg), voc\u00ea provavelmente est\u00e1 usando JavaScript para renderizar o bloco no conte\u00fado de sua postagem. Neste guia, veremos como usar o PHP para renderizar o bloco, criando o que \u00e9 conhecido como &#8216;Bloco Din\u00e2mico&#8217;.<\/p>\n<p>Vamos simplificar neste guia e expandir o que j\u00e1 constru\u00edmos em nosso <a href=\"https:\/\/wholesomecode.ltd\/guides\/creating-plugin-wordpress-gutenberg\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">guia de plugins WordPress Gutenberg<\/a>. No entanto blocos din\u00e2micos s\u00e3o super \u00fateis para apresentar informa\u00e7\u00f5es mais complexas em um bloco, como um post loop.<\/p>\n<h2>Pr\u00e9-requisitos<\/h2>\n<ul>\n<li>Familiarize-se com a <a href=\"https:\/\/wholesomecode.ltd\/guides\/creating-plugin-wordpress-gutenberg\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cria\u00e7\u00e3o de plugins para WordPress Gutenberg<\/a><\/li>\n<\/ul>\n<h2>Criar PHP para o bloco din\u00e2mico<\/h2>\n<p>Se voc\u00ea ainda n\u00e3o o fez, conclua as etapas no <a href=\"https:\/\/wholesomecode.ltd\/guides\/creating-plugin-wordpress-gutenberg\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">guia de plug-ins do WordPress Gutenberg<\/a>, para ter uma \u00e1rea RichText edit\u00e1vel.<\/p>\n<p>Adicione o seguinte PHP ao seu plugin (neste exemplo <code>wholesome-plugin.php<\/code>), substituindo o bloco de c\u00f3digo que come\u00e7a com <code>register_block_type<\/code>:<\/p>\n<pre><code>register_block_type(\n  'wholesomecode\/wholesome-plugin',\n  [\n    'attributes'      =&gt; [\n      'blockText' =&gt; [\n        'default' =&gt; 'Wholesome Plugin \u2013 hello from the editor!',\n        'type'    =&gt; 'string',\n      ],\n    ],\n    'editor_script'   =&gt; 'wholesomecode-wholesome-plugin-block-editor',\n    'editor_style'    =&gt; 'wholesomecode-wholesome-plugin-block-editor',\n    'render_callback' =&gt; function( $attributes, $content) {\n      $block_text = esc_html( $attributes['blockText'] );\n      return \"&lt;p class='wp-block-wholesomecode-wholesome-plugin'&gt;$block_text&lt;\/p&gt;\";\n    },\n    'style'           =&gt; 'wholesomecode-wholesome-plugin-block',\n  ]\n);\n<\/code><\/pre>\n<h3>Atributos<\/h3>\n<p>A primeira coisa que voc\u00ea notar\u00e1 \u00e9 que redefinimos os atributos neste arquivo, e eles s\u00e3o os mesmos que definimos no <code>\/src\/index.js<\/code>arquivo em nosso guia anterior.<\/p>\n<p>A raz\u00e3o pela qual precisamos fazer isso \u00e9 para que nossa sa\u00edda possa acessar os tipos de atributo e seu conte\u00fado padr\u00e3o.<\/p>\n<h3>Renderizar retorno de chamada<\/h3>\n<p>No c\u00f3digo acima, tamb\u00e9m adicionamos o argumento <code>render_callback<\/code>\u00e0 <code>register_block_type<\/code>fun\u00e7\u00e3o. Isso lida com a sa\u00edda do bloco, substituindo a <code>save<\/code>fun\u00e7\u00e3o no <code>\/src\/index.js<\/code>arquivo.<\/p>\n<p>A <code>render_callback<\/code>fun\u00e7\u00e3o recebe dois par\u00e2metros. Estes s\u00e3o:<\/p>\n<ul>\n<li><strong><code>$attributes<\/code><\/strong>\u2014 recebe os atributos que definimos tanto no <code>attributes<\/code>argumento desta fun\u00e7\u00e3o quanto nos do <code>\/src\/index.js<\/code>arquivo<\/li>\n<li><strong><code>$content<\/code><\/strong>\u2014 recebe o que foi salvo pelo <code>save<\/code>m\u00e9todo no <code>\/src\/save.js<\/code>arquivo. Isso \u00e9 \u00fatil se estivermos renderizando <code>InnerBlocks<\/code>, que de outra forma n\u00e3o seria passado para o m\u00e9todo de renderiza\u00e7\u00e3o do PHP.<\/li>\n<\/ul>\n<p>Neste exemplo, usamos uma fun\u00e7\u00e3o an\u00f4nima para o <code>render_callback<\/code>, mas poder\u00edamos facilmente ter passado uma refer\u00eancia a uma fun\u00e7\u00e3o aqui e defini-la em outro lugar.<\/p>\n<p>Observe que n\u00e3o temos a capacidade de acessar as props no PHP render_callback, ent\u00e3o tivemos que adicionar manualmente a classe HTML \u00e0 <code>&lt;p&gt;<\/code>tag para que nossos estilos ainda funcionem (em teoria, poder\u00edamos aproveitar o <code>$content<\/code>par\u00e2metro e fazer um pouco de encontrar e substituir truques se os quis\u00e9ssemos, mas isso \u00e9 algo para outro guia).<\/p>\n<h2>Remova o m\u00e9todo de salvamento do JavaScript<\/h2>\n<p>Como mencionado anteriormente, o <code>$content<\/code>par\u00e2metro da <code>render_callback<\/code>fun\u00e7\u00e3o armazena a sa\u00edda do <code>save<\/code>m\u00e9todo JavaScript, mas observe que n\u00e3o estamos usando isso em nosso c\u00f3digo.<\/p>\n<p>No arquivo, <code>\/src\/index.js<\/code>substitua o <code>save<\/code>m\u00e9todo pelo seguinte:<\/p>\n<p>Isso diz ao m\u00e9todo save para n\u00e3o retornar nada.<\/p>\n<h3>Remover a <code>save<\/code>importa\u00e7\u00e3o<\/h3>\n<p>Enquanto estamos nisso, <strong>remova<\/strong> tamb\u00e9m a seguinte linha de <code>\/src\/index.js<\/code>:<\/p>\n<pre><code>import save from '.\/save';\n<\/code><\/pre>\n<p>Agora voc\u00ea pode excluir o <code>\/src\/save.js<\/code>arquivo tamb\u00e9m.<\/p>\n<h3>Compilando o Plugin<\/h3>\n<p>Abra o terminal, verifique se voc\u00ea est\u00e1 no diret\u00f3rio raiz do seu plugin e execute o seguinte comando:<\/p>\n<p>O script ir\u00e1 compilar. Se voc\u00ea tiver algum erro, o terminal deve inform\u00e1-lo sobre o que s\u00e3o.<\/p>\n<h2>Use o bloco din\u00e2mico<\/h2>\n<p>Agora voc\u00ea deve conseguir inserir o bloco em uma p\u00e1gina, editar seu conte\u00fado e visualiz\u00e1-lo no front-end.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-168957-61e7f94128d01.gif\" alt=\"Usando PHP para renderizar um bloco no editor do WordPress (Gutenberg)\" \/>O bloco din\u00e2mico em a\u00e7\u00e3o<\/p>\n<p>Neste exemplo b\u00e1sico, o bloco ter\u00e1 a mesma apar\u00eancia e comportamento como se voc\u00ea tivesse usado um m\u00e9todo de renderiza\u00e7\u00e3o JavaScript.<\/p>\n<ul>\n<li>D\u00ea uma olhada na cria\u00e7\u00e3o <a href=\"https:\/\/wholesomecode.ltd\/guides\/template-innerblocks-wordpress-gutenberg\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">de blocos filho aninhados com o <code>InnerBlocks<\/code>componente<\/a><\/li>\n<li>Explore <a href=\"https:\/\/wholesomecode.ltd\/guides\/post-meta-fields-store-attributes-wordpress-gutenberg\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o armazenamento de atributos do Gutenberg como meta campos de postagem<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/wholesomecode.ltd\" class=\"external external_icon\">wholesomecode.ltd<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ao criar um bloco no WordPress Block Editor (Gutenberg), voc\u00ea provavelmente est\u00e1 usando JavaScript para renderizar o bloco no conte\u00fado de sua postagem. Neste guia vamos&#8230;<\/p>\n","protected":false},"author":1,"featured_media":223841,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,941,920,806,846],"tags":[1170],"class_list":["post-228774","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-gutenberg-8","category-outro","category-php-8","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/228774","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=228774"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/228774\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/223841"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=228774"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=228774"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=228774"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}