{"id":231275,"date":"2022-12-17T15:01:00","date_gmt":"2022-12-17T12:01:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231275"},"modified":"2022-12-17T15:01:33","modified_gmt":"2022-12-17T12:01:33","slug":"widgets-do-wordpress-refatoracao-parte-3","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/widgets-do-wordpress-refatoracao-parte-3\/","title":{"rendered":"Widgets do WordPress: Refatora\u00e7\u00e3o, Parte 3"},"content":{"rendered":"\n<p>Em termos de atualiza\u00e7\u00e3o do WordPress Widget Boilerplate (todos os quais s\u00e3o rastreados na ramifica\u00e7\u00e3o de <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">desenvolvimento<\/a> ), percorremos um longo caminho em termos de refatora\u00e7\u00e3o de como ele \u00e9 organizado.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161272-61e71e5eea22f.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-161272-61e71e5eea22f.png\" alt=\"Widgets do WordPress: Refatora\u00e7\u00e3o, Parte 3\"><\/a><\/p>\n<p>At\u00e9 agora, temos:<\/p>\n<ul>\n<li>analisamos como <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/widgets-do-wordpress-uma-abordagem-orientada-a-objetos\/\" title=\"a API do WordPress Widget fornece um exemplo\">a API do WordPress Widget fornece um exemplo<\/a> de programa\u00e7\u00e3o orientada a objetos,<\/li>\n<li>como podemos usar esta API <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/widgets-do-wordpress-detectar-programacao-orientada-a-objetos\/\" title=\"para determinar a programa\u00e7\u00e3o orientada a objetos\">para determinar a programa\u00e7\u00e3o orientada a objetos<\/a> em outras \u00e1reas do WordPress,<\/li>\n<li>ferramentas instaladas <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/widgets-do-wordpress-comecando-com-padroes\/\" title=\"para nos ajudar a avaliar a qualidade\">para nos ajudar a avaliar a qualidade<\/a> do c\u00f3digo,<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/widgets-do-wordpress-refatoracao-parte-1\/\" title=\"encontrou erros que existem atualmente no c\u00f3digo\">encontrou erros que existem atualmente no c\u00f3digo<\/a> em termos de padr\u00f5es de programa\u00e7\u00e3o modernos,<\/li>\n<li>e come\u00e7ou a reorganizar a base de c\u00f3digo para se adequar \u00e0s <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/widgets-do-wordpress-refatoracao-parte-2\/\" title=\"pr\u00e1ticas mais modernas\">pr\u00e1ticas mais modernas<\/a>.<\/li>\n<\/ul>\n<p>Agora estamos prontos para come\u00e7ar a refatorar esse c\u00f3digo de uma maneira muito mais orientada a objetos.<\/p>\n<p>Ent\u00e3o, se voc\u00ea ainda n\u00e3o conseguiu acompanhar os posts anteriores (qualquer um deles, na verdade), recomendo faz\u00ea-lo porque vai demorar um pouco para atualizar isso. H\u00e1 muito c\u00f3digo para escrever uma explica\u00e7\u00e3o.<\/p>\n<p>Vamos come\u00e7ar.<\/p>\n<h2>The WordPress Widget Boilerplate: Refatora\u00e7\u00e3o, Parte 3<\/h2>\n<p>Indiscutivelmente, o maior problema com o Boilerplate \u00e9 que tudo \u00e9 encapsulado em uma \u00fanica classe.<\/p>\n<p>Claro, existem algumas coisas legais, como manter nossas visualiza\u00e7\u00f5es separadas da l\u00f3gica do lado do servidor, mas isso \u00e9 o m\u00e1ximo.<\/p>\n<p>Outros problemas que existem apenas olhando o c\u00f3digo incluem:<\/p>\n<ul>\n<li>adicionando a\u00e7\u00f5es e filtros no construtor,<\/li>\n<li>ter m\u00e9todos fazendo mais de uma coisa,<\/li>\n<li>n\u00e3o ter classes respons\u00e1veis \u200b\u200bpor implementar coisas como registrar depend\u00eancias,<\/li>\n<li>e assim por diante.<\/li>\n<\/ul>\n<p>Neste post, vamos iniciar o processo de cria\u00e7\u00e3o de abstra\u00e7\u00f5es que eventualmente implementaremos para quebrar a natureza divina do Boilerplate como est\u00e1.<\/p>\n<p>Isso ser\u00e1 dividido em v\u00e1rios posts para que eu possa fornecer uma explica\u00e7\u00e3o s\u00f3lida sobre por que estamos fazendo certas coisas que estamos fazendo, bem como explicar os exemplos por tr\u00e1s disso.<\/p>\n<p>Se eu fizer de outra forma, a s\u00e9rie deixa de fora muitas informa\u00e7\u00f5es valiosas que s\u00e3o aplic\u00e1veis \u200b\u200ba outras pr\u00e1ticas de programa\u00e7\u00e3o orientada a objetos.<\/p>\n<h3>O que \u00e9 um Assinante?<\/h3>\n<p>O sistema de ganchos do WordPress \u2013 ou seja, as a\u00e7\u00f5es e filtros que temos dispon\u00edveis \u2013 s\u00e3o baseados em um padr\u00e3o de design orientado a eventos. Isso significa que sempre que algo acontecer, um evento, o WordPress acionar\u00e1 qualquer outro c\u00f3digo que tenha se inscrito no referido evento.<\/p>\n<p>Ent\u00e3o, quando registramos uma fun\u00e7\u00e3o com um gancho, estamos <strong>assinando<\/strong> o <strong>evento<\/strong>. Para esse fim, sou f\u00e3 de criar assinantes para qualquer gancho que precisarmos.<\/p>\n<p>Al\u00e9m disso, os assinantes geralmente seguem um formato consistente. Isso significa que \u00e9 muito f\u00e1cil criar uma classe abstrata que implementa algumas das funcionalidades consistentes e, em seguida, permite que a classe que implementa a classe abstrata se concentre apenas na l\u00f3gica de neg\u00f3cios.<\/p>\n<p>Uma das maneiras mais f\u00e1ceis de demonstrar isso \u00e9 atrav\u00e9s do assinante de arquivos CSS e JavaScript, porque s\u00e3o duas das coisas mais comuns que usamos ao construir plugins.<\/p>\n<h3>Criando uma classe abstrata<\/h3>\n<p>Antes de implementar a classe abstrata, vamos definir exatamente o que vamos fazer para cri\u00e1-la.<\/p>\n<ol>\n<li>Precisamos de uma propriedade que represente o evento ao qual estamos assinando.<\/li>\n<li>Precisamos de uma fun\u00e7\u00e3o para disparar sempre que o gancho for disparado pelo WordPress. Outra maneira de pensar sobre isso \u00e9 que precisamos de uma fun\u00e7\u00e3o para implementar sempre que uma determinada a\u00e7\u00e3o ou filtro for acionado pelo WordPress.<\/li>\n<li>Precisamos de classes para implementar a abstra\u00e7\u00e3o.<\/li>\n<\/ol>\n<p>Primeiro, vamos definir classes abstratas. <a href=\"https:\/\/secure.php.net\/manual\/en\/language.oop5.abstract.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Direto do manual do PHP<\/a>, lemos:<\/p>\n<blockquote>\n<p>Classes definidas como abstratas n\u00e3o podem ser instanciadas e qualquer classe que contenha pelo menos um m\u00e9todo abstrato tamb\u00e9m deve ser abstrata. M\u00e9todos definidos como abstratos simplesmente declaram a assinatura do m\u00e9todo \u2013 eles n\u00e3o podem definir a implementa\u00e7\u00e3o.<\/p>\n<\/blockquote>\n<p>Em resumo, isso significa que n\u00e3o podemos criar uma inst\u00e2ncia de uma classe abstrata. Podemos apenas instanciar classes que definem a implementa\u00e7\u00e3o.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161272-61e71e62f02d2.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-161272-61e71e62f02d2.png\" alt=\"Widgets do WordPress: Refatora\u00e7\u00e3o, Parte 3\"><\/a><\/p>\n<p>Isso n\u00e3o significa, por\u00e9m, que a classe abstrata n\u00e3o possa implementar coisas concretas (como a defini\u00e7\u00e3o de um gancho). Mas isso significa que existem certos m\u00e9todos que n\u00e3o t\u00eam implementa\u00e7\u00e3o.<\/p>\n<p>Caso contr\u00e1rio, ficamos apenas com uma classe b\u00e1sica.<\/p>\n<p>Faz sentido? Vamos dar uma olhada.<\/p>\n<h3>Criando uma classe abstrata<\/h3>\n<p>Para este post, vamos criar uma classe abstrata especificamente para arquivos CSS e JavaScript.<\/p>\n<p>Lembre-se, porque esta \u00e9 uma classe abstrata, os assinantes concretos podem ser chamados de algo que identifica o que eles fazem (ou seja, eles podem se chamar de qualquer coisa que represente seu prop\u00f3sito). E n\u00f3s vamos chegar a isso.<\/p>\n<p>Mas primeiro, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-00-abstract-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a classe abstrata.<\/a> Vou compartilhar o c\u00f3digo e explicar exatamente o que est\u00e1 acontecendo com ele:<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * An abstract implementation of a subscriber that requires a hook and the ability to\n * start the class.\n *\/\nabstract class AbstractSubscriber\n{\n    \/**\n     * @var string a reference to the hook to which the subscriber should be registered\n     *\/\n    protected $hook;\n\n    \/**\n     * @param string $hook the hook to which the subscriber is registered\n     *\/\n    public function __construct(string $hook)\n    {\n        $this-&gt;hook = $hook;\n    }\n\n    \/**\n     * @return string the hook to which the subscriber is registered\n     *\/\n    public function getHook(): string\n    {\n        return $this-&gt;hook;\n    }\n\n    \/**\n     * Implements the domain logic for the concrete class implementating this subcriber.\n     *\/\n    abstract public function load();\n}\n<\/code><\/pre>\n<ol>\n<li>Observe que a propriedade que criamos est\u00e1 <strong>protegida<\/strong>. Isso \u00e9 para que classes de implementa\u00e7\u00e3o possam acess\u00e1-lo, mas qualquer coisa fora dele n\u00e3o pode.<\/li>\n<li>Eu criei uma fun\u00e7\u00e3o para recuperar o gancho que ficar\u00e1 aparente mais tarde. Normalmente, detesto implementar funcionalidades que n\u00e3o sejam imediatamente \u00f3bvias, mas isso \u00e9 algo que \u00e9 importante considerando para onde estamos indo.<\/li>\n<li>Existe uma fun\u00e7\u00e3o abstrata chamada <strong>load<\/strong>. \u00c9 aqui que qualquer classe que implemente essa fun\u00e7\u00e3o abrigar\u00e1 sua l\u00f3gica de neg\u00f3cios, como veremos em breve.<\/li>\n<li>Eu gosto de documentar o prop\u00f3sito das fun\u00e7\u00f5es quando necess\u00e1rio para que elas fiquem em um s\u00f3 lugar e ent\u00e3o deixar as classes de implementa\u00e7\u00e3o fornecerem a documenta\u00e7\u00e3o que elas precisam fornecer em sua implementa\u00e7\u00e3o. Voc\u00ea ver\u00e1 isso momentaneamente, tamb\u00e9m.<\/li>\n<\/ol>\n<p>Agora que temos a classe abstrata no lugar, a \u00faltima coisa que precisamos fazer \u00e9 garantir que ela seja colocada no diret\u00f3rio apropriado e com namespace. Se voc\u00ea acompanhou a partir da postagem anterior, provavelmente conseguiu adivinhar onde ele residir\u00e1 com base no namespace no c\u00f3digo.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161272-61e71e66e7d4a.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-161272-61e71e66e7d4a.png\" alt=\"Widgets do WordPress: Refatora\u00e7\u00e3o, Parte 3\"><\/a><\/p>\n<p>E se n\u00e3o, n\u00e3o se preocupe. Descobrir namespaces e o que n\u00e3o pode levar um pouco de tempo. Ent\u00e3o, por meio dessas postagens de membros e desses exemplos, espero que fique claro com o tempo.<\/p>\n<h3>Criando classes concretas<\/h3>\n<p>Agora vamos implementar essa classe espec\u00edfica para adicionar as folhas de estilo e as fontes JavaScript que temos. O que voc\u00ea vai notar, por\u00e9m, \u00e9 que eles s\u00e3o muito semelhantes.<\/p>\n<p>A \u00fanica coisa que difere \u00e9 a implementa\u00e7\u00e3o da funcionalidade de <strong>carregamento<\/strong>, que \u00e9 exatamente como isso deve funcionar.<\/p>\n<h5>Folhas de estilo<\/h5>\n<p>Dada a classe abstrata acima, agora precisamos criar uma classe para registrar folhas de estilo. Como temos duas folhas de estilo, vamos criar duas classes:<\/p>\n<ol>\n<li>a primeira classe ser\u00e1 respons\u00e1vel por registrar a folha de estilo para o dashboard e especificamente para a p\u00e1gina do widget do WordPress,<\/li>\n<li>a segunda classe ser\u00e1 respons\u00e1vel por registrar o plugin para o pr\u00f3prio blog.<\/li>\n<\/ol>\n<p>Vamos chamar cada um desses <strong>AdminStylesheetSubscriber<\/strong> e <strong>PublicStylesheetSubscriber<\/strong> respectivamente.<\/p>\n<p>Primeiro, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-03-admin-style-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o assinante da folha de estilo do administrador<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com?\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * The subscriber responsible for loading the stylesheet on the Widget administration page.\n *\/\nclass AdminStyleAssetSubscriber extends AbstractSubscriber\n{\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function __construct(string $hook)\n    {\n        parent::__construct($hook);\n    }\n\n    \/**\n     * Adds the administrative stylesheet to the widget administration page.\n     *\/\n    public function load()\n    {\n        if ('widgets' !== get_current_screen()-&gt;id) {\n            return;\n        }\n\n        wp_enqueue_style(\n            'wordpress-widget-boilerplate',\n            plugin_dir_url(dirname(__DIR__)).'assets\/css\/admin.css'\n        );\n    }\n}\n<\/code><\/pre>\n<p>Observe que isso usa a fun\u00e7\u00e3o <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/get_current_screen\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_current_screen()<\/a> que usei em postagens anteriores para garantir que estamos adicionando depend\u00eancias apenas quando necess\u00e1rio.<\/p>\n<p>Agora, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-05-public-style-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o assinante p\u00fablico de JavaScript<\/a>. Isso usa a fun\u00e7\u00e3o <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/is_admin\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">is_admin()<\/a> para garantir que n\u00e3o estamos na \u00e1rea administrativa do WordPress.<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * The subscriber responsible for loading the stylesheet on the blog.\n *\/\nclass PublicStyleAssetSubscriber extends AbstractSubscriber\n{\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function __construct(string $hook)\n    {\n        parent::__construct($hook);\n    }\n\n    \/**\n     * Adds the stylesheet to the public-facing side of the site.\n     *\/\n    public function load()\n    {\n        if (is_admin()) {\n            return;\n        }\n\n        wp_enqueue_style(\n            'wordpress-widget-boilerplate',\n            plugin_dir_url(dirname(__DIR__)).'assets\/css\/widget.css'\n        );\n    }\n}\n<\/code><\/pre>\n<p>Obviamente, ainda temos que instanciar essas classes. Isso est\u00e1 vindo mais tarde na s\u00e9rie.<\/p>\n<h5>JavaScript<\/h5>\n<p>Os assinantes de JavaScript n\u00e3o s\u00e3o muito diferentes, como voc\u00ea deve ter adivinhado. Vamos separ\u00e1-los com base na \u00e1rea do aplicativo em que eles se concentram e os nomearemos adequadamente.<\/p>\n<p>Primeiro, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-02-admin-script-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o assinante JavaScript do administrador<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * The subscriber responsible for loading the JavaScript on the Widget's adminsitration page.\n *\/\nclass AdminScriptAssetSubscriber extends AbstractSubscriber\n{\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function __construct(string $hook)\n    {\n        parent::__construct($hook);\n    }\n\n    \/**\n     * Adds the administrative JavaScript to the widget administration page.\n     *\/\n    public function load()\n    {\n        if ('widgets' !== get_current_screen()-&gt;id) {\n            return;\n        }\n\n        wp_enqueue_script(\n            'wordpress-widget-boilerplate',\n            plugin_dir_url(dirname(__DIR__)).'assets\/js\/admin.js'\n        );\n    }\n}\n<\/code><\/pre>\n<p>E <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-04-public-script-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o assinante p\u00fablico do JavaScript:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * The subscriber responsible for loading the JavaScript on the blog.\n *\/\nclass PublicScriptAssetSubscriber extends AbstractSubscriber\n{\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function __construct(string $hook)\n    {\n        parent::__construct($hook);\n    }\n\n    \/**\n     * Adds the JavaScript to the public-facing side of the site.\n     *\/\n    public function load()\n    {\n        if (is_admin()) {\n            return;\n        }\n\n        wp_enqueue_script(\n            'wordpress-widget-boilerplate',\n            plugin_dir_url(dirname(__DIR__)).'assets\/js\/widget.js'\n        );\n    }\n}\n<\/code><\/pre>\n<p>Novamente, essas classes ainda n\u00e3o podem ser instanciadas, mas vamos nos concentrar nisso em um pr\u00f3ximo post.<\/p>\n<h2>Abstra\u00e7\u00f5es e Interfaces<\/h2>\n<p>Lembre-se de que abstra\u00e7\u00f5es e interfaces s\u00e3o diferentes, mas s\u00e3o facilmente confundidas. As interfaces cont\u00eam implementa\u00e7\u00e3o absolutamente zero. Em vez disso, eles fornecem uma garantia de que qualquer classe que implemente a interface implementar\u00e1 todos os m\u00e9todos.<\/p>\n<p>As classes abstratas, por outro lado, podem ter alguma funcionalidade implementada na classe abstrata, deixando o c\u00f3digo espec\u00edfico do dom\u00ednio \u2013 como carregar folhas de estilo e JavaScript \u2013 para o m\u00e9todo apropriado.<\/p>\n<p>Isso se tornar\u00e1 aparente, se j\u00e1 n\u00e3o ficou, quanto mais avan\u00e7armos nesta s\u00e9rie. Enquanto isso \u2013 e como de costume \u2013 n\u00e3o se esque\u00e7a de verificar o branch de <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">desenvolvimento<\/a> para ver onde estamos com o c\u00f3digo.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Indiscutivelmente, o maior problema com o Boilerplate \u00e9 que tudo \u00e9 encapsulado em uma \u00fanica classe. Ent\u00e3o vamos mudar isso com classes abstratas.<\/p>\n","protected":false},"author":1,"featured_media":235804,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[722,837,806,867],"tags":[1170],"class_list":["post-231275","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvedor","category-guia-para-iniciantes","category-php-8","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231275","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=231275"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231275\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/235804"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=231275"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=231275"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=231275"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}