{"id":231078,"date":"2022-12-12T20:13:00","date_gmt":"2022-12-12T17:13:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231078"},"modified":"2022-12-07T11:19:13","modified_gmt":"2022-12-07T08:19:13","slug":"uma-estrategia-para-inicializar-as-configuracoes-do-plugin","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/uma-estrategia-para-inicializar-as-configuracoes-do-plugin\/","title":{"rendered":"Uma Estrat\u00e9gia para Inicializar as Configura\u00e7\u00f5es do Plugin"},"content":{"rendered":"\n<p>Sempre que voc\u00ea estiver trabalhando em um plug-in que oferece uma p\u00e1gina para suas configura\u00e7\u00f5es, existem v\u00e1rias maneiras de salvar e recuperar as informa\u00e7\u00f5es.<\/p>\n<p>Voc\u00ea pode:<\/p>\n<ul>\n<li>use a <strong><a href=\"https:\/\/codex.wordpress.org\/Settings_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API de configura\u00e7\u00f5es<\/a><\/strong> ,<\/li>\n<li>usar uma p\u00e1gina personalizada e chamadas que s\u00e3o um h\u00edbrido dos dois,<\/li>\n<li>use algum tipo de h\u00edbrido entre <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_submenu_page\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">uma p\u00e1gina de submenu<\/a><\/strong> (ou <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_menu_page\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">uma p\u00e1gina de menu<\/a><\/strong>) e outra funcionalidade.<\/li>\n<\/ul>\n<p>Quanto mais eu trabalho com o WordPress, menos e menos me preocupo em usar a API de Configura\u00e7\u00f5es e optar por uma abordagem um pouco h\u00edbrida.<\/p>\n<p>Dependendo dos requisitos do projeto, a implementa\u00e7\u00e3o ir\u00e1 variar; no entanto, tento usar uma maneira relativamente consistente de criar a funcionalidade.<\/p>\n<p>E embora este post n\u00e3o aborde as v\u00e1rias maneiras pelas quais eu crio minhas p\u00e1ginas, classes relacionadas e assim por diante, ele oferecer\u00e1 uma maneira de inicializar as configura\u00e7\u00f5es do plug-in ao trabalhar em seu projeto ou em um projeto para outra pessoa.<\/p>\n<h2>Inicializando as configura\u00e7\u00f5es do plug-in<\/h2>\n<p>Para esta postagem, suponha que os requisitos exigem o armazenamento dos valores de uma p\u00e1gina como uma matriz associativa que \u00e9 higienizada e serializada de dentro do plug-in.<\/p>\n<p>Al\u00e9m da funcionalidade de higieniza\u00e7\u00e3o que voc\u00ea vai precisar, voc\u00ea tamb\u00e9m sabe que vai trabalhar com:<\/p>\n<ol>\n<li>a tabela de op\u00e7\u00f5es,<\/li>\n<li>e, como tal, uma chave \u00fanica para as op\u00e7\u00f5es armazenadas na tabela de op\u00e7\u00f5es<\/li>\n<\/ol>\n<p>Agora, no contexto da programa\u00e7\u00e3o orientada a objetos, normalmente tenho v\u00e1rias classes configuradas para lidar com toda essa funcionalidade, mas estou principalmente preocupado em mostrar uma maneira de inicializar as configura\u00e7\u00f5es do plug-in.<\/p>\n<h3>Mas por que?<\/h3>\n<p>Se voc\u00ea carregar uma p\u00e1gina destinada a recuperar op\u00e7\u00f5es do banco de dados e os valores n\u00e3o tiverem sido inicializados, voc\u00ea ver\u00e1 avisos na tela ou algo aparecer\u00e1 no arquivo de log de depura\u00e7\u00e3o.<\/p>\n<p>Tudo isso depende de como voc\u00ea configurou sua instala\u00e7\u00e3o local e de como seu host tem sua configura\u00e7\u00e3o definida.<\/p>\n<p>Independentemente disso, voc\u00ea quer ter certeza de que inicializou as configura\u00e7\u00f5es do plug-in para que voc\u00ea tenha pelo menos a linha definida no banco de dados e os valores iniciais ou valores vazios definidos para o plug-in.<\/p>\n<h3>Como fazer isso<\/h3>\n<p>Como mencionado anteriormente, como sou f\u00e3 de usar classes no meu trabalho, costumo configurar uma classe que \u00e9 respons\u00e1vel por ler e gravar valores no banco de dados. E isso inclui inicializar as configura\u00e7\u00f5es do plugin.<\/p>\n<p>Para fazer isso, geralmente trabalho usando o seguinte processo:<\/p>\n<ol>\n<li>inicializar a classe,<\/li>\n<li>verifique se existe uma op\u00e7\u00e3o no banco de dados,<\/li>\n<li>se n\u00e3o, ent\u00e3o inicialize-o,<\/li>\n<li>se sim, n\u00e3o fa\u00e7a nada.<\/li>\n<\/ol>\n<p>O c\u00f3digo inicial para fazer isso pode ser algo <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/5a9940d1364b4d15e1de755f78bd0a79#file-00-initialize-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Initializes the plugin settings fo ruse throughout the rest of the plugin.\n *\/\nprivate function initialize() {\n    $settings = [\n        'username' =&gt; '',\n        'user-info' =&gt; [\n              'location' =&gt; '',\n              'id-number' =&gt; '',\n              'first-name' =&gt; '',\n              'last-name' =&gt; '',\n        ],\n        'short-bio' =&gt; '',\n    ];\n    update_option('acme-plugin-settings', $settings);\n}\n<\/code><\/pre>\n<p>Mas como isso est\u00e1 em sua pr\u00f3pria fun\u00e7\u00e3o, ele pode ser chamado dentro do construtor de sua classe ou voc\u00ea pode marc\u00e1-lo como <strong>p\u00fablico<\/strong> e cham\u00e1-lo fora da classe. Para este post, por\u00e9m, estou fazendo uma chamada para ele <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/5a9940d1364b4d15e1de755f78bd0a79#file-01-constructor-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">no construtor<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Intiializes the properties of the class, primarily the array of settings.\n *\/\npublic function __construct() {\n    if (false === get_option('acme-plugin-settings')) {\n        $this-&gt;initialize();\n    }\n    \/\/ More to come...\n}\n<\/code><\/pre>\n<p>E uma vez que os valores foram inicializados, um atributo na classe <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/5a9940d1364b4d15e1de755f78bd0a79#file-02-final-constructor-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pode ser definido<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Intiializes the properties of the class, primarily the array of settings.\n *\/\npublic function __construct() {\n    if (false === get_option('acme-plugin-settings')) {\n        $this-&gt;initialize();\n    }\n    $this-&gt;settings = get_option('acme-plugin-settings');\n}\n<\/code><\/pre>\n<p>Embora haja um caso a ser feito de que isso n\u00e3o deve ser feito no construtor, eu gosto de ter propriedades de classe inicializadas dentro do construtor da referida classe.<\/p>\n<p>E como a classe \u00e9 respons\u00e1vel por manter uma refer\u00eancia \u00e0s configura\u00e7\u00f5es, faz sentido inicializar as configura\u00e7\u00f5es aqui.<\/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>Esta postagem n\u00e3o aborda v\u00e1rias maneiras de criar p\u00e1ginas de op\u00e7\u00f5es, mas oferece uma maneira de inicializar as configura\u00e7\u00f5es do plug-in.<\/p>\n","protected":false},"author":1,"featured_media":234934,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,837,806,867],"tags":[1170],"class_list":["post-231078","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","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\/231078","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=231078"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231078\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/234934"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=231078"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=231078"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=231078"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}