{"id":229070,"date":"2022-10-23T11:14:00","date_gmt":"2022-10-23T08:14:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229070"},"modified":"2022-11-09T05:25:07","modified_gmt":"2022-11-09T02:25:07","slug":"usando-um-gancho-do-wordpress-para-opcoes-de-atualizacao","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/usando-um-gancho-do-wordpress-para-opcoes-de-atualizacao\/","title":{"rendered":"Usando um gancho do WordPress para op\u00e7\u00f5es de atualiza\u00e7\u00e3o"},"content":{"rendered":"\n<p>Atualizar op\u00e7\u00f5es dentro do administrador do WordPress \u00e9 simples, certo? \u00c9 uma quest\u00e3o de preencher um campo de texto, marcar uma caixa ou trocar um bot\u00e3o de op\u00e7\u00e3o e clicar em salvar.<\/p>\n<p>Mas digamos que voc\u00ea precise configurar um gancho que dispare que tamb\u00e9m atualize uma op\u00e7\u00e3o secund\u00e1ria relacionada sempre que uma for alternada.<\/p>\n<p>Por exemplo, dada uma op\u00e7\u00e3o representada por uma caixa de sele\u00e7\u00e3o, digamos que voc\u00ea deseja definir uma op\u00e7\u00e3o no banco de dados sempre que a caixa de sele\u00e7\u00e3o estiver desmarcada e, em seguida, exclu\u00ed-la sempre que essa op\u00e7\u00e3o estiver definida.<\/p>\n<p><a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/update_option\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">H\u00e1 uma a\u00e7\u00e3o<\/a> espec\u00edfica para fazer isso que facilita bastante.<\/p>\n<h2>Um Gancho para Atualizar Op\u00e7\u00f5es<\/h2>\n<p>Antes de entrar em qualquer c\u00f3digo sobre como fazer isso, diga que a update_option fornecida foi acionada. Feito isso, voc\u00ea precisar\u00e1 configurar um retorno de chamada que seja acionado sempre que a op\u00e7\u00e3o for definida.<\/p>\n<p>Al\u00e9m disso, h\u00e1 as seguintes considera\u00e7\u00f5es:<\/p>\n<ol>\n<li>A op\u00e7\u00e3o em quest\u00e3o foi alternada?<\/li>\n<li>Em caso afirmativo, a op\u00e7\u00e3o foi definida (supondo que fosse uma caixa de sele\u00e7\u00e3o)?<\/li>\n<li>Se n\u00e3o, voc\u00ea tem um plano de como lidar com esse caso?<\/li>\n<\/ol>\n<p>Supondo que todos os itens acima tenham sido descobertos, voc\u00ea precisar\u00e1 de uma fun\u00e7\u00e3o para definir a a\u00e7\u00e3o e uma fun\u00e7\u00e3o que implemente o retorno de chamada. No meu exemplo, estarei usando programa\u00e7\u00e3o orientada a objetos, mas isso tamb\u00e9m pode ser feito em programa\u00e7\u00e3o procedural.<\/p>\n<p>No meu exemplo, estarei usando programa\u00e7\u00e3o orientada a objetos, mas isso tamb\u00e9m pode ser feito em programa\u00e7\u00e3o procedural.<\/p>\n<h3>Um exemplo<\/h3>\n<p>Digamos que voc\u00ea tenha uma op\u00e7\u00e3o chamada user_is_disguised e outro valor no banco de dados chamado user_is_superman.<\/p>\n<p>Sempre que user_is_disguised for definido como yet, user_is_superman dever\u00e1 ser definido como false. E ent\u00e3o, quando user_is_disguised \u00e9 definido como false, user_is_superman deve ser definido como true.<\/p>\n<p>Em \u00faltima an\u00e1lise, os valores mudam. Aqui est\u00e1 um exemplo de como faz\u00ea-lo. Primeiro, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1c3af0efb30c5ac8203ec225be6aa8c9#file-00-init-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">precisamos configurar o gancho<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Initializes the defined actions.\n *\/\npublic function init() {\n\n  add_action(\n    'update_option',\n    array( $this, 'toggle_other_option' ),\n    10, 3\n  );\n}\n<\/code><\/pre>\n<p>Ent\u00e3o precisamos <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1c3af0efb30c5ac8203ec225be6aa8c9#file-01-toggle_other_option-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">implementar a fun\u00e7\u00e3o<\/a> para trocar os valores:<\/p>\n<pre><code>&lt;?php\n\n\/**\n * If the given option_name is `user_is_disguised`, then toggles another option\n * in the database - `user_is_superman` - based on the specified values.\n *\n * @param string $option_name The name of the value being updated.\n * @param mixed  $old_value   The previous value of the option before updating it.\n * @param mixed  $new_value   The value of the option now that it's been updated.\n *\/\npublic function toggle_other_option( $option_name, $old_value, $new_value) {\n\n  \/\/ If 'user_is_disguised' is not being changed, then don't worry about it.\n  if (0 !== strcasecmp( $option_name, 'user_is_disguised')) {\n   return; \n  }\n\n  \/* If 'user_is_disguised' is being set, then remove the Superman value; otherwise,\n   * set it to true (but don't worry about autoloading it).\n   *\/\n  if ('1' === $new_value) {\n    delete_option( 'user_is_superman' );\n  } else {\n    update_option( 'user_is_superman', true, false );\n  }\n}\n<\/code><\/pre>\n<p>E isso deve cuidar disso.<\/p>\n<h2>Uma Nota Sobre Argumentos<\/h2>\n<p>Observe que o retorno de chamada aceita tr\u00eas argumentos (que tamb\u00e9m s\u00e3o definidos na documenta\u00e7\u00e3o vinculada acima). Eles s\u00e3o \u00fateis em outras implementa\u00e7\u00f5es menos planejadas.<\/p>\n<p>Mas talvez uma das coisas mais importantes a serem tiradas do c\u00f3digo acima \u00e9 que voc\u00ea verifique o nome da op\u00e7\u00e3o no retorno de chamada antes de alternar qualquer valor.<\/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>Atualizar op\u00e7\u00f5es no administrador do WordPress \u00e9 f\u00e1cil, mas e se voc\u00ea quiser atualizar uma segunda op\u00e7\u00e3o relacionada sempre que outra for alternada.<\/p>\n","protected":false},"author":1,"featured_media":168014,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,753,722,920,867],"tags":[1170],"class_list":["post-229070","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-codigo-aberto","category-desenvolvedor","category-outro","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229070","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=229070"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229070\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/168014"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=229070"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=229070"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=229070"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}