{"id":37457,"date":"2020-06-01T00:29:01","date_gmt":"2020-06-01T07:29:01","guid":{"rendered":"https:\/\/kinsta.com\/?p=72202"},"modified":"2023-08-22T04:46:21","modified_gmt":"2023-08-22T07:46:21","slug":"hooks-wordpress","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/","title":{"rendered":"Hooks Bootcamp WordPress: Como Utilizar as A\u00e7\u00f5es, Filtros e Hooks Personalizados"},"content":{"rendered":"<p>Os Hooks do WordPress s\u00e3o uma das ferramentas mais importantes a ter no <a href=\"https:\/\/kinsta.com\/pt\/blog\/contrate-um-desenvolvedor-do-wordpress\/\">arsenal de um desenvolvedor de WordPress<\/a>. Eles s\u00e3o a base do plugin WordPress e do desenvolvimento de temas. Voc\u00ea pode usar os muitos hooks embutidos do WordPress para &#8220;enganchar&#8221; o WordPress Core com seu c\u00f3digo personalizado e <strong>fazer<\/strong> ou<strong> modificar<\/strong> algo.<\/p>\n<p>Existem dois tipos de hooks para WordPress: <strong>A\u00e7\u00f5es<\/strong> e <strong>Filtros<\/strong>. Os hooks s\u00e3o t\u00e3o comuns que at\u00e9 mesmo o WordPress Core os utiliza extensivamente. O WordPress tamb\u00e9m inclui uma forma de voc\u00ea definir seus pr\u00f3prios<strong> hooks personalizados<\/strong> para que outros desenvolvedores possam se conectar ao seu c\u00f3digo.<\/p>\n<p>Aprender como funcionam as a\u00e7\u00f5es, filtros e hooks personalizados \u00e9 essencial para dominar o desenvolvimento do WordPress.<\/p>\n<p>A primeira metade deste artigo cobre os princ\u00edpios b\u00e1sicos dos hooks do WordPress e explica como eles funcionam com v\u00e1rios exemplos. Na segunda metade, voc\u00ea aprender\u00e1 como usar os hooks para personalizar o WordPress, criar seus pr\u00f3prios hooks personalizados e us\u00e1-los para construir seus pr\u00f3prios plugins extens\u00edveis.<\/p>\n<p>Parece excitante? Vamos mergulhar!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>O que s\u00e3o hooks WordPress?<\/h2>\n<p>Uma <a href=\"https:\/\/kinsta.com\/pt\/blog\/duplicar-pagina-wordpress\/\">p\u00e1gina WordPress <\/a>\u00e9 montada por toneladas de fun\u00e7\u00f5es e consultas a banco de dados. O WordPress Core, plugins e tema trabalham em conjunto para produzir os elementos da p\u00e1gina como texto, <a href=\"https:\/\/kinsta.com\/pt\/blog\/jpg-vs-jpeg\/\">imagens<\/a>, scripts e estilos. Uma vez totalmente montado, o navegador ent\u00e3o os coloca todos juntos e renderiza a p\u00e1gina.<\/p>\n<p>Os hooks do WordPress permitem que voc\u00ea &#8216;entre&#8217; neste processo de compila\u00e7\u00e3o em certos pontos e execute seu c\u00f3digo personalizado. A principal fun\u00e7\u00e3o dos hooks \u00e9 permitir que voc\u00ea modifique ou adicione recursos ao WordPress sem tocar nos <a href=\"https:\/\/kinsta.com\/pt\/docs\/suporte\/escopo-do-suporte\/escopo-de-suporte-de-wordpress-gerenciado\/#what-is-wordpress-core\">arquivos principais<\/a>.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/ganchos-ajuda-lo-estender-wordpress-proprio-codigo.png\" alt=\"Os ganchos v\u00e3o ajud\u00e1-lo a estender o WordPress com seu pr\u00f3prio c\u00f3digo\" width=\"1100\" height=\"502\"><figcaption class=\"wp-caption-text\">Os hooks v\u00e3o ajud\u00e1-lo a estender o WordPress com seu pr\u00f3prio c\u00f3digo<\/figcaption><\/figure>\n<p>A <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/\">Plugin API do WordPress<\/a> potencializa a funcionalidade dos hooks do WordPress. Voc\u00ea usa hooks chamando certas fun\u00e7\u00f5es do WordPress chamadas<strong> Hook Functions<\/strong> em inst\u00e2ncias espec\u00edficas durante o tempo de execu\u00e7\u00e3o do WordPress.<\/p>\n<p>Usando fun\u00e7\u00f5es hooks, voc\u00ea pode agrupar seu c\u00f3digo personalizado dentro de uma <strong>fun\u00e7\u00e3o de Callback<\/strong> e t\u00ea-lo registrado com qualquer hooks. Uma vez registrado, este callback ser\u00e1 executado onde quer que os hooks estejam, permitindo que voc\u00ea aumente ou substitua os recursos padr\u00e3o do WordPress.<\/p>\n<p>A posi\u00e7\u00e3o dos hooks no processo de execu\u00e7\u00e3o do c\u00f3digo \u00e9 um fator importante. Voc\u00ea aprender\u00e1 mais sobre sua import\u00e2ncia nas pr\u00f3ximas se\u00e7\u00f5es.<\/p>\n\n<h3>Dois tipos de hooks para WordPress: A\u00e7\u00f5es e Filtros<\/h3>\n<p>O WordPress inclui dois tipos de hooks chamados<strong> Actions<\/strong> e <strong>Filters<\/strong>. As Actions permitem que voc\u00ea<strong> fa\u00e7a<\/strong> algo em certos pontos pr\u00e9-definidos no tempo de execu\u00e7\u00e3o do WordPress, enquanto os Filters permitem que voc\u00ea<strong> modifique<\/strong> qualquer dado processado pelo WordPress e o<strong>\u00a0<code>return<\/code><\/strong><strong>.<\/strong><\/p>\n<p>As a\u00e7\u00f5es s\u00e3o definidas no c\u00f3digo do WordPress como:<\/p>\n<pre><code class=\"language-php\">do_action( 'action_name', [optional_arguments] );<\/code><\/pre>\n<p>A string <code><strong>action_name<\/strong><\/code> \u00e9 o nome da action. Voc\u00ea pode especificar a vari\u00e1vel <code><strong>[optional_arguments]<\/strong><\/code> para passar argumentos adicionais para a fun\u00e7\u00e3o callback. Se este campo n\u00e3o for especificado, ent\u00e3o seu valor padr\u00e3o estar\u00e1 vazio.<\/p>\n<p><strong>Exemplo: <\/strong>A a\u00e7\u00e3o <code><strong>do_action( 'wp_head' )<\/strong><\/code> pode ser ligada para executar c\u00f3digo personalizado toda vez que o WordPress processa o <a href=\"https:\/\/kinsta.com\/pt\/blog\/adicionar-codigo-ao-cabecalho-e-rodape-do-wordpress\/\">cabe\u00e7alho do site<\/a>. Esta a\u00e7\u00e3o n\u00e3o tem nenhum outro argumento.<\/p>\n<p>Os filtros s\u00e3o definidos no c\u00f3digo do WordPress como:<\/p>\n<pre><code class=\"language-php\">apply_filters( 'filter_name', 'value_to_be_filtered', [optional_arguments] );<\/code><\/pre>\n<p>A string <code><strong>filter_name<\/strong><\/code> \u00e9 o nome do filtro, a vari\u00e1vel <code><strong>value_to_be_filtered<\/strong><\/code> \u00e9 o valor que precisa ser filtrado e retornado, e a vari\u00e1vel <code><strong>[optional_arguments]<\/strong><\/code> pode passar argumentos adicionais, assim como com a\u00e7\u00f5es.<\/p>\n<p><strong>Exemplo: <\/strong>O filtro <code><strong>apply_filters( 'admin_footer_text' , string $text )<\/strong><\/code> pode ser ligado para modificar o texto exibido no rodap\u00e9 do administrador. A partir do WordPress 5.4, seu valor padr\u00e3o exibir\u00e1 a frase <code><em>Thank you for creating with\u00a0<\/em><a href=\"https:\/\/wordpress.org\"><em>WordPress<\/em><\/a><em>.<\/em><\/code> no rodap\u00e9 da \u00e1rea admin.<\/p>\n<p>Voc\u00ea aprender\u00e1 como se conectar em a\u00e7\u00f5es e filtros mais tarde com muitos exemplos do WordPress Core.<\/p>\n<p>Uma vez viciado, voc\u00ea pode direcionar seu c\u00f3digo para<strong> fazer<\/strong> ou<strong> customizar<\/strong> algo em seu site. Por exemplo, voc\u00ea pode usar hooks para enviar um <a href=\"https:\/\/kinsta.com\/pt\/blog\/melhores-praticas-email-marketing\/#email-marketing-platform\">e-mail autom\u00e1tico<\/a> ap\u00f3s a publica\u00e7\u00e3o de um post, ou carrega r<a href=\"https:\/\/kinsta.com\/pt\/blog\/tema-filho-no-wordpress\/#the-files-in-a-wordpress-child-theme\">folhas de estilo personalizadas<\/a> para mudar a apar\u00eancia do seu site.<\/p>\n<figure id=\"attachment_72275\" aria-describedby=\"caption-attachment-72275\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72275 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/ganchos-wordpress-ajudam-interagir-modificar-seu-site.png\" alt=\"Os ganchos WordPress ajudam voc\u00ea a interagir ou modificar seu site\" width=\"1100\" height=\"600\"><figcaption id=\"caption-attachment-72275\" class=\"wp-caption-text\">Os hooks WordPress ajudam voc\u00ea a interagir ou modificar seu site<\/figcaption><\/figure>\n<p>A maneira mais simples de entender os hooks \u00e9 imaginar o seu <a href=\"https:\/\/kinsta.com\/pt\/blog\/exemplos-de-sites-de-grandes-marcas-do-wordpress\/\">site WordPress<\/a> como a constru\u00e7\u00e3o de uma casa.<\/p>\n<p>Os hooks s\u00e3o semelhantes ao uso de uma grua para mover itens de constru\u00e7\u00e3o para frente e para tr\u00e1s. Os itens que est\u00e3o sendo transferidos s\u00e3o as<strong> fun\u00e7\u00f5es de Callback<\/strong> que incluem seu <a href=\"https:\/\/kinsta.com\/pt\/blog\/editar-codigo-wordpress\/\">c\u00f3digo personalizado<\/a>. Estes itens (ou fun\u00e7\u00f5es) podem ajudar voc\u00ea a construir ou modificar a casa.<\/p>\n<figure id=\"attachment_72259\" aria-describedby=\"caption-attachment-72259\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72259 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/exemplo-ligacao-acao-wp_head-wordpress.png\" alt=\"Exemplo de liga\u00e7\u00e3o \u00e0 a\u00e7\u00e3o 'wp_head' no WordPress\" width=\"1100\" height=\"636\"><figcaption id=\"caption-attachment-72259\" class=\"wp-caption-text\">Exemplo de liga\u00e7\u00e3o \u00e0 a\u00e7\u00e3o &#8216;wp_head&#8217; no WordPress<\/figcaption><\/figure>\n<p>As fun\u00e7\u00f5es de retorno podem ser fun\u00e7\u00f5es regulares do PHP, fun\u00e7\u00f5es padr\u00e3o do WordPress, ou fun\u00e7\u00f5es personalizadas definidas por voc\u00ea.<\/p>\n<p>S\u00f3 podemos transportar certos itens em suportes espec\u00edficos presos a hooks espec\u00edficos. Assim, as a\u00e7\u00f5es s\u00f3 podem ser ganchadas com<strong> fun\u00e7\u00f5es de a\u00e7\u00e3o. <\/strong>Da mesma forma, os filtros s\u00f3 podem ser enganchados com<strong> Fun\u00e7\u00f5es de Filtro<\/strong>.<\/p>\n<p>Embora seja tedioso trocar os hooks e suportes em um guindaste, o WordPress torna isso super f\u00e1cil ao incluir <a href=\"https:\/\/adambrown.info\/p\/wp_hooks\">mais de 2.200 tipos de hooks padr\u00e3o<\/a>.<\/p>\n<figure id=\"attachment_72265\" aria-describedby=\"caption-attachment-72265\" style=\"width: 900px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72265 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/wordpress-5-1-2200-ganchos-nativos.png\" alt=\"WordPress 5.1 tem 2200+ ganchos nativos\" width=\"900\" height=\"357\"><figcaption id=\"caption-attachment-72265\" class=\"wp-caption-text\">WordPress 5.1 tem 2200+ hooks nativos (Fonte: Adam Brown)<\/figcaption><\/figure>\n<p>Voc\u00ea pode encontrar hooks espalhados pelo WordPress Core, permitindo que voc\u00ea toque na posi\u00e7\u00e3o exata onde voc\u00ea quer se conectar e executar seu c\u00f3digo personalizado.<\/p>\n\n<h2>Hooks vs A\u00e7\u00f5es vs Filtros<\/h2>\n<p>Conforme o <a href=\"https:\/\/developer.wordpress.org\/plugins\/hooks\/\">WordPress Plugin Handbook<\/a>:<\/p>\n<blockquote><p>&#8220;Hooks<em>\u00a0s\u00e3o uma forma de um peda\u00e7o de c\u00f3digo interagir\/modificar outro peda\u00e7o de c\u00f3digo&#8230; Existem dois tipos de hooks: A\u00e7\u00f5es e Filtros. <\/em>\u201d<\/p><\/blockquote>\n<p>H\u00e1 uma inconsist\u00eancia generalizada com a forma como os termos<strong> Hooks<\/strong>, <strong>A\u00e7\u00e3o<\/strong> e <strong>Filtro<\/strong> s\u00e3o usados. Alguns tutoriais e guias os misturam com as fun\u00e7\u00f5es associadas a eles. Uma das principais raz\u00f5es para essa confus\u00e3o \u00e9 a natureza complexa de como os hooks funcionam.<\/p>\n<p>Mesmo quando voc\u00ea olha cuidadosamente dentro do WordPress Core, voc\u00ea vai descobrir que n\u00e3o h\u00e1 muita diferen\u00e7a entre adicionar a\u00e7\u00f5es e filtros. Aqui est\u00e1 o <a href=\"https:\/\/core.trac.wordpress.org\/browser\/tags\/5.4\/src\/wp-includes\/plugin.php#L403\">c\u00f3digo fonte para a fun\u00e7\u00e3o add_action() <\/a>do arquivo<strong> <code>wp-includes\/plugin.php<\/code>:<\/strong><\/p>\n<pre><code class=\"language-php\">function add_action( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {\u00a0 \u00a0 \u00a0 \n    return add_filter( $tag, $function_to_add, $priority, $accepted_args );\n}<\/code><\/pre>\n<p>A fun\u00e7\u00e3o <code><strong>add_action()<\/strong><\/code> apenas chama a fun\u00e7\u00e3o <code><strong>add_filter()<\/strong><\/code> e retorna seu valor. Por que? Porque ambas funcionam fundamentalmente da mesma forma, exceto por uma diferen\u00e7a.<\/p>\n<p>A fun\u00e7\u00e3o <code><strong>apply_filters()<\/strong><\/code> retorna um valor que pode alterar os tipos de dados existentes, enquanto a fun\u00e7\u00e3o <code><strong>do_action()<\/strong><\/code> n\u00e3o retorna nada (<a href=\"https:\/\/www.php.net\/manual\/en\/functions.returning-values.php\">valor NULL no PHP<\/a>).<\/p>\n<p>Se voc\u00ea ainda estiver confuso, n\u00e3o se preocupe! Assim que voc\u00ea passar da primeira metade deste artigo, tudo ficar\u00e1 claro. Vamos nos ater \u00e0 terminologia oficial do WordPress Codex, pois ela \u00e9 clara, precisa e universal.<\/p>\n<p>Por enquanto, familiarize-se com a rotina de Hooks mostrada abaixo.<\/p>\n<figure id=\"attachment_72260\" aria-describedby=\"caption-attachment-72260\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72260 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/rotina-anzol-funcoes-gancho-gancho-callback.png\" alt=\"A Rotina do Anzol: Fun\u00e7\u00f5es de Gancho, Gancho e Callback\" width=\"1100\" height=\"1161\"><figcaption id=\"caption-attachment-72260\" class=\"wp-caption-text\">A Rotina dos Hooks: Fun\u00e7\u00f5es de Hooks e Callback<\/figcaption><\/figure>\n<p>Vamos quebrar as diferen\u00e7as entre A\u00e7\u00f5es e Hooks.<\/p>\n<table>\n<tbody>\n<tr>\n<td style=\"text-align: center\" colspan=\"2\"><strong>Hooks WordPress<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center\"><strong>A\u00e7\u00f5es<\/strong><\/td>\n<td style=\"text-align: center\"><strong>Filtros<\/strong><\/td>\n<\/tr>\n<tr>\n<td>As a\u00e7\u00f5es s\u00e3o utilizadas para executar fun\u00e7\u00f5es personalizadas em um ponto espec\u00edfico durante a execu\u00e7\u00e3o do WordPress Core..<\/td>\n<td>Os filtros s\u00e3o utilizados para modificar ou personalizar os dados utilizados por outras fun\u00e7\u00f5es.<\/td>\n<\/tr>\n<tr>\n<td>As a\u00e7\u00f5es s\u00e3o definidas\/criadas pela fun\u00e7\u00e3o <strong><code>do_action( 'action_name' )<\/code><\/strong> no c\u00f3digo do WordPress.<\/td>\n<td>Os filtros s\u00e3o definidos\/criados pela fun\u00e7\u00e3o <strong><code>apply_filters( 'filter_name', 'value_to_be_filtered' )<\/code><\/strong> no c\u00f3digo do WordPress.<\/td>\n<\/tr>\n<tr>\n<td>As a\u00e7\u00f5es tamb\u00e9m s\u00e3o chamadas de <strong>hooks de a\u00e7\u00e3o<\/strong>.<\/td>\n<td>Os filtros tamb\u00e9m s\u00e3o chamados de <strong>hooks de filtro<\/strong>.<\/td>\n<\/tr>\n<tr>\n<td>As a\u00e7\u00f5es s\u00f3 podem ser ligadas com as fun\u00e7\u00f5es Action. Por exemplo, <strong><code>add_action(), remove_action()<\/code><\/strong>.<\/td>\n<td>Os filtros s\u00f3 podem ser conectados com as fun\u00e7\u00f5es de Filtro. Por exemplo, <strong><code>add_filter(), remove_filter()<\/code><\/strong>.<\/td>\n<\/tr>\n<tr>\n<td>Fun\u00e7\u00f5es de a\u00e7\u00e3o n\u00e3o precisam passar nenhum argumento para suas fun\u00e7\u00f5es de chamada de retorno.<\/td>\n<td>Fun\u00e7\u00f5es de filtro precisam passar pelo menos um argumento para suas fun\u00e7\u00f5es de callback.<\/td>\n<\/tr>\n<tr>\n<td>Fun\u00e7\u00f5es de a\u00e7\u00e3o podem realizar qualquer tipo de tarefa, incluindo a mudan\u00e7a do comportamento de como o WordPress funciona.<\/td>\n<td>As fun\u00e7\u00f5es de filtro s\u00f3 existem para modificar os dados passados a eles pelos filtros.<\/td>\n<\/tr>\n<tr>\n<td>Fun\u00e7\u00f5es de a\u00e7\u00e3o n\u00e3o devem <code><strong>return<\/strong><\/code> nada. Entretanto, elas podem <strong><code>echo<\/code><\/strong> a sa\u00edda ou interagir com o banco de dados.<\/td>\n<td>As fun\u00e7\u00f5es de filtro devem <strong><code>return<\/code><\/strong> suas altera\u00e7\u00f5es como sa\u00edda. Mesmo que uma fun\u00e7\u00e3o de filtro n\u00e3o mude nada, ela ainda deve <strong><code>return<\/code><\/strong> a entrada n\u00e3o modificada.<\/td>\n<\/tr>\n<tr>\n<td>As a\u00e7\u00f5es podem executar quase tudo, desde que o c\u00f3digo seja v\u00e1lido.<\/td>\n<td>Os filtros devem funcionar de forma isolada, para que n\u00e3o tenham nenhum efeito colateral n\u00e3o intencional.<\/td>\n<\/tr>\n<tr>\n<td><strong>Resumo:<\/strong> Uma a\u00e7\u00e3o interrompe o processo normal de execu\u00e7\u00e3o do c\u00f3digo para fazer algo com as informa\u00e7\u00f5es que recebe, mas n\u00e3o devolve nada de volta, e depois sai.<\/td>\n<td><strong>Resumo:<\/strong> Um filtro modifica a informa\u00e7\u00e3o que recebe, retorna para a fun\u00e7\u00e3o do Hooks de chamada e outras fun\u00e7\u00f5es podem usar o valor que ele retorna.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u00a0<\/p>\n<p>\u00c0s vezes, voc\u00ea pode usar tanto uma a\u00e7\u00e3o quanto um filtro para atingir o mesmo objetivo. Por exemplo, se voc\u00ea quiser modificar o texto em um post, voc\u00ea pode registrar uma fun\u00e7\u00e3o de callback com a a\u00e7\u00e3o <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/publish_post\">publish_post<\/a> e alterar o conte\u00fado do post quando ele estiver sendo salvo no <a href=\"https:\/\/kinsta.com\/pt\/blog\/banco-de-dados-wordpress\/\">banco de dados<\/a>.<\/p>\n<pre><code class=\"language-php\">\/\/ define the callback function to change the text\nfunction change_text_callback() { \n    \/\/ add the code to change text here\n}\n\n\/\/ hook in to the 'publish_post' action with the add_action() function\nadd_action( 'publish_post', 'change_text_callback' );<\/code><\/pre>\n<p>Ou voc\u00ea pode registrar outra fun\u00e7\u00e3o de callback com o filtro <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/the_content\/\">the_content<\/a> para modificar o conte\u00fado do post antes que ele seja exibido no navegador.<\/p>\n<pre><code class=\"language-php\">\/\/ define the callback function to modify the text\nfunction change_text_another_callback( $content ) { \n    \/\/ add the code to change text here and then return it \n    return $filtered_content;\n}\n\n\/\/ hook in to 'the_content' filter with the add_filter() function\nadd_filter( 'the_content', 'change_text_another_callback');<\/code><\/pre>\n<p>Duas abordagens diferentes com o mesmo resultado. Saber quando usar uma sobre a outra \u00e9 fundamental para ser um <a href=\"https:\/\/kinsta.com\/pt\/blog\/salario-de-um-desenvolvedor-wordpress\/\">bom desenvolvedor do WordPress<\/a>.<\/p>\n<h2>Como funcionam os hooks do WordPress?<\/h2>\n<p>O exemplo da casa foi simples o suficiente para entender o funcionamento b\u00e1sico dos hooks, mas n\u00e3o capta a complexidade de como eles funcionam. Mais importante ainda, os conceitos de posi\u00e7\u00e3o e especificidade dos hooks.<\/p>\n<p>Um exemplo melhor seria imaginar processar uma p\u00e1gina web WordPress como montar um carro. Ao contr\u00e1rio da fabrica\u00e7\u00e3o de um carro, que leva tempo, a montagem de uma p\u00e1gina da web \u00e9 quase instant\u00e2nea.<\/p>\n<figure id=\"attachment_72276\" aria-describedby=\"caption-attachment-72276\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72276 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/montar-pagina-web-montar-carro.png\" alt=\"Montar uma p\u00e1gina web \u00e9 como montar um carro\" width=\"1100\" height=\"1223\"><figcaption id=\"caption-attachment-72276\" class=\"wp-caption-text\">Montar uma p\u00e1gina web \u00e9 como montar um carro<\/figcaption><\/figure>\n<p>Assim como um carro \u00e9 montado pe\u00e7a por pe\u00e7a em uma moderna linha de montagem, uma p\u00e1gina web WordPress \u00e9 montada elemento por elemento pelo servidor e pelo cliente.<\/p>\n<p>O WordPress Core \u00e9 como o motor do carro, chassis e outros essenciais, potencializando a funcionalidade &#8220;core&#8221; do site.<\/p>\n<p>Voc\u00ea pode ter um site funcional apenas com o WordPress Core, mas onde est\u00e1 a gra\u00e7a nisso? Voc\u00ea precisa adicionar recursos empolgantes ao site. \u00c9 a\u00ed que entram os <a href=\"https:\/\/kinsta.com\/pt\/topicos\/plugins-wordpress\/\">plugins<\/a> e <a href=\"https:\/\/kinsta.com\/pt\/blog\/temas-wordpress-mais-rapidos\/\">temas<\/a><a href=\"https:\/\/kinsta.com\/pt\/topicos\/plugins-wordpress\/\"> do WordPress<\/a>, ambos usando hooks extensivamente.<\/p>\n<p>No exemplo acima, cada esta\u00e7\u00e3o numerada \u00e9 como um Hooks dentro do WordPress Core. Existem dois tipos de esta\u00e7\u00f5es, como a\u00e7\u00f5es e filtros. Cada esta\u00e7\u00e3o inclui um tipo espec\u00edfico de slot que aceita apenas certas ferramentas, semelhantes a fun\u00e7\u00f5es de a\u00e7\u00e3o e fun\u00e7\u00f5es de filtro.<\/p>\n<p>Todas as esta\u00e7\u00f5es s\u00e3o colocadas em intervalos freq\u00fcentes para modularidade e efici\u00eancia.<\/p>\n<p>Dependendo da necessidade em uma determinada posi\u00e7\u00e3o, podemos acoplar (ou enganchar) a ferramenta mais apropriada para o trabalho naquela esta\u00e7\u00e3o espec\u00edfica. Estas ferramentas s\u00e3o como as fun\u00e7\u00f5es de callback utilizadas para interagir ou modificar o WordPress.<\/p>\n<p>Algumas ferramentas podem alterar significativamente o funcionamento do carro, como os callbacks registrados para a\u00e7\u00f5es. Outras ferramentas s\u00e3o utilizadas apenas para personalizar a apar\u00eancia do carro, como as callbacks registradas em filtros.<\/p>\n<p>Usar as ferramentas certas nas esta\u00e7\u00f5es certas \u00e9 crucial para construir um carro de primeira linha. Da mesma forma, os hooks nos ajudam a personalizar o WordPress de acordo com nossas necessidades \u00fanicas.<\/p>\n<p>Se voc\u00ea estender esta analogia, os plugins s\u00e3o como adicionar recursos \u00fateis para autom\u00f3veis, como airbags, console de entretenimento, sistema remoto sem chave, etc (como estes par a<a href=\"https:\/\/kinsta.com\/pt\/blog\/plugins-woocommerce\/\">melhorar a funcionalidade do WooCommerce<\/a>). Os temas s\u00e3o an\u00e1logos para personalizar a parte visual do carro, como o design geral, pintura, jantes, etc. (veja aqui como <a href=\"https:\/\/kinsta.com\/pt\/blog\/como-personalizar-tema-wordpress\/\">customizar seu tema do WordPress<\/a>).<\/p>\n<h2>Onde registrar os hooks e suas fun\u00e7\u00f5es?<\/h2>\n<p>Existem duas formas recomendadas de adicionar hooks no WordPress:<\/p>\n<ul>\n<li><strong>Plugins: <\/strong>Fa\u00e7a seu pr\u00f3prio plugin e adicione todo o seu c\u00f3digo personalizado dentro dele.<\/li>\n<li><strong>Tema Filho (Child Theme): <\/strong>Registre as fun\u00e7\u00f5es de hooks e callback no <a href=\"https:\/\/kinsta.com\/pt\/blog\/tema-filho-no-wordpress\/\">arquivo<code><strong> functions.php<\/strong><\/code> do seu tema filho<\/a>.<\/li>\n<\/ul>\n<p>Para este tutorial, vamos come\u00e7ar criando um plugin. Para isso, crie uma nova pasta no seu diret\u00f3rio <code><strong>\/wp-content\/plugins\/plugins\/<\/strong><\/code>.<\/p>\n<p>Eu estou nomeando os meus plugin <code><strong>salhooks<\/strong><\/code>, mas voc\u00ea pode nomear o que quiser. De acordo com as diretrizes do WordPress, voc\u00ea precisa criar um arquivo PHP com o mesmo nome (<code><strong>salhooks.php<\/strong><\/code>) dentro do seu diret\u00f3rio de plugins.<\/p>\n<p>Adicione os seguintes campos de cabe\u00e7alho ao seu arquivo de plugin para registr\u00e1-lo no WordPress. Voc\u00ea pode saber mais sobre os <a href=\"https:\/\/developer.wordpress.org\/plugins\/plugin-basics\/header-requirements\/\">requisitos de cabe\u00e7alho do plugin<\/a> no WordPress Codex.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n\/*\nPlugin Name:  Salhooks\nVersion    :  1.0\nDescription:  Demonstrating WordPress Hooks (Actions and Filters) with multiple examples.\nAuthor     :  Salman Ravoof\nAuthor URI :  https:\/\/www.salmanravoof.com\/\nLicense    :  GPLv2 or later\nLicense URI:  https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\nText Domain:  salhooks\n*\/\n\n\/\/=================================================\n\/\/ Security: Abort if this file is called directly\n\/\/=================================================\nif ( !defined('ABSPATH') ) { \n    die;\n}<\/code><\/pre>\n<p>Salve este arquivo e depois ative o plugin no se u<a href=\"https:\/\/kinsta.com\/pt\/blog\/painel-administrativo-wordpress\/\">painel do WordPress<\/a>. Eu estarei usando este plugin dentro de uma <a href=\"https:\/\/kinsta.com\/pt\/blog\/instalar-wordpress-localmente\/\">instala\u00e7\u00e3o local do WordPress <\/a>para demonstrar como funcionam os hooks.<\/p>\n<p>Como uma nota lateral, voc\u00ea tamb\u00e9m pode editar os arquivos do WordPress Core diretamente para registrar os hooks. Entretanto, n\u00e3o \u00e9 recomendado, pois todo o seu c\u00f3digo personalizado ser\u00e1 sobrescrito toda vez que <a href=\"https:\/\/kinsta.com\/pt\/blog\/atualizacoes-automaticas-wordpress\/\">voc\u00ea atualizar o WordPress<\/a>. Voc\u00ea n\u00e3o deve adicionar hooks dentro do seu tema pai pelo mesmo motivo.<\/p>\n<h2>Usando os Hooks do WordPress<\/h2>\n<p>Hooks WordPress por si s\u00f3 n\u00e3o faz nada. Ele apenas se senta no c\u00f3digo, esperando por alguma fun\u00e7\u00e3o Hooks para ativ\u00e1-lo. Para fazer uso de um Hook, voc\u00ea precisa chamar pelo menos 2 outras fun\u00e7\u00f5es.<\/p>\n<p>Primeiro, voc\u00ea precisa registrar os Hooks com uma fun\u00e7\u00e3o de Hooks e referenciar uma fun\u00e7\u00e3o de chamada de retorno dentro dele. E ent\u00e3o voc\u00ea precisa definir a fun\u00e7\u00e3o de callback que voc\u00ea mencionou anteriormente na fun\u00e7\u00e3o Hooks. O WordPress ir\u00e1 executar esta fun\u00e7\u00e3o de callback toda vez que o Hooks for disparado.<\/p>\n<p>A ordem em que voc\u00ea define estas fun\u00e7\u00f5es n\u00e3o importa, mas \u00e9 uma boa id\u00e9ia coloc\u00e1-las pr\u00f3ximas umas das outras.<\/p>\n<p>As a\u00e7\u00f5es e filtros t\u00eam fun\u00e7\u00f5es de Hooks distintas. A partir de agora, vamos nos referir a elas como<strong> fun\u00e7\u00f5es de a\u00e7\u00e3o <\/strong>e <strong>fun\u00e7\u00f5es de filtro<\/strong>. Como voc\u00ea ver\u00e1, elas t\u00eam seus pr\u00f3prios requisitos de sintaxe e par\u00e2metros.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Ganhar uma a\u00e7\u00e3o<\/h3>\n<p>As a\u00e7\u00f5es fornecem uma maneira de executar seu c\u00f3digo personalizado em um determinado ponto na execu\u00e7\u00e3o do WordPress Core, plugins ou temas.<\/p>\n<h4>A fun\u00e7\u00e3o add_action() A\u00e7\u00e3o<\/h4>\n<p>Voc\u00ea pode registrar uma fun\u00e7\u00e3o de callback com uma a\u00e7\u00e3o, seguindo estes passos:<\/p>\n<ol>\n<li>Defina uma <strong>fun\u00e7\u00e3o de Callback<\/strong> com o seu c\u00f3digo personalizado dentro dela. Esta fun\u00e7\u00e3o de Callback ser\u00e1 executada quando qualquer a\u00e7\u00e3o registrada for disparada durante a execu\u00e7\u00e3o do c\u00f3digo do WordPress.<\/li>\n<li>Prenda sua fun\u00e7\u00e3o callback \u00e0 a\u00e7\u00e3o que voc\u00ea deseja com a fun\u00e7\u00e3o <code><strong>add_action()<\/strong><\/code>. Conforme o Codex WordPress, a fun\u00e7\u00e3o <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_action\/\">add_action()<\/a> precisa passar pelo menos dois par\u00e2metros:\n<ul>\n<li>Nome da a\u00e7\u00e3o a ser tomada.<\/li>\n<li>Nome da fun\u00e7\u00e3o de callback que ser\u00e1 executada quando a a\u00e7\u00e3o for acionada.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"3\">\n<li>A fun\u00e7\u00e3o <code><strong>add_action()<\/strong><\/code> tamb\u00e9m aceita dois par\u00e2metros opcionais para definir a <code><strong>priority<\/strong><\/code>\u00a0e o <code><strong>number of arguments<\/strong><\/code>. Discutiremos os dois mais tarde.<\/li>\n<\/ol>\n<p>\u00c9 uma boa pr\u00e1tica nomear os par\u00e2metros da sua fun\u00e7\u00e3o de callback o mais pr\u00f3ximo poss\u00edvel dos par\u00e2metros passados pela fun\u00e7\u00e3o de Hooks.<\/p>\n<p>Vamos ver um exemplo de utiliza\u00e7\u00e3o da fun\u00e7\u00e3o<code><strong> add_action()<\/strong><\/code>.<\/p>\n<pre><code class=\"language-php\">\/\/ define the callback function, the arguments are optional\nfunction example_callback( $arg1, $arg2 ) {\n\u00a0 \u00a0 \/\/ make your code do something with the arguments\n}\n\n\/\/ hook the callback function to the 'example_action'\nadd_action( 'example_action', 'example_callback', [priority], [no_of_args] );\n\n\/\/ 'priority' and 'number of arguments' are optional parameters<\/code><\/pre>\n<h4>Exemplo de Engatar uma A\u00e7\u00e3o<\/h4>\n<p>O WordPress inclui uma a\u00e7\u00e3o interna chamada <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/init\/\">init<\/a> que dispara ap\u00f3s o WordPress ter terminado de carregar e autenticar o usu\u00e1rio, mas antes de qualquer cabe\u00e7alho ser enviado. Muitos plugins usam este Hook como ponto de partida para instanciar seu c\u00f3digo, pois quase todos os principais recursos do WordPress terminaram de carregar at\u00e9 o momento em que o WordPress executa esta a\u00e7\u00e3o.<\/p>\n<p>O WordPress tem uma a\u00e7\u00e3o similar chamada <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/admin_init\/\">admin_init<\/a>. Ela dispara enquanto a tela de admin est\u00e1 sendo inicializada, enquanto a a\u00e7\u00e3o <code><strong>init<\/strong><\/code> dispara somente ap\u00f3s o WordPress ter terminado de carregar.<\/p>\n<p>Vamos executar um c\u00f3digo personalizado para <code><strong>echo<\/strong><\/code> uma mensagem simples durante a execu\u00e7\u00e3o da a\u00e7\u00e3o de <code><strong>init<\/strong><\/code>. Veja como fazer isso:<\/p>\n<pre><code class=\"language-php\">function custom_callback_function(){\n\u00a0 \u00a0 \/\/ add your custom code here to do something\n\u00a0 \u00a0 echo 'I will be fired on WordPress initialization';\n}\nadd_action( 'init', 'custom_callback_function' );<\/code><\/pre>\n<p>Voc\u00ea pode ver a mensagem sendo ecoada no canto superior esquerdo da minha <a href=\"https:\/\/kinsta.com\/pt\/blog\/instalar-wordpress-localmente\/\">instala\u00e7\u00e3o local do WordPress<\/a>.<\/p>\n<figure id=\"attachment_72244\" aria-describedby=\"caption-attachment-72244\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72244 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/exemplo-engatar-acao.jpg\" alt=\"N\u00e3o \u00e9 t\u00e3o bonito assim, mas \u00e9 um \u00f3timo come\u00e7o!\" width=\"1100\" height=\"500\"><figcaption id=\"caption-attachment-72244\" class=\"wp-caption-text\">N\u00e3o \u00e9 t\u00e3o bonito assim, mas \u00e9 um \u00f3timo come\u00e7o!<\/figcaption><\/figure>\n<h4>Encontrando A\u00e7\u00f5es Suportadas pelo WordPress<\/h4>\n<p>O WordPress inclui a\u00e7\u00f5es toda vez que ele faz algo, como o <a href=\"https:\/\/kinsta.com\/pt\/blog\/login-wordpress-url\/\">login de um usu\u00e1rio<\/a> ou a <a href=\"https:\/\/kinsta.com\/pt\/blog\/agendamento-perdido-wordpress\/\">publica\u00e7\u00e3o de um novo post<\/a>. Voc\u00ea pode encontrar uma lista completa de todas as a\u00e7\u00f5es executadas pelo WordPress na p\u00e1gina <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\">Plugin API\/Action Reference<\/a>.<\/p>\n<figure id=\"attachment_72247\" aria-describedby=\"caption-attachment-72247\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72247 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/acao-quase-todas-utilizacoes.png\" alt=\"H\u00e1 uma a\u00e7\u00e3o para quase todas as utiliza\u00e7\u00f5es\" width=\"1100\" height=\"500\"><figcaption id=\"caption-attachment-72247\" class=\"wp-caption-text\">H\u00e1 uma a\u00e7\u00e3o para quase todas as utiliza\u00e7\u00f5es<\/figcaption><\/figure>\n<p>O Codex dividiu todas as a\u00e7\u00f5es ali listadas em v\u00e1rias categorias e as organizou da primeira \u00e0 \u00faltima na ordem de execu\u00e7\u00e3o do WordPress.<\/p>\n<p>Na maioria dos casos, muitas dessas a\u00e7\u00f5es n\u00e3o fazem nada, pois nada est\u00e1 ligado a elas. Mas se voc\u00ea precisar delas, elas est\u00e3o l\u00e1 para voc\u00ea se ligar a elas.<\/p>\n<p>Sentindo-se um pouco sobrecarregado com todas as a\u00e7\u00f5es? \u00c9 natural. \u00c0 medida que voc\u00ea ganha mais experi\u00eancia e passa pelo c\u00f3digo fonte do WordPress Core, fica mais f\u00e1cil encontrar o Hook perfeito para as suas necessidades. Basta fazer uma busca pelo termo &#8220;<strong>do_action<\/strong>&#8221; e voc\u00ea vai encontrar muitas a\u00e7\u00f5es que voc\u00ea pode se conectar.<\/p>\n<h4>Par\u00e2metros adicionais para add_action()<\/h4>\n<p>A fun\u00e7\u00e3o <code><strong>add_action()<\/strong><\/code> pode aceitar mais dois par\u00e2metros: um para definir a<strong> priority<\/strong> e o outro para definir o <code><strong>number of arguments<\/strong><\/code>. Enquanto eles s\u00e3o opcionais, se usados corretamente, podem ser super \u00fateis.<\/p>\n<h5>Priority<\/h5>\n<p>O primeiro par\u00e2metro adicional suportado pela fun\u00e7\u00e3o <code><strong>add_action()<\/strong><\/code> define a <code><strong>priority<\/strong><\/code>. Este par\u00e2metro s\u00f3 pode ser um n\u00famero inteiro positivo. Quanto menor o n\u00famero de priority, mais cedo a fun\u00e7\u00e3o ser\u00e1 executada. Seu valor padr\u00e3o \u00e9 10 se voc\u00ea n\u00e3o especific\u00e1-lo.<\/p>\n<p>Para ver como funciona, vamos registrar tr\u00eas fun\u00e7\u00f5es de callback para a a\u00e7\u00e3o de <code><strong>init<\/strong><\/code>, mas cada uma com prioritys diferentes.<\/p>\n<pre><code class=\"language-php\">\/\/ priority is set to 9, which is lower than 10, hence it ranks higher\nadd_action( 'init', 'i_am_high_priority', 9 );\n\n\/\/ if no priority is set, the default value of 10 will be used\nadd_action( 'init', 'i_am_default_priority');\n\n\/\/ priority is set to 11, which is higher than 11, hence it ranks lower\nadd_action( 'init', 'i_am_low_priority', 11 );<\/code><\/pre>\n<p>Nos exemplos acima, a fun\u00e7\u00e3o de callback com o menor n\u00famero de priority ser\u00e1 a primeira e a com o maior n\u00famero ser\u00e1 a \u00faltima. Se suas prioritys forem as mesmas, ent\u00e3o elas ser\u00e3o executadas na ordem em que voc\u00ea as registra.<\/p>\n<p>A priority tem um papel importante quando um \u00fanico Hook pode ter m\u00faltiplas fun\u00e7\u00f5es de callback registradas com ele. Para evitar resultados inesperados, voc\u00ea pode definir uma priority para cada fun\u00e7\u00e3o de callback, para que eles disparem na ordem em que voc\u00ea quiser.<\/p>\n<h5>Number of Arguments<\/h5>\n<p>Por padr\u00e3o, qualquer fun\u00e7\u00e3o de callback registrada atrav\u00e9s da fun\u00e7\u00e3o <code><strong>add_action()<\/strong><\/code> receber\u00e1 apenas um argumento. Entretanto, algumas vezes voc\u00ea pode precisar passar dados extras para a fun\u00e7\u00e3o de callback.<\/p>\n<p>Por esta raz\u00e3o a fun\u00e7\u00e3o <code><strong>add_action()<\/strong><\/code> aceita um par\u00e2metro opcional para definir o number of arguments.<\/p>\n<p>Um \u00f3timo exemplo para mostrar isso \u00e9 a a\u00e7\u00e3o <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/comment_post\/\">comment_post<\/a>. Esta a\u00e7\u00e3o \u00e9 executada imediatamente ap\u00f3s o <a href=\"https:\/\/kinsta.com\/pt\/blog\/melhores-plugins-de-comentarios-do-wordpress\/\">WordPress adicionar um coment\u00e1rio ao banco de dados<\/a>. Se voc\u00ea n\u00e3o definir o par\u00e2metro <code><strong>number of arguments<\/strong><\/code>, ele passar\u00e1 apenas um \u00fanico valor para a fun\u00e7\u00e3o callback, que neste caso ser\u00e1 o <code><strong>comment_ID<\/strong><\/code>.<\/p>\n<pre><code class=\"language-php\">\/\/ register the hook with 'priority' and 'number of arguments' parameters\nadd_action( 'comment_post', 'show_message_function', 10, 3 );\n\n\/\/ define the callback function\nfunction show_message_function( $comment_ID, $comment_approved, $commentdata ) {\n\u00a0 \u00a0 \/\/ check whether a comment is approved with the second parameter\n\u00a0 \u00a0 if( 1 === $comment_approved ){\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ runs the code only if the comment is approved\n\u00a0 \u00a0 }\n}<\/code><\/pre>\n<p>Se voc\u00ea definir o par\u00e2metro <code><strong>number of arguments<\/strong><\/code> para<strong> 3<\/strong> como no exemplo acima, a fun\u00e7\u00e3o action passar\u00e1 tr\u00eas valores: <code><strong>comment_ID<\/strong><\/code>, <code><strong>comment_approved<\/strong><\/code>, e <code><strong>commentdata<\/strong><\/code>.<\/p>\n<p>WordPress define o valor do <code><strong>comment_approved<\/strong><\/code>\u00a0como<strong> 1<\/strong> para coment\u00e1rios aprovados, <strong>0<\/strong> se n\u00e3o aprovado, e &#8216;<strong>spam<\/strong>&#8216; se o <a href=\"https:\/\/kinsta.com\/pt\/blog\/spam-comentarios-wordpress\/\">coment\u00e1rio for marcado como spam<\/a>.<\/p>\n<p>A vari\u00e1vel <code><strong>commentdata<\/strong><\/code> \u00e9 um array que inclui todos os dados do coment\u00e1rio, como nome do autor do coment\u00e1rio, endere\u00e7o de e-mail, site e o conte\u00fado do coment\u00e1rio em si. Voc\u00ea pode conferir o Codex WordPress para encontrar todos os <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_new_comment\/#parameters\">pares de valores-chave inclu\u00eddos no array &#8216;commentdata&#8217;<\/a>.<\/p>\n<p>Voc\u00ea pode ter quantos argumentos voc\u00ea quiser, mas a fun\u00e7\u00e3o callback e a fun\u00e7\u00e3o <code><strong>add_action()<\/strong><\/code> precisam especificar o mesmo number of arguments.<\/p>\n<p>Ao passar par\u00e2metros adicionais para a fun\u00e7\u00e3o de callback, voc\u00ea pode fazer mais com o seu c\u00f3digo. Por exemplo, voc\u00ea pode verificar se um coment\u00e1rio \u00e9 aprovado ou n\u00e3o e <a href=\"https:\/\/kinsta.com\/pt\/blog\/spam-comentarios-wordpress\/#3-enable-comment-moderation\">enviar automaticamente o texto do coment\u00e1rio para o administrador, se for aprovado<\/a>. N\u00e3o \u00e9 poss\u00edvel fazer isso sem especificar os argumentos adicionais, pois sua fun\u00e7\u00e3o de callback n\u00e3o ter\u00e1 acesso aos dados do <code><strong>comment_content<\/strong><\/code>.<\/p>\n<p>Se voc\u00ea n\u00e3o quer definir a priority, mas quer apenas mudar o number of arguments, voc\u00ea ainda precisa definir uma priority. Basta usar seu valor padr\u00e3o (i.e. 10).<\/p>\n<h4>Como o WordPress Core Utiliza as A\u00e7\u00f5es<\/h4>\n<p>O pr\u00f3prio WordPress Core utiliza muitas de suas a\u00e7\u00f5es embutidas para realizar v\u00e1rias fun\u00e7\u00f5es.<\/p>\n<p>Pegue a a\u00e7\u00e3o <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/wp_head\/\">wp_head,<\/a> por exemplo. Ela \u00e9 disparada quando o WordPress est\u00e1 emitindo a se\u00e7\u00e3o de cabe\u00e7alho das p\u00e1ginas web (o c\u00f3digo que vai entre<strong> <code>&lt; head&gt;<\/code> e <code>&lt;\/head&gt;<\/code> ).<\/strong><\/p>\n<p>Voc\u00ea pode encontrar a maioria das fun\u00e7\u00f5es de a\u00e7\u00e3o do WordPress Core relacionadas com o Hook <code><strong>wp_head<\/strong><\/code> no arquivo <strong><code>wp-includes\/default-filters.php<\/code>. <\/strong>Eu <a href=\"https:\/\/github.com\/WordPress\/WordPress\/blob\/master\/wp-includes\/default-filters.php\">pesquisei o c\u00f3digo<\/a> e compilei uma lista de todas as fun\u00e7\u00f5es <code><strong>add_action()<\/strong><\/code> que invocam a a\u00e7\u00e3o <code><strong>wp_head<\/strong><\/code>.<\/p>\n<pre><code class=\"language-php\">add_action( 'wp_head', 'rest_output_link_wp_head', 10, 0 );\nadd_action( 'wp_head', '_wp_render_title_tag', 1 );\nadd_action( 'wp_head', 'wp_enqueue_scripts', 1 );\nadd_action( 'wp_head', 'wp_resource_hints', 2 );\nadd_action( 'wp_head', 'feed_links', 2 );\nadd_action( 'wp_head', 'feed_links_extra', 3 );\nadd_action( 'wp_head', 'rsd_link' );\nadd_action( 'wp_head', 'wlwmanifest_link' );\nadd_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );\nadd_action( 'wp_head', 'locale_stylesheet' );\nadd_action( 'wp_head', 'noindex', 1 );\nadd_action( 'wp_head', 'print_emoji_detection_script', 7 );\nadd_action( 'wp_head', 'wp_print_styles', 8 );\nadd_action( 'wp_head', 'wp_print_head_scripts', 9 );\nadd_action( 'wp_head', 'wp_generator' );\nadd_action( 'wp_head', 'rel_canonical' );\nadd_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );\nadd_action( 'wp_head', 'wp_custom_css_cb', 101 );\nadd_action( 'wp_head', 'wp_site_icon', 99 );\nadd_action( 'wp_head', 'wp_no_robots' );<\/code><\/pre>\n<p>Isso \u00e9 um monte de fun\u00e7\u00f5es de callback ligadas a apenas uma a\u00e7\u00e3o. Definir a <code><strong>priority<\/strong><\/code> aqui \u00e9 crucial para garantir que as fun\u00e7\u00f5es mais importantes do Hook funcionem primeiro.<\/p>\n<p>No exemplo acima, carregar os scripts com a fun\u00e7\u00e3o callback <code><strong>wp_enqueue_scripts()<\/strong><\/code> \u00e9 mais importante (priority = 1) do que carregar as meta tags do \u00edcone do site com a fun\u00e7\u00e3o callback <code><strong>wp_site_icon()<\/strong><\/code> (priority = 99).<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Todas as fun\u00e7\u00f5es de callback utilizadas no exemplo acima s\u00e3o fun\u00e7\u00f5es do WordPress. Voc\u00ea tamb\u00e9m pode us\u00e1-las em qualquer um de seus c\u00f3digos. Visite a <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\">p\u00e1gina Refer\u00eancia de Fun\u00e7\u00f5es no Codex WordPress <\/a>para mais informa\u00e7\u00f5es.<\/p>\n<\/aside>\n\n<h4>Outras Fun\u00e7\u00f5es de A\u00e7\u00e3o<\/h4>\n<p>Enquanto <code><strong>add_action()<\/strong><\/code> \u00e9 a fun\u00e7\u00e3o de a\u00e7\u00e3o mais utilizada, existem muitas outras que s\u00e3o igualmente \u00fateis. Vamos ver como todos eles funcionam.<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/has_action\">has_action()<\/a><\/li>\n<\/ul>\n<p>Esta fun\u00e7\u00e3o de a\u00e7\u00e3o verifica se uma a\u00e7\u00e3o foi enganchada. Ela aceita dois par\u00e2metros. O primeiro \u00e9 o nome da a\u00e7\u00e3o. O segundo par\u00e2metro \u00e9 opcional e \u00e9 o nome da fun\u00e7\u00e3o callback.<\/p>\n<pre><code class=\"language-php\">has_action( 'action_name', 'function_to_check' );<\/code><\/pre>\n<p>Se voc\u00ea especificar apenas o primeiro par\u00e2metro, ele retorna <code><strong>true<\/strong><\/code> se<em> alguma<\/em> fun\u00e7\u00e3o estiver ligada ao par\u00e2metro <code><strong>action_name<\/strong><\/code>.<\/p>\n<p>Mas se voc\u00ea tamb\u00e9m especificar o segundo par\u00e2metro, ele retornar\u00e1 <code><strong>false<\/strong><\/code>\u00a0se a fun\u00e7\u00e3o de callback especificada n\u00e3o estiver registrada para a a\u00e7\u00e3o mencionada.<\/p>\n<p>Se encontrar a fun\u00e7\u00e3o de callback anexada ao Hook de a\u00e7\u00e3o, no entanto, ele retornar\u00e1 a <code><strong>priority<\/strong><\/code> (um n\u00famero inteiro) definida para essa fun\u00e7\u00e3o neste Hook de a\u00e7\u00e3o.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/do_action\/\">do_action()<\/a><\/li>\n<\/ul>\n<p>N\u00f3s j\u00e1 encontramos essa fun\u00e7\u00e3o de a\u00e7\u00e3o antes. O WordPress a utiliza para definir todas as suas a\u00e7\u00f5es padr\u00e3o, permitindo que outras fun\u00e7\u00f5es se conectem a elas. Assim como o WordPress, voc\u00ea tamb\u00e9m pode usar a fun\u00e7\u00e3o <code><strong>do_action()<\/strong><\/code> para criar uma nova a\u00e7\u00e3o personalizada, especificando um novo nome de a\u00e7\u00e3o como par\u00e2metro.<\/p>\n<pre><code class=\"language-php\">do_action( 'action_name', [argument1], [argument2] );<\/code><\/pre>\n<p>S\u00f3 declarar esta fun\u00e7\u00e3o n\u00e3o far\u00e1 nada por si s\u00f3. Mas vai sentar-se no c\u00f3digo, esperando que outras fun\u00e7\u00f5es de a\u00e7\u00e3o a ativem. Passar qualquer argumento extra \u00e9 opcional, mas \u00e9 importante se voc\u00ea quiser que suas fun\u00e7\u00f5es de retorno as utilizem.<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/do_action_ref_array\">do_action_ref_array()<\/a><\/li>\n<\/ul>\n<p>Esta fun\u00e7\u00e3o de a\u00e7\u00e3o \u00e9 id\u00eantica a <code><strong>do_action()<\/strong><\/code>, exceto por uma diferen\u00e7a. Qualquer argumento passado por ela deve ser um array. Quando voc\u00ea tem muitos argumentos para passar ou seus argumentos j\u00e1 est\u00e3o em um array, esta fun\u00e7\u00e3o \u00e9 super \u00fatil.<\/p>\n<pre><code class=\"language-php\">\/\/ here's an example array\n$arguments_array = array( 'arg_1', 'foo', true, 'arg_4' );\n\ndo_action_ref_array( 'example_action', $arguments_array );<\/code><\/pre>\n<p>Como as arrays PHP s\u00e3o um mapa ordenado, certifique-se de que os argumentos que voc\u00ea passa estejam na ordem certa.<\/p>\n<p>Um exemplo da utiliza\u00e7\u00e3o desta fun\u00e7\u00e3o de a\u00e7\u00e3o \u00e9 a a\u00e7\u00e3o <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/admin_bar_menu\/\">admin_bar_menu<\/a>. Ela pode ser ligada para adicionar, manipular, ou remover os v\u00e1rios itens da barra admin. Todos os itens da barra de admin s\u00e3o definidos como elementos de um array.<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/did_action\">did_action()<\/a><\/li>\n<\/ul>\n<p>Se voc\u00ea quiser contar o n\u00famero de vezes que qualquer a\u00e7\u00e3o \u00e9 disparada, voc\u00ea pode invocar esta fun\u00e7\u00e3o de a\u00e7\u00e3o.<\/p>\n<pre><code class=\"language-php\">did_action( 'action_name' );<\/code><\/pre>\n<p>Esta fun\u00e7\u00e3o retorna um valor inteiro.<\/p>\n<p>A fun\u00e7\u00e3o <code><strong>did_action()<\/strong><\/code> \u00e9 extremamente \u00fatil quando voc\u00ea quer executar uma fun\u00e7\u00e3o de callback apenas na primeira vez que uma a\u00e7\u00e3o \u00e9 executada e nunca mais.<\/p>\n<pre><code class=\"language-php\">function example_callback_function() {\n    if( did_action( 'example_action' ) === 1 ) {\n    \/\/ checks if the 'example_action' hook is fired once, and only runs then, and never again!\n    }\n}\nadd_action('example_action', 'example_callback_function');<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/remove_action\">remove_action()<\/a><\/li>\n<\/ul>\n<p>Esta fun\u00e7\u00e3o de a\u00e7\u00e3o remove uma fun\u00e7\u00e3o de retorno de chamada ligada \u00e0 a\u00e7\u00e3o especificada. Por exemplo, voc\u00ea pode usar esta fun\u00e7\u00e3o para remover as fun\u00e7\u00f5es padr\u00e3o do WordPress enganchadas em a\u00e7\u00f5es internas e substitu\u00ed-las pelas suas pr\u00f3prias.<\/p>\n<pre><code class=\"language-php\">remove_action( 'action_name', 'function_to_be_removed', [priority] );<\/code><\/pre>\n<p>Existem alguns pr\u00e9-requisitos para chamar a fun\u00e7\u00e3o <code><strong>remove_action()<\/strong><\/code>:<\/p>\n<ol>\n<li>A <code><strong>function_to_be_removed<\/strong><\/code> e os par\u00e2metros de <code><strong>priority<\/strong><\/code> devem ser os mesmos que os usados originalmente na fun\u00e7\u00e3o <code><strong>add_action()<\/strong><\/code>.<\/li>\n<li>Voc\u00ea n\u00e3o pode chamar a fun\u00e7\u00e3o <code><strong>remove_action()<\/strong><\/code> diretamente. Voc\u00ea precisa cham\u00e1-la de dentro de outra fun\u00e7\u00e3o.<\/li>\n<li>Se a fun\u00e7\u00e3o callback for registrada de uma <em>classe<\/em>, ent\u00e3o a remo\u00e7\u00e3o tem outros requisitos. Voc\u00ea pode conferir a documenta\u00e7\u00e3o do WordPress Codex para mais detalhes.<\/li>\n<li>N\u00e3o \u00e9 poss\u00edvel remover a fun\u00e7\u00e3o de retorno de chamada antes ou depois do seu registro.<\/li>\n<\/ol>\n<p>Aqui est\u00e1 um exemplo de como o <a href=\"https:\/\/kinsta.com\/pt\/blog\/tutorial-woocommerce\/\">WooCommerce<\/a> usa esta fun\u00e7\u00e3o de a\u00e7\u00e3o para remover a miniatura padr\u00e3o do produto na p\u00e1gina principal da loja.<\/p>\n<pre><code class=\"language-php\">remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10 );<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/remove_all_actions\">remove_all_actions()<\/a><\/li>\n<\/ul>\n<p>Esta fun\u00e7\u00e3o de a\u00e7\u00e3o remove tudo o que est\u00e1 ligado a uma a\u00e7\u00e3o. O par\u00e2metro de priority \u00e9 opcional.<\/p>\n<pre><code class=\"language-php\">remove_all_actions( 'action_name', [priority] );<\/code><\/pre>\n<p>Lembre-se que esta fun\u00e7\u00e3o n\u00e3o pode ser chamada a partir da a\u00e7\u00e3o da qual voc\u00ea gostaria de desregistar fun\u00e7\u00f5es de callback. Isso causaria um loop infinito. Voc\u00ea pode se conectar a uma a\u00e7\u00e3o que foi disparada anteriormente para executar esta fun\u00e7\u00e3o sem erros.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/doing_action\/\">doing_action()<\/a><\/li>\n<\/ul>\n<p>Esta fun\u00e7\u00e3o de a\u00e7\u00e3o verifica se a a\u00e7\u00e3o especificada est\u00e1 sendo executada ou n\u00e3o. Ela retorna um valor booleano (<code><strong>true<\/strong><\/code> ou <code><strong>false<\/strong><\/code>).<\/p>\n<pre><code class=\"language-php\">\/\/ check whether the 'action_name' action is being executed\nif ( doing_action( 'action_name' ) ) {\n\u00a0 \u00a0 \/\/ execute your code here\n}<\/code><\/pre>\n<p>Voc\u00ea pode deixar o par\u00e2metro <code><strong>action_name<\/strong><\/code> vazio para verificar se<em> alguma<\/em> a\u00e7\u00e3o est\u00e1 sendo executada. Ele retornar\u00e1 <code><strong>true<\/strong><\/code> toda vez que qualquer action for disparada.<\/p>\n<pre><code class=\"language-php\">\/\/ check if any action is running and do something\nif ( doing_action() ) {\n  \u00a0 \/\/ the code here is run when any action is fired\n}<\/code><\/pre>\n<h4>Exemplo de A\u00e7\u00f5es 1: Mostrar uma Mensagem de Manuten\u00e7\u00e3o para os Visitantes do Seu Site<\/h4>\n<p>\u00c0s vezes, o melhor \u00e9 desconectar seu site e colocar uma <a href=\"https:\/\/kinsta.com\/pt\/blog\/modo-manutencao-wordpress\/\">p\u00e1gina em Manuten\u00e7\u00e3o<\/a>. Felizmente, o WordPress fornece uma maneira f\u00e1cil de fazer exatamente isso.<\/p>\n<pre><code class=\"language-php\">\/\/ show a maintenance message for all your site visitors\nadd_action( 'get_header', 'maintenance_message' );\nfunction maintenance_message() {\n    if (current_user_can( 'edit_posts' )) return;\n    wp_die( '&lt;h1&gt;Stay Pawsitive!&lt;\/h1&gt;&lt;br&gt;Sorry, we\\'re temporarily down for maintenance right meow.' );\n}<\/code><\/pre>\n<p>Vamos quebrar o c\u00f3digo e passar por cada passo:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/get_header\/\">get_header<\/a> \u00e9 uma a\u00e7\u00e3o que \u00e9 acionada antes que o arquivo de template do cabe\u00e7alho do site carregue. \u00c9 uma a\u00e7\u00e3o perfeita para ser acionada se voc\u00ea quiser interromper o carregamento do site principal.<\/li>\n<li>Conecte-se \u00e0 a\u00e7\u00e3o <code><strong>get_header<\/strong><\/code> usando a fun\u00e7\u00e3o <code><strong>add_action()<\/strong><\/code> com a fun\u00e7\u00e3o callback da <code><strong>maintenance_message()<\/strong><\/code>.<\/li>\n<li>Defina a fun\u00e7\u00e3o <code><strong>callback_message()<\/strong><\/code> de manuten\u00e7\u00e3o.<\/li>\n<li><strong><code>current_user_can( 'edit_posts'<\/code> )<\/strong> \u00e9 uma <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/current_user_can\/\">fun\u00e7\u00e3o de teste de capacidade do usu\u00e1rio<\/a> que verifica se o usu\u00e1rio atual est\u00e1 logado e <a href=\"https:\/\/wordpress.org\/support\/article\/roles-and-capabilities\/#edit_posts\">pode editar mensagens<\/a>. <a href=\"https:\/\/kinsta.com\/pt\/blog\/plugins-registro-usuario-wordpress\/\">Todo usu\u00e1rio registrado em um site WordPress<\/a>, exceto aqueles com fun\u00e7\u00f5es de Assinante, tem a capacidade de editar posts. Existem outras formas robustas de realizar esta verifica\u00e7\u00e3o, mas vamos manter este m\u00e9todo simples aqui.<\/li>\n<li>Use a fun\u00e7\u00e3o <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_die\/\">wp_die()<\/a> padr\u00e3o para matar a execu\u00e7\u00e3o do WordPress com gra\u00e7a e exibir uma p\u00e1gina HTML com uma mensagem de erro. Voc\u00ea pode usar a sintaxe HTML no par\u00e2metro da mensagem de erro para format\u00e1-la.<\/li>\n<\/ul>\n<p>Depois de salvar o c\u00f3digo no meu plugin personalizado, carreguei minha instala\u00e7\u00e3o local do WordPress no modo de navega\u00e7\u00e3o privada. A p\u00e1gina<strong> Em Manuten\u00e7\u00e3o<\/strong> \u00e9 um sucesso!<\/p>\n<figure id=\"attachment_72274\" aria-describedby=\"caption-attachment-72274\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72274 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/mostrando-mensagem-erro-visitantes-site.png\" alt=\"Mostrando uma mensagem de erro aos visitantes do site\" width=\"1100\" height=\"500\"><figcaption id=\"caption-attachment-72274\" class=\"wp-caption-text\">Mostrando uma mensagem de erro aos visitantes do site<\/figcaption><\/figure>\n<p>O site \u00e9 carregado com sucesso se eu estiver logado enquanto passa no teste de capacidade do usu\u00e1rio. Agora voc\u00ea pode continuar trabalhando na corre\u00e7\u00e3o do seu site enquanto ele mostra aos visitantes regulares esta p\u00e1gina.<\/p>\n<h4>Exemplo de A\u00e7\u00f5es 2: Ocultar itens do menu Painel de Controle de Usu\u00e1rios N\u00e3o-Admin<\/h4>\n<p>Se voc\u00ea est\u00e1 rodando um <a href=\"https:\/\/kinsta.com\/pt\/blog\/como-modifar-o-autor-no-wordpress\/\">blog multi-autor<\/a> ou <a href=\"https:\/\/kinsta.com\/pt\/blog\/manutencao-101-do-wordpress\/\">gerenciando um site para seus clientes<\/a>, ent\u00e3o voc\u00ea pode precisar esconder certos menus de administra\u00e7\u00e3o do <a href=\"https:\/\/kinsta.com\/pt\/blog\/painel-administrativo-wordpress\/\">painel de controle do WordPress<\/a> para usu\u00e1rios n\u00e3o-administradores. Voc\u00ea pode fazer isso se conectando na a\u00e7\u00e3o <code><strong>admin_menu<\/strong><\/code>.<\/p>\n<pre><code class=\"language-php\">\/\/ remove specific dashboard menus for non-admin users\nadd_action( 'admin_menu', 'hide_admin_menus' );\nfunction hide_admin_menus() {\n    if (current_user_can( 'create_users' )) return;\n    if (wp_get_current_user()-&gt;display_name == \"Salman\") return; \n    remove_menu_page( 'plugins.php' ); \n    remove_menu_page( 'themes.php' ); \n    remove_menu_page( 'tools.php' ); \n    remove_menu_page( 'users.php' ); \n    remove_menu_page( 'edit.php?post_type=page' ); \n    remove_menu_page( 'options-general.php' );\n}<\/code><\/pre>\n<p>Aqui est\u00e1 um passo-a-passo do trecho de c\u00f3digo acima:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/admin_menu\/\">admin_menu<\/a> \u00e9 uma a\u00e7\u00e3o que \u00e9 acionada antes que o menu admin carregue na \u00e1rea do painel de controle do WordPress.<\/li>\n<li>Conecte-se \u00e0 a\u00e7\u00e3o <code><strong>admin_menu<\/strong><\/code> usando a fun\u00e7\u00e3o <code><strong>add_action()<\/strong><\/code> usando a fun\u00e7\u00e3o<code><strong> hide_admin_menus()<\/strong><\/code> callback.<\/li>\n<li>A fun\u00e7\u00e3o <code><strong>hide_admin_menus()<\/strong><\/code> callback define a l\u00f3gica do c\u00f3digo. Ela \u00e9 executada toda vez que a a\u00e7\u00e3o <code><strong>admin_menu<\/strong><\/code> \u00e9 acionada.<\/li>\n<li>Dentro da fun\u00e7\u00e3o callback, a fun\u00e7\u00e3o <code><strong>current_user_can( 'create_users' )<\/strong><\/code> verifica se o usu\u00e1rio logado \u00e9 um administrador. Como apenas os administradores do site t\u00eam a capacidade de <code><strong>create_user<\/strong><\/code>, a fun\u00e7\u00e3o termina com um comando de <code><strong>return<\/strong><\/code>\u00a0se o usu\u00e1rio for um administrador.<\/li>\n<li>A fun\u00e7\u00e3o <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_current_user\/\">wp_get_current_user()<\/a> do WordPress recupera o objeto do usu\u00e1rio atual. Com esta fun\u00e7\u00e3o, podemos verificar se o usu\u00e1rio logado tem um conjunto particular de <code><strong>display_name<\/strong><\/code>. Esta \u00e9 uma linha opcional, caso voc\u00ea queira omitir certos usu\u00e1rios n\u00e3o-administrados de serem bloqueados devido a esta fun\u00e7\u00e3o de callback.<\/li>\n<li>A fun\u00e7\u00e3o <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/remove_menu_page\/\">remove_menu_page()<\/a> do WordPress remove menus de administra\u00e7\u00e3o de n\u00edvel superior. No exemplo de c\u00f3digo acima, eu estou removendo os seguintes menus de administra\u00e7\u00e3o: Plugins, Temas, Ferramentas, Usu\u00e1rios, P\u00e1ginas, e Op\u00e7\u00f5es.<\/li>\n<\/ul>\n<p>Ap\u00f3s salvar o arquivo do plugin, aqui est\u00e1 um instant\u00e2neo do painel de controle do WordPress com um administrador logado.<\/p>\n<figure id=\"attachment_72251\" aria-describedby=\"caption-attachment-72251\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72251 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/painel-administracao-padrao-wordpress.png\" alt=\"O painel de administra\u00e7\u00e3o padr\u00e3o do WordPress\" width=\"1100\" height=\"500\"><figcaption id=\"caption-attachment-72251\" class=\"wp-caption-text\">O painel de administra\u00e7\u00e3o padr\u00e3o do WordPress<\/figcaption><\/figure>\n<p>E aqui est\u00e1 uma captura de tela do painel do WordPress com um usu\u00e1rio n\u00e3o-administrado logado.<\/p>\n<figure id=\"attachment_72249\" aria-describedby=\"caption-attachment-72249\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72249 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/ocultando-itens-sensiveis-menu-administracao-usuarios-nao-administradores.png\" alt=\"Ocultando itens sens\u00edveis do menu de administra\u00e7\u00e3o de usu\u00e1rios n\u00e3o-administradores\" width=\"1100\" height=\"500\"><figcaption id=\"caption-attachment-72249\" class=\"wp-caption-text\">Ocultando itens sens\u00edveis do menu de administra\u00e7\u00e3o de usu\u00e1rios n\u00e3o-administradores<\/figcaption><\/figure>\n<p>Esta solu\u00e7\u00e3o esconde apenas os itens do menu de administra\u00e7\u00e3o especificados de aparecerem no painel do WordPress. Todos os usu\u00e1rios ainda podem acess\u00e1-los entrando com as URLs do menu em seus navegadores.<\/p>\n<p>Para desabilitar certas <a href=\"https:\/\/kinsta.com\/pt\/blog\/funcoes-usuario-wordpress\/\">fun\u00e7\u00f5es do usu\u00e1rio<\/a> de acessar menus espec\u00edficos, voc\u00ea precisa editar suas capacidades.<\/p>\n<h3>Filtragem<\/h3>\n<p>Os filtros fornecem uma maneira para que seu c\u00f3digo personalizado modifique os dados utilizados por outras fun\u00e7\u00f5es do WordPress. Ao contr\u00e1rio das a\u00e7\u00f5es, as fun\u00e7\u00f5es ligadas aos filtros precisam retornar um valor.<\/p>\n<h4>A fun\u00e7\u00e3o de filtro add_filter()<\/h4>\n<p>Voc\u00ea pode ligar uma fun\u00e7\u00e3o de callback a um filtro, seguindo estes passos:<\/p>\n<ol>\n<li>Defina uma <strong>fun\u00e7\u00e3o de Callback<\/strong> que ser\u00e1 executada quando o WordPress disparar o filtro. Fun\u00e7\u00f5es de Callback para filtros precisam ter pelo menos um argumento especificado, j\u00e1 que todos os filtros passam pelo menos um valor para suas fun\u00e7\u00f5es de callback.<\/li>\n<li>Registre a fun\u00e7\u00e3o callback em um filtro com a fun\u00e7\u00e3o <code><strong>add_filter()<\/strong><\/code>. O filtro se encarregar\u00e1 de chamar a fun\u00e7\u00e3o de callback. Conforme o Codex WordPress, a fun\u00e7\u00e3o <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_filter\/\">add_filter()<\/a> precisa passar pelo menos dois par\u00e2metros:\n<ul>\n<li>Nome do filtro a ser conectado.<\/li>\n<li>Nome da fun\u00e7\u00e3o de callback que funcionar\u00e1 quando o filtro disparar.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"3\">\n<li>A fun\u00e7\u00e3o <code><strong>add_filter()<\/strong><\/code> tamb\u00e9m aceita dois par\u00e2metros opcionais adicionais para definir a <code><strong>priority<\/strong><\/code> e o <code><strong>number of arguments<\/strong><\/code>. Estes par\u00e2metros funcionam da mesma forma que com a fun\u00e7\u00e3o <code><strong>add_action()<\/strong><\/code>.<\/li>\n<\/ol>\n<p>Aqui est\u00e1 um exemplo de como voc\u00ea pode usar a fun\u00e7\u00e3o <code><strong>add_filter()<\/strong><\/code> para enganchar uma fun\u00e7\u00e3o de callback para um filtro.<\/p>\n<pre><code class=\"language-php\">\/\/ define the filter callback function with at least one argument passed\n\/\/ the number of arguments that you can pass depends on how the filter is defined\nfunction filter_callback_function( $arg1, $arg2 ) {\n\u00a0 \u00a0 \/\/ make your code do something with the arguments and return something\n\u00a0 \u00a0 return $something;\n}\n\n\/\/ now hook the callback function to the 'example_filter'\nadd_filter( 'example_filter', 'filter_callback_function', [priority], [no_of_args] );\n\n\/\/ '10' is the default priority set for the callback function\n\/\/ and '1' is the default number of arguments passed<\/code><\/pre>\n<h4>Exemplo de Filtragem<\/h4>\n<p>O WordPress fornece um filtro chamado <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Filter_Reference\/login_message\">login_message<\/a> para filtrar a mensagem exibida na p\u00e1gina de login acima do formul\u00e1rio de login. O valor retornado por este filtro pode ter <a href=\"https:\/\/kinsta.com\/pt\/blog\/editores-html-gratuitos\/\">uma marca\u00e7\u00e3o HTML<\/a>.<\/p>\n<p>Vamos conectar no filtro de <code><strong>login_message<\/strong><\/code> e modificar a mensagem mostrada na tela de login.<\/p>\n<pre><code class=\"language-php\">\/\/ show a custom login message above the login form\nfunction custom_login_message( $message ) {\n\u00a0 \u00a0 if ( empty( $message ) ) {\n\u00a0 \u00a0 \u00a0 \u00a0 return \"&lt;h2&gt;Welcome to Let's Develop by Salman Ravoof! Please log in to start learning.&lt;\/h2&gt;\";\n\u00a0 \u00a0 } \n    else {\n\u00a0 \u00a0 \u00a0 \u00a0 return $message;\n\u00a0 \u00a0 }\n}\nadd_filter( 'login_message', 'custom_login_message' );<\/code><\/pre>\n<p>A instru\u00e7\u00e3o <code><strong>if-else<\/strong><\/code> na fun\u00e7\u00e3o de retorno de chamada verifica se a mensagem de login j\u00e1 est\u00e1 definida, na maioria das vezes por outro plugin ou tema. Nesses casos, a fun\u00e7\u00e3o callback retorna o valor original sem altera\u00e7\u00f5es. Esta \u00e9 uma forma de evitar conflitos com outros plugins ou temas.<\/p>\n<p>Voc\u00ea pode ver a mensagem sendo exibida acima do formul\u00e1rio de login na <a href=\"https:\/\/kinsta.com\/pt\/blog\/login-wordpress-url\/\">p\u00e1gina de login do WordPress<\/a>.<\/p>\n<figure id=\"attachment_72252\" aria-describedby=\"caption-attachment-72252\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72252 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/mostrando-mensagem-login-personalizada-acima-formulario-login.png\" alt=\"Mostrando uma mensagem de login personalizada acima do formul\u00e1rio de login\" width=\"1100\" height=\"514\"><figcaption id=\"caption-attachment-72252\" class=\"wp-caption-text\">Mostrando uma mensagem de login personalizada acima do formul\u00e1rio de login<\/figcaption><\/figure>\n<p>Voc\u00ea pode estilizar todos os elementos da p\u00e1gina de login, consultando as folhas de estilo personalizadas. Fazendo isso, voc\u00ea poder\u00e1 personalizar totalmente sua p\u00e1gina de login padr\u00e3o do WordPress.<\/p>\n<p>Voc\u00ea aprender\u00e1 como carregar folhas de estilo personalizadas usando a\u00e7\u00f5es na se\u00e7\u00e3o &#8220;Personalizar a P\u00e1gina de Login do WordPress com Hooks&#8221;.<\/p>\n<h4>Encontrando Filtros Suportados pelo WordPress<\/h4>\n<p>Em qualquer lugar onde o WordPress processa ou modifica dados, voc\u00ea pode quase certamente encontrar um filtro para se conectar e mud\u00e1-los. Pense em filtros como uma interface entre o <a href=\"https:\/\/kinsta.com\/pt\/blog\/solucionar-reparar-problemas-banco-dados\/\">banco de dados do WordPress<\/a> e o navegador.<\/p>\n<p>Voc\u00ea pode encontrar uma lista exaustiva de todos os filtros suportados pelo WordPress na p\u00e1gina <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Filter_Reference\">Plugin API\/Filter Reference<\/a>.<\/p>\n<figure id=\"attachment_72258\" aria-describedby=\"caption-attachment-72258\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72258 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/wordpress-fornece-variedade-filtros-enganchar.png\" alt=\"O WordPress fornece uma variedade de filtros para enganchar em\" width=\"1100\" height=\"514\"><figcaption id=\"caption-attachment-72258\" class=\"wp-caption-text\">O WordPress fornece uma variedade de filtros para enganchar em<\/figcaption><\/figure>\n<p>Todos os filtros ali listados s\u00e3o divididos em m\u00faltiplas categorias e dispostos de cima para baixo na ordem de execu\u00e7\u00e3o do WordPress.<\/p>\n<p>Se voc\u00ea quiser encontrar filtros para se conectar no c\u00f3digo fonte do WordPress, fa\u00e7a uma busca pelo termo &#8220;<strong>apply_filters&#8221;<\/strong> e voc\u00ea ter\u00e1 toneladas de resultados. O <a href=\"https:\/\/developer.wordpress.org\/reference\/\">C\u00f3digo de Refer\u00eancia do WordPress<\/a> tamb\u00e9m \u00e9 um \u00f3timo lugar para procurar por tudo que est\u00e1 inclu\u00eddo no WordPress, incluindo a\u00e7\u00f5es e filtros.<\/p>\n<h4>Como o WordPress Core Utiliza os Filtros<\/h4>\n<p>O pr\u00f3prio WordPress Core utiliza muitos de seus filtros embutidos para modificar os dados utilizados pelas suas diversas fun\u00e7\u00f5es.<\/p>\n<p>Considere <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/the_content\/\">the_content<\/a> filter, por exemplo. Ele filtra o conte\u00fado do post ap\u00f3s ser recuperado do banco de dados e antes de ser exibido no navegador.<\/p>\n<p>Assim como nas a\u00e7\u00f5es, voc\u00ea pode encontrar a maioria das fun\u00e7\u00f5es de filtro do WordPress Core relacionadas <code><strong>ao_content<\/strong><\/code> hook no arquivo<strong> <code>wp-includes\/default-filters.php<\/code>.<\/strong><\/p>\n<p>Aqui est\u00e1 uma lista de todas as fun\u00e7\u00f5es do n\u00facleo <code><strong>add_filter()<\/strong><\/code> que se encaixam no filtro_content:<\/p>\n<pre><code class=\"language-php\">add_filter( 'the_content', 'do_blocks', 9 );\nadd_filter( 'the_content', 'wptexturize' );\nadd_filter( 'the_content', 'convert_smilies', 20 );\nadd_filter( 'the_content', 'wpautop' );\nadd_filter( 'the_content', 'shortcode_unautop' );\nadd_filter( 'the_content', 'prepend_attachment' );\nadd_filter( 'the_content', 'wp_make_content_images_responsive' );\nadd_filter( 'the_content', 'do_shortcode', 11 ); \/\/ AFTER wpautop().\u00a0<\/code><\/pre>\n<p>Observe a priority especificada para certas fun\u00e7\u00f5es de callback.<\/p>\n<p>Por exemplo, a fun\u00e7\u00e3o <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/do_blocks\/\">do_blocks()<\/a> analisa quaisquer blocos din\u00e2micos no conte\u00fado do post e os torna compat\u00edveis com o <a href=\"https:\/\/kinsta.com\/pt\/blog\/editor-gutenberg-wordpress\/\">novo editor de blocos do WordPress<\/a>. \u00c9 especificada uma priority maior do que o padr\u00e3o (10) para garantir que o conte\u00fado esteja pronto para o bloco antes que as outras fun\u00e7\u00f5es sejam executadas.<\/p>\n<p>A fun\u00e7\u00e3o <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/convert_smilies\/\">convert_smilies()<\/a> \u00e9 definida para rodar com menor priority, pois sua tarefa \u00e9 converter smileys de texto em sprites de imagem. Ter ele rodando no final ap\u00f3s filtrar todo o conte\u00fado do post faz sentido.<\/p>\n<p>Fato engra\u00e7ado: Os c\u00f3digos curtos s\u00e3o um subconjunto de filtros. Eles recebem a entrada do atalho, processam e retornam a sa\u00edda de volta para ele. Saiba mais sobre atalhos neste <a href=\"https:\/\/kinsta.com\/pt\/blog\/codigo-curto-wordpress\/\">guia final do WordPress Shortcodes<\/a>.<\/p>\n<h4>Outras Fun\u00e7\u00f5es do Filtro<\/h4>\n<p>Enquanto <code><strong>add_filter()<\/strong><\/code> \u00e9 a fun\u00e7\u00e3o de filtro mais utilizada, existem muitas outras fun\u00e7\u00f5es de filtro \u00fateis. Vamos discuti-las todas em profundidade.<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/has_filter\">has_filter()<\/a><\/li>\n<\/ul>\n<p>Esta fun\u00e7\u00e3o verifica se o filtro especificado est\u00e1 viciado por alguma fun\u00e7\u00e3o. Ela aceita dois par\u00e2metros. O primeiro par\u00e2metro \u00e9 para inserir o nome do filtro. O segundo par\u00e2metro \u00e9 opcional e \u00e9 para inserir o nome da fun\u00e7\u00e3o callback.<\/p>\n<pre><code class=\"language-php\">has_filter( 'filter_name', 'function_to_check' );<\/code><\/pre>\n<p>Se voc\u00ea especificar apenas o primeiro par\u00e2metro, ele retornar\u00e1 <code><strong>true<\/strong><\/code> se o <code><strong>filter_name<\/strong><\/code>\u00a0estiver viciado por<em> qualquer<\/em> fun\u00e7\u00e3o.<\/p>\n<p>Entretanto, se voc\u00ea especificar ambos os par\u00e2metros, ent\u00e3o ele retornar\u00e1 <code><strong>false<\/strong><\/code> se a fun\u00e7\u00e3o callback mencionada n\u00e3o for registrada com o filtro dado. Se encontrar a fun\u00e7\u00e3o de callback registrada com o filtro, ent\u00e3o retornar\u00e1 a <code><strong>priority<\/strong><\/code> (um n\u00famero inteiro) definida para aquela fun\u00e7\u00e3o neste filtro.<\/p>\n<p>Uma poss\u00edvel aplica\u00e7\u00e3o da fun\u00e7\u00e3o <code><strong>has_filter()<\/strong><\/code> \u00e9 verificar se algum filtro j\u00e1 foi viciado, e com base nisso avan\u00e7ar com a execu\u00e7\u00e3o do c\u00f3digo.<\/p>\n<pre><code class=\"language-php\">\/\/ check to see if 'the_content' filter has been hooked\nif ( ! has_filter( 'the_content' ) {\n\u00a0 \u00a0 \/\/ hook the filter if and only if it hasn't been hooked before\n\u00a0 \u00a0 add_filter( 'the_content', 'modify_the_content' );\n}<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/apply_filters\/\">apply_filters()<\/a><\/li>\n<\/ul>\n<p>Esta fun\u00e7\u00e3o de filtro \u00e9 como a fun\u00e7\u00e3o <code><strong>do_action()<\/strong><\/code> action. Qualquer fun\u00e7\u00e3o de callback ligada a este filtro ser\u00e1 executada onde quer que esta fun\u00e7\u00e3o esteja no c\u00f3digo do WordPress.<\/p>\n<p>Voc\u00ea tamb\u00e9m pode usar esta fun\u00e7\u00e3o para criar um novo filtro personalizado, especificando o nome do filtro e o valor do filtro como par\u00e2metros.<\/p>\n<pre><code class=\"language-php\">apply_filters( 'filter_name', 'value_to_filter', [argument1], [argument2] );<\/code><\/pre>\n<p>N\u00e3o esque\u00e7a de especificar quaisquer argumentos adicionais se voc\u00ea quiser pass\u00e1-los para suas fun\u00e7\u00f5es de callback. A maioria dos filtros usa apenas um argumento, por isso \u00e9 f\u00e1cil n\u00e3o definir os argumentos adicionais.<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/apply_filters_ref_array\">apply_filters_ref_array()<\/a><\/li>\n<\/ul>\n<p>Esta fun\u00e7\u00e3o \u00e9 como a fun\u00e7\u00e3o <code><strong>apply_filters()<\/strong><\/code>, exceto que todos os argumentos que ela aceita s\u00e3o empacotados como um array.<\/p>\n<pre><code class=\"language-php\">\/\/ an example array\n$arguments_array = array( 'some_value', 'foo', false, 'another_value' );\n\napply_filters_ref_array( 'example_filter', $arguments_array );<\/code><\/pre>\n<p>Esta fun\u00e7\u00e3o de filtro pode ser \u00fatil quando voc\u00ea tem muitos argumentos para passar ou se todos eles j\u00e1 est\u00e3o em um array. Certifique-se de que os argumentos dentro do array est\u00e3o na ordem correta.<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/current_filter\">current_filter()<\/a><\/li>\n<\/ul>\n<p>Esta fun\u00e7\u00e3o de filtro recupera o nome do filtro atual ou a\u00e7\u00e3o que est\u00e1 sendo executada. Voc\u00ea n\u00e3o precisa especificar nenhum par\u00e2metro, pois ele roda dentro da fun\u00e7\u00e3o de retorno de chamada.<\/p>\n<p>Aqui est\u00e1 um exemplo de seu uso:<\/p>\n<pre><code class=\"language-php\">function example_callback() {\n\u00a0 \u00a0 echo current_filter(); \/\/ 'the_title' will be echoed\n\u00a0 \u00a0 return\n}\nadd_filter( 'the_title', 'example_callback' );<\/code><\/pre>\n<p>Apesar de seu nome, esta fun\u00e7\u00e3o pode recuperar o nome tanto das a\u00e7\u00f5es como dos filtros.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/remove_filter\/\">remove_filter()<\/a><\/li>\n<\/ul>\n<p>Esta fun\u00e7\u00e3o de filtro remove a fun\u00e7\u00e3o de callback anexada ao filtro especificado. Ela funciona exatamente como a fun\u00e7\u00e3o <code><strong>remove_action()<\/strong><\/code>. Voc\u00ea pode us\u00e1-la para excluir fun\u00e7\u00f5es padr\u00e3o do WordPress registradas com um filtro espec\u00edfico, e se necess\u00e1rio substitu\u00ed-las por suas pr\u00f3prias fun\u00e7\u00f5es.<\/p>\n<pre><code class=\"language-php\">remove_filter( 'filter_name', 'function_to_be_removed', [priority] );<\/code><\/pre>\n<p>Para desacoplar uma fun\u00e7\u00e3o de callback ligada a um filtro, a <code><strong>function_to_be_removed<\/strong><\/code> e os par\u00e2metros de <code><strong>priority<\/strong><\/code> devem ser id\u00eanticos aos argumentos utilizados quando se liga a fun\u00e7\u00e3o de callback.<\/p>\n<p>Se o filtro foi adicionado de dentro de uma classe, que normalmente \u00e9 o caso quando eles s\u00e3o adicionados por plugins, ent\u00e3o voc\u00ea precisa <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/remove_filter\/#comment-613\">acessar a vari\u00e1vel de classe para remover o filtro<\/a>.<\/p>\n<pre><code class=\"language-php\">\/\/ access the class variable first, and then remove the filter through it\nglobal $some_class;\n\nremove_filter( 'the_content', array($some_class, 'class_filter_callback') );<\/code><\/pre>\n<p>Vamos dar um \u00f3timo exemplo de <code><strong>remove_filter()<\/strong><\/code> em a\u00e7\u00e3o.<\/p>\n<p>O <a href=\"https:\/\/kinsta.com\/pt\/blog\/plugins-ecommerce-do-wordpress\/#woocommerce\">plugin WooCommerce<\/a> usa a fun\u00e7\u00e3o de chamada <a href=\"https:\/\/docs.woocommerce.com\/wc-apidocs\/source-function-wc_lostpassword_url.html#13-39\">wc_lostpassword_url()<\/a> ligada ao seu filtro <a href=\"https:\/\/docs.woocommerce.com\/wc-apidocs\/source-function-wc_lostpassword_url.html#41\">lostpassword_url<\/a> para redirecionar &#8220;<em>Lost Your Password? <\/em>&#8221; por usu\u00e1rios.<\/p>\n<p>\u00c9 necess\u00e1rio que qualquer usu\u00e1rio clique nesse link para uma p\u00e1gina de frontend personalizada com a URL <code><strong>\/my-account\/lost-password<\/strong><\/code>. Sem esse filtro, ele os levaria para a URL padr\u00e3o de login do WordPress em <code><strong>\/wp-login.php<\/strong><\/code>.<\/p>\n<p>Digamos que voc\u00ea queira redefinir esta funcionalidade e enviar seus usu\u00e1rios para a <a href=\"https:\/\/kinsta.com\/pt\/blog\/mudar-senhas-wordpress\/\">p\u00e1gina padr\u00e3o de recupera\u00e7\u00e3o de senha<\/a> ou para uma p\u00e1gina separada completamente. Voc\u00ea pode remover esta fun\u00e7\u00e3o de callback desta forma:<\/p>\n<pre><code class=\"language-php\">remove_filter( 'lostpassword_url', 'wc_lostpassword_url', 10 );\u00a0<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/remove_all_filters\">remove_all_filters()<\/a><\/li>\n<\/ul>\n<p>Esta fun\u00e7\u00e3o de filtro remove todas as fun\u00e7\u00f5es de callback registradas em um filtro.<\/p>\n<pre><code class=\"language-php\">remove_all_filters( 'filter_name', [priority] );<\/code><\/pre>\n<p>\u00c9 similar \u00e0 fun\u00e7\u00e3o <code><strong>remove_all_actions()<\/strong><\/code>.<\/p>\n<p>O popular <a href=\"https:\/\/github.com\/KimcoBlogSC\/Blog\/blob\/master\/wp-content\/plugins\/advanced-excerpt\/functions\/functions.php\">plugin Advanced Excerpts<\/a> usa esta fun\u00e7\u00e3o para remover todas as fun\u00e7\u00f5es padr\u00e3o ligadas <code><strong>ao_excerpt<\/strong><\/code> e aos_filtros <strong><code>get_the_excerpt<\/code>. <\/strong>Depois de fazer isso, ele ent\u00e3o engata sua pr\u00f3pria fun\u00e7\u00e3o de callback no filtro.<\/p>\n<pre><code class=\"language-php\">\/\/ Ensure our filter is hooked, regardless of the page type \nif ( ! has_filter( 'get_the_excerpt', array( $advanced_excerpt, 'filter_excerpt' ) ) ) {\n    remove_all_filters( 'get_the_excerpt' ); \n    remove_all_filters( 'the_excerpt' ); \n    add_filter( 'get_the_excerpt', array( $advanced_excerpt, 'filter_excerpt' ) );\n}<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/doing_filter\/\">doing_filter()<\/a><\/li>\n<\/ul>\n<p>Esta fun\u00e7\u00e3o de filtro verifica se o filtro especificado est\u00e1 sendo executado no momento.<\/p>\n<pre><code class=\"language-php\">if ( doing_filter( 'save_post' ) ) {\n  \u00a0 \/\/ run your code here\n}<\/code><\/pre>\n<p>Ele retorna um valor booleano (<code><strong>true<\/strong><\/code> ou <code><strong>false<\/strong><\/code>).<\/p>\n<p>Voc\u00ea deve notar a diferen\u00e7a entre esta fun\u00e7\u00e3o e a fun\u00e7\u00e3o <code><strong>current_filter()<\/strong><\/code>, que retorna o nome do filtro ou a\u00e7\u00e3o sendo executada (uma string).<\/p>\n<h4>Filtros Exemplo 1: Adicionando um filtro Profanity para coment\u00e1rios<\/h4>\n<p>Gerenciar todos os <a href=\"https:\/\/kinsta.com\/pt\/blog\/melhores-plugins-de-comentarios-do-wordpress\/\">coment\u00e1rios no seu site WordPress<\/a> pode ser um processo inc\u00f4modo. O filtro <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/comment_text\/\">comment_text<\/a> permite que voc\u00ea defina regras para modificar os coment\u00e1rios antes que eles sejam impressos no display.<\/p>\n<figure id=\"attachment_72268\" aria-describedby=\"caption-attachment-72268\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72268 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/comentarios-filtrados-profanidades-ficticias-marcadas.png\" alt=\"Coment\u00e1rios n\u00e3o filtrados com profanidades fict\u00edcias marcadas\" width=\"1100\" height=\"563\"><figcaption id=\"caption-attachment-72268\" class=\"wp-caption-text\">Coment\u00e1rios n\u00e3o filtrados com profanidades fict\u00edcias marcadas<\/figcaption><\/figure>\n<p>Voc\u00ea pode direcionar o WordPress para remover quaisquer expletivos automaticamente antes que eles sejam exibidos aos visitantes do seu site. Vamos a isso.<\/p>\n<pre><code class=\"language-php\">\/\/ hook into the 'comment_text' filter with the callback function\nadd_filter( 'comment_text', 'the_profanity_filter' );\n\n\/\/ define a callback function to filter profanities in comments \nfunction the_profanity_filter( $comment_text ) {\n    \/\/ define an array of profane words and count how many are there \n    $profaneWords = array('fudge', 'darn', 'pickles', 'blows', 'dangit');\n    $profaneWordsCount = sizeof($profaneWords);\n    \n    \/\/ loop through the profanities in $comment_text and replace them with '*'\n    for($i=0; $i &lt; $profaneWordsCount; $i++) {\n        $comment_text = str_ireplace( $profaneWords[$i], str_repeat('*', strlen( $profaneWords[$i]) ), $comment_text );\n    } \n    \n    return $comment_text;\n}<\/code><\/pre>\n<p>Aqui est\u00e1 uma divis\u00e3o do c\u00f3digo linha a linha:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/comment_text\/\">comment_text<\/a> \u00e9 um Hook de filtro que permite modificar o texto de um coment\u00e1rio antes que o navegador o exiba. Voc\u00ea pode registrar sua fun\u00e7\u00e3o de callback com ele para filtrar sua sa\u00edda.<\/li>\n<li>A fun\u00e7\u00e3o <code><strong>add_filter()<\/strong><\/code> permite que voc\u00ea se conecte ao filtro <code><strong>comment_text<\/strong><\/code> e anexe uma fun\u00e7\u00e3o de callback a ele.<\/li>\n<li><code><strong>the_profanity_filter()<\/strong><\/code> \u00e9 o nome da fun\u00e7\u00e3o callback. Ele aceita apenas um par\u00e2metro, que \u00e9 uma string contendo o texto do coment\u00e1rio. Defina esta fun\u00e7\u00e3o personalizada com a l\u00f3gica de c\u00f3digo apropriada.<\/li>\n<li>Armazene todas as palavras profanas em um array PHP chamado <code><strong>profaneWords<\/strong><\/code>. Voc\u00ea pode adicionar quantas palavras voc\u00ea quiser a este array. Eu estou armazenando o tamanho deste array na vari\u00e1vel <code><strong>profaneWordsCount<\/strong><\/code> com a ajuda da <a href=\"https:\/\/www.php.net\/manual\/en\/function.sizeof.php\">sizeof() PHP function<\/a>.<\/li>\n<li>Percorra todas as palavras profanas e use a <a href=\"https:\/\/www.php.net\/manual\/en\/function.str-ireplace.php\">str_ireplace() function<\/a> padr\u00e3o do PHP para substituir qualquer uma das profanidades correspondentes por s\u00edmbolos <code><strong>*<\/strong><\/code>. Como esta \u00e9 uma fun\u00e7\u00e3o de substitui\u00e7\u00e3o de str_ireplace, voc\u00ea n\u00e3o tem que se preocupar com a capitaliza\u00e7\u00e3o. Confira as diferentes maneiras de realizar a <a href=\"https:\/\/kinsta.com\/pt\/blog\/busca-e-substituicao-no-wordpress\/\">pesquisa e substitui\u00e7\u00e3o<\/a>.<\/li>\n<li>Use <code><strong>return<\/strong><\/code> para emitir o texto de coment\u00e1rio filtrado.<\/li>\n<\/ul>\n<p>Salve as altera\u00e7\u00f5es no seu arquivo de plugin personalizado e recarregue qualquer post com coment\u00e1rios. Todas as palavras que voc\u00ea incluiu no array do <code><strong>profaneWords<\/strong><\/code> devem agora ser substitu\u00eddas por s\u00edmbolos &#8216;<strong>*&#8217;<\/strong>.<\/p>\n<figure id=\"attachment_72256\" aria-describedby=\"caption-attachment-72256\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72256 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/censurando-profanidades-comentarios-simbolos.png\" alt=\"Censurando profanidades nos coment\u00e1rios com s\u00edmbolos '*'.\" width=\"1100\" height=\"563\"><figcaption id=\"caption-attachment-72256\" class=\"wp-caption-text\">Censurando profanidades nos coment\u00e1rios com s\u00edmbolos &#8216;*&#8217;.<\/figcaption><\/figure>\n<p>Os coment\u00e1rios originais ainda estar\u00e3o dispon\u00edveis como est\u00e3o no banco de dados. Este filtro apenas modifica o texto do coment\u00e1rio antes de ser enviado para o frontend.<\/p>\n<figure id=\"attachment_72263\" aria-describedby=\"caption-attachment-72263\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72263 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/comentario-original-back-end-site.png\" alt=\"O coment\u00e1rio original no back-end do site\" width=\"1100\" height=\"498\"><figcaption id=\"caption-attachment-72263\" class=\"wp-caption-text\">O coment\u00e1rio original no back-end do site<\/figcaption><\/figure>\n<p>Uma vez conectado ao filtro certo, voc\u00ea pode fazer um monte de coisas legais com ele.<\/p>\n<p>Por exemplo, voc\u00ea tamb\u00e9m pode usar o filtro <code><strong>comment_text<\/strong><\/code> para remover quaisquer URLs de todos os coment\u00e1rios (certifique-se de ler este guia detalhado sobre <a href=\"https:\/\/kinsta.com\/pt\/blog\/spam-comentarios-wordpress\/\">como parar coment\u00e1rios de spam no WordPress<\/a>).<\/p>\n<p>Ou voc\u00ea pode se conectar ao filtro <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/pre_comment_approved\/\">pre_comment_approved<\/a> e marcar coment\u00e1rios como aprovados, spam, ou thrash com base em crit\u00e9rios pr\u00e9-definidos.<\/p>\n<h4>Filtros Exemplo 2: Inserir conte\u00fado ap\u00f3s uma postagem<\/h4>\n<p>Voc\u00ea j\u00e1 viu como o WordPress usa o filtro <code><strong>the_content<\/strong><\/code> para modificar o conte\u00fado do post ou da p\u00e1gina. Vamos usar o mesmo filtro para adicionar algo no final de cada post.<\/p>\n<pre><code class=\"language-php\">\/\/ hook into 'the_content' filter with a callback function\nadd_filter( 'the_content', 'insert_content_below' );\n\n\/\/ define the callback function to insert something below the post\nfunction insert_content_below( $content ) {\n    \/\/ check to see if we're inside the main loop in a single post\n    if ( is_single() && in_the_loop() && is_main_query() ) {\n  \u00a0     return $content . \"&lt;h3 style=\\\"text-align: center;\\\"&gt;Let me insert myself here&lt;\/h3&gt;&lt;p style=\\\"text-align: center;border: 3px solid #5333ed;\\\"&gt;I'll appear after the post. You can insert anything here. Even HTML. Headers, links, images, scripts, I'll take them all and append it to the end of the post content. You can also give me a class, so you can style me easily with CSS style sheets.&lt;\/p&gt;\" ;\n    } \n    \n    return $content;\n}<\/code><\/pre>\n<p>Entendendo a l\u00f3gica do c\u00f3digo no exemplo acima:<\/p>\n<ul>\n<li><code><strong>the_content<\/strong><\/code> filter hook ajuda voc\u00ea a pegar o conte\u00fado do post atual e customiz\u00e1-lo.<\/li>\n<li>Use a fun\u00e7\u00e3o <code><strong>add_filter()<\/strong><\/code> para enganchar no filtro_content com a fun\u00e7\u00e3o <code><strong>insert_content_below()<\/strong><\/code> callback.<\/li>\n<li>Defina a fun\u00e7\u00e3o callback passando o conte\u00fado do post atual como par\u00e2metro (<code><strong>$content<\/strong><\/code>).<\/li>\n<li>Dentro da fun\u00e7\u00e3o callback, verifique se voc\u00ea s\u00f3 est\u00e1 filtrando o conte\u00fado na consulta principal, que neste caso \u00e9 o conte\u00fado do post. Se voc\u00ea n\u00e3o verificar isso, algumas vezes o c\u00f3digo ir\u00e1 filtrar o conte\u00fado de outros lugares, como barras laterais e rodap\u00e9s, sem querer.<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/is_main_query\/\">is_main_query()<\/a> e <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/in_the_loop\/#comment-1364\">in_the_loop()<\/a> condicionals determinam se a consulta \u00e9 uma consulta principal e acontece dentro do Loop principal do WordPress.<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/is_single\/\">is_single()<\/a> verifica se a consulta \u00e9 para um \u00fanico post.<\/li>\n<li>Use o <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.string.php\">operador de concatena\u00e7\u00e3o de strings<\/a> do PHP (<code><strong>$content . \u201cyour additions\u201d<\/strong><\/code>) para adicionar coisas extras ao conte\u00fado da p\u00e1gina.<\/li>\n<li><code><strong>return<\/strong><\/code> o coment\u00e1rio filtrado se todos os condicionantes acima forem verificados. Caso contr\u00e1rio, basta return o conte\u00fado sem altera\u00e7\u00f5es.<\/li>\n<\/ul>\n<p>Salve seu arquivo de plugin, carregue qualquer post em seu site e v\u00e1 at\u00e9 o final.<\/p>\n<figure id=\"attachment_72261\" aria-describedby=\"caption-attachment-72261\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72261 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/inserindo-algo-final-conteudo-post.png\" alt=\"Inserindo algo no final do conte\u00fado do post\" width=\"1100\" height=\"491\"><figcaption id=\"caption-attachment-72261\" class=\"wp-caption-text\">Inserindo algo no final do conte\u00fado do post<\/figcaption><\/figure>\n<p>Voc\u00ea pode usar a mesma l\u00f3gica para adicionar qualquer coisa ao in\u00edcio de todas as suas mensagens invertendo a posi\u00e7\u00e3o dos par\u00e2metros de concatena\u00e7\u00e3o de strings (<code><strong>\"your additions\" . $content<\/strong><\/code>).<\/p>\n<h3>Personalize a p\u00e1gina de login do WordPress com hooks<\/h3>\n<p>Vamos usar tanto a\u00e7\u00f5es quanto filtros para customizar a <a href=\"https:\/\/kinsta.com\/pt\/blog\/login-wordpress-url\/\">p\u00e1gina de login padr\u00e3o do WordPress<\/a>. Vou criar um novo plugin chamado<strong> Sal Custom Login Page<\/strong> para fazer isso. Voc\u00ea pode encontrar o c\u00f3digo fonte completo deste plugin no final desta se\u00e7\u00e3o.<\/p>\n<figure id=\"attachment_72243\" aria-describedby=\"caption-attachment-72243\" style=\"width: 1110px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72243 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/tela-final-login-personalizada-wordpress.jpg\" alt=\"A tela final de login personalizada do WordPress\" width=\"1110\" height=\"700\"><figcaption id=\"caption-attachment-72243\" class=\"wp-caption-text\">A tela final de login personalizada do WordPress<\/figcaption><\/figure>\n<p>Vamos come\u00e7ar adicionando os campos padr\u00e3o do cabe\u00e7alho do plugin e registrando-o com o WordPress.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n\/*\nPlugin Name:  Sal Custom Login Page\nVersion:  1.0\nDescription:  Demonstrating WordPress Hooks (Actions and Filters) by customizing the WordPress login page.\nAuthor:  Salman Ravoof\nAuthor URI:  https:\/\/www.salmanravoof.com\/License: GPLv2 or later\nLicense URI: https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\nText Domain:  sal-custom-login-page\n*\/\n\n\/\/ enqueueing the custom style sheet on WordPress login page\nadd_action( 'login_enqueue_scripts', 'salhooks_login_stylesheet');\nfunction salhooks_login_stylesheet() {\n    \/\/ Load the style sheet from the plugin folder\n    wp_enqueue_style( 'sal-custom-login-page', plugin_dir_url( __FILE__ ).'sal-custom-login-page-styles.css' );\n}<\/code><\/pre>\n<p>Primeiro, conecte-se \u00e0 a\u00e7\u00e3o <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/login_enqueue_scripts\/\">login_enque_scripts<\/a> para consultar sua folha de estilo personalizada. Quaisquer scripts ou estilos que voc\u00ea consultar aqui est\u00e3o inclu\u00eddos na se\u00e7\u00e3o de cabe\u00e7alho da sua p\u00e1gina de login.<\/p>\n<p>Se voc\u00ea quiser carregar scripts personalizados e folhas de estilo no frontend do seu site (e n\u00e3o no backend do administrador ou na \u00e1rea de login), ent\u00e3o voc\u00ea precisa se conectar \u00e0 a\u00e7\u00e3o <code><strong>wp_enqueue_scripts<\/strong><\/code>. Voc\u00ea pode ler mais sobre isso no <a href=\"https:\/\/kinsta.com\/pt\/blog\/wp-enqueue-scripts\/\">artigo do<\/a><a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/wp_enqueue_scripts\/\"> WordPress Codex<\/a> e <a href=\"https:\/\/kinsta.com\/pt\/blog\/wp-enqueue-scripts\/\">Kinsta sobre como usar o wp_enqueue_scripts<\/a>.<\/p>\n<p>Dentro da fun\u00e7\u00e3o <code><strong>sal-custom-login_stylesheet()<\/strong><\/code> callback, use a fun\u00e7\u00e3o <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_enqueue_style\/\">wp_enqueue_style()<\/a> para carregar a folha de estilo personalizada (<code><strong>sal-custom-login-pagin-page-styles.css<\/strong><\/code>) colocada no mesmo diret\u00f3rio do plugin. A fun\u00e7\u00e3o <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/plugin_dir_url\/\">plugin_dir_url( __FILE__ )<\/a> integrada ao WordPress facilita a obten\u00e7\u00e3o do caminho da URL (com uma barra de deslocamento) do diret\u00f3rio atual do plugin.<\/p>\n<p>Eu n\u00e3o vou explicar os <a href=\"https:\/\/kinsta.com\/pt\/blog\/css-wordpress\/#wordpress-and-css\">estilos CSS<\/a> aplicados aqui, mas voc\u00ea pode encontr\u00e1-los todos no c\u00f3digo fonte ligado no final desta se\u00e7\u00e3o.<\/p>\n<pre><code class=\"language-php\">\/\/ Custom login ERROR message to keep the site more secure\nadd_filter( 'login_errors', 'salhooks_remove_login_errors', 10 );\nfunction salhooks_remove_login_errors() {\n    return 'Incorrect credentials. Please try again!';\n}<\/code><\/pre>\n<p>Em seguida, conecte-se ao filtro <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/login_errors\/\">login_errors<\/a> para alterar a mensagem de erro exibida quando algu\u00e9m entra com credenciais incorretas. A filtragem da mensagem de erro ir\u00e1 bloquear atacantes de adivinhar seu nome de usu\u00e1rio facilmente.<\/p>\n<pre><code class=\"language-php\">\/\/ Remove the login form box shake animation for incorrect credentials\nadd_action( 'login_head', 'remove_login_error_shake' );\nfunction remove_login_error_shake() {\n    remove_action( 'login_head', 'wp_shake_js', 12 );\n}<\/code><\/pre>\n<p>Toda vez que algu\u00e9m insere credenciais de login incorretas, a caixa do formul\u00e1rio de login se agita agressivamente. Este \u00e9 um passo opcional, mas eu o inclu\u00ed para mostrar que voc\u00ea tamb\u00e9m pode remover certos recursos da p\u00e1gina de login.<\/p>\n<p>Voc\u00ea vai aprender mais sobre as fun\u00e7\u00f5es <code><strong>remove_action()<\/strong><\/code> e <code><strong>remove_filter()<\/strong><\/code> na se\u00e7\u00e3o final deste artigo.<\/p>\n<pre><code class=\"language-php\">\/\/ Change the logo and header link above the login form\nadd_filter( 'login_headerurl', 'salhooks_login_headerurl');\nfunction salhooks_login_headerurl( $url ) {\n    $url = 'https:\/\/salmanravoof.com';\n    return $url;\n}\n\nadd_filter( 'login_headertext', 'salhooks_login_headertext');\nfunction salhooks_login_headertext( $text ) {\n    $text = 'Salman Ravoof';\n    return $text;\n}<\/code><\/pre>\n<p>O \u00faltimo passo \u00e9 alterar a URL e o texto do cabe\u00e7alho do login. Voc\u00ea pode se conectar ao <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/login_headerurl\/\">login_headerurl<\/a> e aos filtros <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/login_headertext\/\">login_headertext<\/a> para modificar ambos.<\/p>\n<p>Se voc\u00ea quiser construir sobre este plugin e experimentar mais, voc\u00ea pode <a href=\"https:\/\/github.com\/SalmanRavoof\/sal-custom-login-page\">baixar o c\u00f3digo fonte do plugin<\/a> e come\u00e7ar a us\u00e1-lo.<\/p>\n<h2>Lista de Hooks e Recursos do WordPress<\/h2>\n<p>\u00c9 dif\u00edcil memorizar todos os v\u00e1rios hooks que o WordPress tem. H\u00e1 milhares de a\u00e7\u00f5es e filtros embutidos para enganchar. Assim, encontrar um Hook apropriado \u00e0s vezes pode parecer uma ca\u00e7a ao tesouro.<\/p>\n<p>Felizmente, existem v\u00e1rios recursos que voc\u00ea pode utilizar para identificar o Hook perfeito para as suas necessidades.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/plugins\/hooks\/\">WordPress Plugin Handbook \u2014 Hooks\u00a0<\/a><\/li>\n<\/ul>\n<p>O primeiro lugar para se familiarizar com hooks \u00e9 o WordPress Codex, particularmente sua se\u00e7\u00e3o de hooks no Manual do Plugin. Aqui voc\u00ea pode encontrar informa\u00e7\u00f5es essenciais sobre hooks e links para documenta\u00e7\u00e3o completa sobre todas as a\u00e7\u00f5es e filtros.<\/p>\n<figure id=\"attachment_72272\" aria-describedby=\"caption-attachment-72272\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72272 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/comece-aprender-ganchos-manual-plugin-wordpress.png\" alt=\"Comece a aprender Ganchos com o Manual de Plugin do WordPress\" width=\"1100\" height=\"539\"><figcaption id=\"caption-attachment-72272\" class=\"wp-caption-text\">Comece a aprender hooks com o Manual de Plugin do WordPress<\/figcaption><\/figure>\n<p>Marque estes links \u00fateis no Manual do Plugin para acelerar a sua pesquisa:<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Plugin_API#Function_Reference\"> Plugin API &#8211; Refer\u00eancia da fun\u00e7\u00e3o dos hooks<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\"> Plugin API &#8211; Refer\u00eancia de a\u00e7\u00e3o <\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Filter_Reference\"> Plugin API &#8211; Refer\u00eancia em Filtros <\/a><\/li>\n<\/ul>\n<p>Tanto a refer\u00eancia da a\u00e7\u00e3o quanto as p\u00e1ginas de refer\u00eancia do filtro lhe dar\u00e3o uma lista de todos os hooks que normalmente rodam durante uma solicita\u00e7\u00e3o espec\u00edfica do WordPress.<\/p>\n<p>Por exemplo, voc\u00ea pode encontrar todos os hooks demitidos quando voc\u00ea acessa uma p\u00e1gina de administra\u00e7\u00e3o, quando voc\u00ea est\u00e1 lidando com anexos de posta de p\u00e1gina, ou com <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-taxonomia\/\">categorias<\/a>.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/\"> Refer\u00eancia de C\u00f3digo WordPress <\/a><\/li>\n<\/ul>\n<p>O Codex WordPress tamb\u00e9m inclui uma \u00fatil ferramenta de busca para encontrar todas as suas fun\u00e7\u00f5es, hooks, m\u00e9todos e classes. Esta p\u00e1gina tamb\u00e9m lista componentes novos e atualizados na vers\u00e3o mais recente do WordPress. V\u00e1 primeiro aqui se voc\u00ea quiser encontrar o que est\u00e1 acontecendo dentro do WordPress.<\/p>\n<figure id=\"attachment_72271\" aria-describedby=\"caption-attachment-72271\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72271 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/procure-qualquer-coisa-dentro-wordpress-aqui.png\" alt=\"Procure por qualquer coisa dentro do WordPress aqui\" width=\"1100\" height=\"381\"><figcaption id=\"caption-attachment-72271\" class=\"wp-caption-text\">Procure por qualquer coisa dentro do WordPress aqui<\/figcaption><\/figure>\n<ul>\n<li><a href=\"https:\/\/adambrown.info\/p\/wp_hooks\/hook\"> \u00cdndice de hooks do WordPress de Adam R Brown <\/a><\/li>\n<\/ul>\n<p>Este \u00edndice de hooks do WordPress classifica todos os hooks\u00a0 por tipo, a vers\u00e3o do WordPress que eles estrearam, e se eles est\u00e3o depreciados.<\/p>\n<figure id=\"attachment_72248\" aria-describedby=\"caption-attachment-72248\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72248 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/indice-ganchos-wordpress-adam-r-brown.png\" alt=\"\u00cdndice de Ganchos de WordPress de Adam R Brown\" width=\"1100\" height=\"363\"><figcaption id=\"caption-attachment-72248\" class=\"wp-caption-text\">\u00cdndice de hooks do WordPress de Adam R Brown<\/figcaption><\/figure>\n<p>Classificar os hooks por ordem de aparecimento mostrar\u00e1 que os hooks WordPress mais antigos ainda s\u00e3o os mais usados. Se voc\u00ea \u00e9 <a href=\"https:\/\/kinsta.com\/pt\/blog\/tutoriais-de-php\/\">novo no desenvolvimento do WordPress<\/a>, familiarizar-se com essas a\u00e7\u00f5es e filtros populares \u00e9 a maneira mais r\u00e1pida de se atualizar.<\/p>\n<p>Embora este \u00edndice n\u00e3o tenha sido atualizado desde o WordPress 5.1, ele ainda \u00e9 \u00fatil para folhear todos os principais hooks.<\/p>\n<p>Ainda tem dificuldade para encontrar o Hook que voc\u00ea quer? Uma busca on-line com a palavra-chave certa \u00e9 sempre uma boa maneira de come\u00e7ar. Se tudo o resto falhar, voc\u00ea sempre pode pesquisar o c\u00f3digo do WordPress.<\/p>\n<h2>Como encontrar hooks registrados em uma p\u00e1gina do WordPress<\/h2>\n<p>Como j\u00e1 vimos, o WordPress tem toneladas de hooks dispon\u00edveis, mas nem todos os hooks disparam em todas as p\u00e1ginas. Se voc\u00ea conseguir descobrir em quais a\u00e7\u00f5es e filtros voc\u00ea pode se conectar em uma determinada p\u00e1gina, ent\u00e3o voc\u00ea ganhou metade da batalha.<\/p>\n<p>Enquanto voc\u00ea pode usar ferramentas avan\u00e7adas de depura\u00e7\u00e3o PHP como <a href=\"https:\/\/xdebug.org\/\">xdebug<\/a> e <a href=\"https:\/\/github.com\/squizlabs\/PHP_CodeSniffer\">PHPCS<\/a> para ajudar com isso, existem ferramentas de desenvolvimento mais simples como Debug Bar e Query Monitor que voc\u00ea pode rodar dentro do WordPress.<\/p>\n<h3>Barra de Depura\u00e7\u00e3o com Complemento de A\u00e7\u00f5es e Filtros<\/h3>\n<p><a href=\"https:\/\/wordpress.org\/plugins\/debug-bar\/\">Debug Bar<\/a> \u00e9 um plugin oficial do WordPress que adiciona um menu de<strong> Debug<\/strong> \u00e0 sua barra de administra\u00e7\u00e3o. Ele mostra avisos e avisos PHP, solicita\u00e7\u00f5es de cache, <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-mysql\/\">consultas MySQL<\/a> e <a href=\"https:\/\/kinsta.com\/pt\/blog\/wordpress-debug\/\">outras informa\u00e7\u00f5es \u00fateis de depura\u00e7\u00e3o<\/a>.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Este plugging n\u00e3o foi atualizado recentemente, nem testado com os \u00faltimos grandes lan\u00e7amentos do WordPress. Estamos mencionando-o como um plugin \u00fatil para aprender mais sobre os hooks do WordPress. Use-o em um <a href=\"https:\/\/kinsta.com\/pt\/docs\/hospedagem-de-wordpress\/ambiente-de-teste\/\">ambiente de encena\u00e7\u00e3o<\/a>.<\/p>\n<\/aside>\n\n<figure id=\"attachment_72542\" aria-describedby=\"caption-attachment-72542\" style=\"width: 1500px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/debug-bar-wordpress-plugin.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72542 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/debug-bar-wordpress-plugin.jpg\" alt=\"Debug Bar do WordPress plugin\" width=\"1500\" height=\"500\"><\/a><figcaption id=\"caption-attachment-72542\" class=\"wp-caption-text\">Debug Bar do WordPress plugin<\/figcaption><\/figure>\n<p>Ap\u00f3s instalar o plugin, voc\u00ea precisa adicionar o trecho de c\u00f3digo abaixo ao arquivo <code><strong>wp-config.php<\/strong><\/code> do seu site para habilitar seus recursos de depura\u00e7\u00e3o.<\/p>\n<pre><code class=\"language-php\">define( 'WP_DEBUG', true ); \/\/ tracks PHP Warnings and Notices\ndefine( 'SAVEQUERIES', true ); \/\/ tracks and displays MySQL queries<\/code><\/pre>\n<p>Agora voc\u00ea deve ver a op\u00e7\u00e3o de menu<strong> Debug<\/strong> aparecer na sua barra de administra\u00e7\u00e3o. Clicando nele, voc\u00ea ser\u00e1 levado ao seu painel de controle, onde voc\u00ea poder\u00e1 ver v\u00e1rias consultas e caches anexados \u00e0 p\u00e1gina de onde voc\u00ea acessou.<\/p>\n<figure id=\"attachment_72273\" aria-describedby=\"caption-attachment-72273\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72273 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/menu-debug-barra-administracao-wordpress.png\" alt=\"O menu 'Debug' na barra de administra\u00e7\u00e3o do WordPress\" width=\"1100\" height=\"363\"><figcaption id=\"caption-attachment-72273\" class=\"wp-caption-text\">O menu &#8216;Debug&#8217; na barra de administra\u00e7\u00e3o do WordPress<\/figcaption><\/figure>\n<p>A seguir, voc\u00ea precisa instalar o plugin <a href=\"https:\/\/wordpress.org\/plugins\/debug-bar-actions-and-filters-addon\/\">Debug Bar Actions and Filters Addon<\/a>. \u00c9 uma extens\u00e3o \u00fatil que ir\u00e1 adicionar mais duas abas ao seu painel da Barra de Depura\u00e7\u00e3o para exibir a\u00e7\u00f5es e filtros acionados na requisi\u00e7\u00e3o atual.<\/p>\n<figure id=\"attachment_72253\" aria-describedby=\"caption-attachment-72253\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72253 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/acoes-listadas-ordem-carregamento-pagina-atual.png\" alt=\"A\u00e7\u00f5es listadas em sua ordem de carregamento para a p\u00e1gina atual\" width=\"1100\" height=\"491\"><figcaption id=\"caption-attachment-72253\" class=\"wp-caption-text\">A\u00e7\u00f5es listadas em sua ordem de carregamento para a p\u00e1gina atual<\/figcaption><\/figure>\n<p>Tamb\u00e9m listar\u00e1 com priority todas as fun\u00e7\u00f5es a eles associadas.<\/p>\n<figure id=\"attachment_72254\" aria-describedby=\"caption-attachment-72254\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72254 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/filtros-listados-funcoes-priority-callback-registrados.png\" alt=\"Filtros listados com suas fun\u00e7\u00f5es de priority e callback registrados\" width=\"1100\" height=\"509\"><figcaption id=\"caption-attachment-72254\" class=\"wp-caption-text\">Filtros listados com suas fun\u00e7\u00f5es de priority e callback registrados<\/figcaption><\/figure>\n<p>Voc\u00ea pode clicar no menu<strong> Debug<\/strong> de qualquer p\u00e1gina do seu site para conhecer todas as a\u00e7\u00f5es e filtros em que voc\u00ea pode se conectar naquela p\u00e1gina.<\/p>\n<h3>Query Monitor<\/h3>\n<p>O <a href=\"https:\/\/kinsta.com\/pt\/blog\/query-monitor\/\">Query Monitor<\/a> \u00e9 um poderoso painel de ferramentas de desenvolvimento para WordPress. Voc\u00ea pode us\u00e1-lo para escavar os hooks dispon\u00edveis em uma p\u00e1gina e sua ordem de carga.<\/p>\n<figure id=\"attachment_72543\" aria-describedby=\"caption-attachment-72543\" style=\"width: 1500px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/query-monitor-plugin.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72543 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/query-monitor-plugin.jpg\" alt=\"Query Monitor WordPress plugin\" width=\"1500\" height=\"500\"><\/a><figcaption id=\"caption-attachment-72543\" class=\"wp-caption-text\">Query Monitor WordPress plugin<\/figcaption><\/figure>\n<p>Ao contr\u00e1rio do Debug Bar, voc\u00ea n\u00e3o precisa instalar nenhum addon para ver as a\u00e7\u00f5es e filtros acionados em uma determinada p\u00e1gina.<\/p>\n<figure id=\"attachment_72267\" aria-describedby=\"caption-attachment-72267\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72267 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/acessar-query-monitor-barra-administracao.png\" alt=\"Voc\u00ea pode acessar o Query Monitor na barra de administra\u00e7\u00e3o\" width=\"1100\" height=\"438\"><figcaption id=\"caption-attachment-72267\" class=\"wp-caption-text\">Voc\u00ea pode acessar o Query Monitor na barra de administra\u00e7\u00e3o<\/figcaption><\/figure>\n<p>O Query Monitor tamb\u00e9m lhe d\u00e1 mais informa\u00e7\u00f5es sobre de onde exatamente um Hook est\u00e1 sendo disparado.<\/p>\n<figure id=\"attachment_72266\" aria-describedby=\"caption-attachment-72266\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72266 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/painel-ganchos-acoes-query-monitor.png\" alt=\"O painel de Ganchos e A\u00e7\u00f5es no Query Monitor\" width=\"1100\" height=\"642\"><figcaption id=\"caption-attachment-72266\" class=\"wp-caption-text\">O painel de hooks e A\u00e7\u00f5es no Query Monitor<\/figcaption><\/figure>\n<p>Na coluna de componentes, voc\u00ea pode ver que a maioria dos hooks s\u00e3o registrados a partir do N\u00facleo. Mas alguns hooks s\u00e3o registrados a partir de um tema ou plugin. Alguns hooks podem ser registrados a partir de mais de um componente.<\/p>\n<p>Voc\u00ea pode usar os <a href=\"https:\/\/kinsta.com\/pt\/blog\/menu-suspenso-wordpress\/\">menus suspensos<\/a> de hooks e componentes para visualizar apenas os hooks que voc\u00ea precisa.<\/p>\n<p><strong>Nota:<\/strong> O Query Monitor utiliza o termo &#8220;Hooks&#8221; como um termo de catchall tanto para a\u00e7\u00f5es quanto para filtros, mas chama as fun\u00e7\u00f5es de callback registradas de &#8220;A\u00e7\u00f5es&#8221;. Esta \u00e9 uma defini\u00e7\u00e3o tecnicamente errada e pode confundir voc\u00ea, portanto, tenha isso em mente.<\/p>\n<p>Voc\u00ea pode fazer mais do que apenas verificar todas as consultas e pedidos com o Query Monitor. Ele tamb\u00e9m inclui recursos avan\u00e7ados como estilos de listagem, scripts, <a href=\"https:\/\/kinsta.com\/pt\/blog\/wordpress-multilingue\/\">idiomas<\/a>, <a href=\"https:\/\/kinsta.com\/pt\/blog\/admin-ajax\/\">chamadas Ajax<\/a>, verifica\u00e7\u00f5es de capacidade do usu\u00e1rio e <a href=\"https:\/\/kinsta.com\/pt\/blog\/wordpress-rest-api\/\">chamadas REST API<\/a>.<\/p>\n<h2>O Hook &#8220;all&#8221;<\/h2>\n<p>O WordPress tem <a href=\"https:\/\/developer.wordpress.org\/plugins\/hooks\/advanced-topics\/#debugging-with-the-all-hook\">um Hook especial chamado &#8216;all&#8217;<\/a> que voc\u00ea pode enganchar para executar uma fun\u00e7\u00e3o de callback para cada Hook, independentemente de estar registrado com todos eles. \u00c9 \u00fatil para <a href=\"https:\/\/kinsta.com\/pt\/blog\/wordpress-debug\/\">depurar falhas de p\u00e1gina<\/a> ou se voc\u00ea quer saber quando um evento em particular est\u00e1 acontecendo.<\/p>\n<p>Por exemplo, voc\u00ea pode usar o Hook <code><strong>all<\/strong><\/code> como no exemplo abaixo para <code><strong>echo<\/strong><\/code> todas as a\u00e7\u00f5es que est\u00e3o sendo executadas.<\/p>\n<pre><code class=\"language-php\">\/\/ echo all the actions being run\nfunction debug_helper_function(){\n\u00a0 \u00a0 echo '&lt;p&gt;' . current_action() . '&lt;\/p&gt;';\n}\nadd_action( 'all', 'debug_helper_function' );<\/code><\/pre>\n<p>A <code><strong>debug_helper_function()<\/strong><\/code> definida acima ser\u00e1 executada quando qualquer a\u00e7\u00e3o for acionada. Saber qual foi a \u00faltima a\u00e7\u00e3o a ser executada lhe dar\u00e1 uma melhor id\u00e9ia de onde voc\u00ea precisa olhar.<\/p>\n<h2>Onde est\u00e3o armazenados os hooks do WordPress?<\/h2>\n<p>O WordPress usa a classe <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_hook\/\">WP_Hook<\/a> para implementar como funcionam os hooks. Esta classe central \u00e9 usada para lidar com todas as a\u00e7\u00f5es e filtros embutidos do WordPress. Voc\u00ea pode encontrar quase todo o c\u00f3digo relacionado a esta classe no arquivo <a href=\"https:\/\/core.trac.wordpress.org\/browser\/tags\/5.4\/src\/wp-includes\/class-wp-hook.php\">wp-includes\/class-wp-hook.php.<\/a><\/p>\n<p>Tecnicamente, a classe <code><strong>WP_Hook<\/strong><\/code> \u00e9 um array de objetos compreendendo propriedades como callbacks, itera\u00e7\u00f5es, priority_corrente, n\u00edvel_de_encaixamento e a\u00e7\u00e3o_de_fazer. Ela tamb\u00e9m define muitas fun\u00e7\u00f5es de Hooks \u00fateis que podem ser chamadas usando os <a href=\"https:\/\/developer.wordpress.org\/reference\/files\/wp-includes\/class-wp-hook.php\/\">m\u00e9todos WP_Hook<\/a>.<\/p>\n<p>A maioria dos desenvolvedores WordPress n\u00e3o tem que se preocupar muito com onde o WordPress armazena os hooks desde que eles sigam as diretrizes da API do Plugin.<\/p>\n\n<h2>Como criar seus hooks personalizados para WordPress<\/h2>\n<p>Voc\u00ea j\u00e1 viu os v\u00e1rios hooks que o WordPress fornece atrav\u00e9s do seu Plugin API. Voc\u00ea tamb\u00e9m j\u00e1 viu como voc\u00ea pode usar os hooks padr\u00e3o para injetar seu pr\u00f3prio c\u00f3digo em tempo de execu\u00e7\u00e3o do WordPress.<\/p>\n<p>Se voc\u00ea \u00e9 um <a href=\"https:\/\/kinsta.com\/pt\/blog\/salario-de-um-desenvolvedor-wordpress\/\">desenvolvedor de plugins ou temas<\/a>, \u00e9 uma boa pr\u00e1tica fornecer a outros desenvolvedores uma maneira de interagir com o seu c\u00f3digo da mesma maneira. Os hooks personalizados permitem que voc\u00ea fa\u00e7a exatamente isso. Eles permitem que outros desenvolvedores ampliem e modifiquem a funcionalidade de seus plugins e temas.<\/p>\n<p>Criar suas pr\u00f3prias a\u00e7\u00f5es e filtros \u00e9 bastante simples. Voc\u00ea utiliza as mesmas fun\u00e7\u00f5es que o WordPress Core utiliza para criar hooks. Vejamos alguns exemplos.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"6\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Como Criar A\u00e7\u00f5es Personalizadas no WordPress<\/h3>\n<p>Use a fun\u00e7\u00e3o <code><strong>do_action()<\/strong><\/code> para criar um Hook de a\u00e7\u00e3o personalizado. Aqui est\u00e1 como voc\u00ea faz isso:<\/p>\n<pre><code class=\"language-php\">\/\/ the position where you insert your action is where it'll run when called\ndo_action( ' my_unique_custom_action' );\n\/\/ continue with the rest of your code<\/code><\/pre>\n<p>Agora, outros desenvolvedores podem se conectar ao seu plugin ou tema sem modificar o c\u00f3digo fonte. Tudo que eles t\u00eam que fazer \u00e9 registrar suas fun\u00e7\u00f5es de callback na a\u00e7\u00e3o personalizada do seu plugin usando a fun\u00e7\u00e3o <code><strong>add_action()<\/strong><\/code>.<\/p>\n<pre><code class=\"language-php\">add_action( 'my_unique_custom_action', 'some_callback_function' );\n\n\/\/ define the callback function you mentioned in the above action function\nsome_callback_function() {\n     \/\/ this code will run wherever your custom action hook is \n}<\/code><\/pre>\n<p>N\u00e3o deixe de<strong> documentar<\/strong> seus hooks personalizados detalhadamente, explicando o que eles fazem. Afinal, o principal uso da cria\u00e7\u00e3o de hooks personalizados \u00e9 ajudar <a href=\"https:\/\/kinsta.com\/pt\/blog\/salario-desenvolvedor-web\/\">outros desenvolvedores<\/a> a interagir com o seu c\u00f3digo.<\/p>\n<h3>Como Criar um Filtro Personalizado no WordPress<\/h3>\n<p>Use a fun\u00e7\u00e3o <code><strong>apply_filters()<\/strong><\/code> para criar um Hook de filtro personalizado. Aqui est\u00e1 como voc\u00ea pode fazer isso:<\/p>\n<pre><code class=\"language-php\">$value_to_filter = \"I'm a string, but this can be any PHP data type\";\n\n\/\/ filters modify a value and are typically tied to a predefined variable\napply_filters( 'my_custom_filter', $value_to_filter );<\/code><\/pre>\n<p>Os par\u00e2metros do seu filtro personalizado devem incluir um identificador \u00fanico e um valor a ser filtrado. Outros desenvolvedores podem se conectar ao seu filtro personalizado com a fun\u00e7\u00e3o <code><strong>add_filter()<\/strong><\/code> e modificar o valor passado.<\/p>\n<pre><code class=\"language-php\">add_filter( 'my_custom_filter', 'some_callback_function' );\n\n\/\/ define the callback function you mentioned in the above filter function\nfunction some_callback_function( $value_to_filter ) {\n    \/\/ modify the passed value (or not) \n    return $value_to_filter; \/\/ returning a value is a must for filters\n}<\/code><\/pre>\n<p>Quando voc\u00ea estiver definindo seu filtro personalizado, certifique-se de que ele n\u00e3o esteja posicionado antes que o valor que ele deve filtrar seja definido. Se voc\u00ea n\u00e3o posicionar o filtro corretamente, o valor filtrado ser\u00e1 sobregravado pelo valor padr\u00e3o depois.<\/p>\n<h3>Conven\u00e7\u00e3o de Nomenclatura de Hooks Personalizados<\/h3>\n<p>\u00c9 importante escolher um nome \u00fanico para todos os seus hooks personalizados. Como qualquer plugin ou tema pode ter seus pr\u00f3prios hooks personalizados, ter nomes de hooks id\u00eanticos pode causar colis\u00f5es de c\u00f3digo com resultados inesperados.<\/p>\n<p>Por exemplo, se voc\u00ea nomear sua a\u00e7\u00e3o <code><strong>send_email<\/strong><\/code>, \u00e9 altamente prov\u00e1vel que outros desenvolvedores de plugins tamb\u00e9m possam escolher o mesmo termo, pois ele n\u00e3o \u00e9 \u00fanico o suficiente. Se algum site instalar tanto o seu quanto os plugins do outro desenvolvedor, isso pode<a href=\"https:\/\/kinsta.com\/pt\/blog\/erros-mais-comuns-do-wordpress\/\"> causar erros que ser\u00e3o dif\u00edceis de rastrear<\/a>.<\/p>\n<p>Voc\u00ea pode prefixar todos os seus hooks personalizados com um identificador comum para mant\u00ea-los simples e \u00fanicos. Ent\u00e3o, ao inv\u00e9s de <code><strong>send_email<\/strong><\/code>, voc\u00ea pode nome\u00e1-lo como <code><strong>plugin_name_send_email<\/strong><\/code> (<code><strong>plugin_name_<\/strong><\/code> \u00e9 o prefixo \u00fanico aqui).<\/p>\n<h3>Demonstra\u00e7\u00e3o de hooks personalizados com um Plugin Extens\u00edvel<\/h3>\n<p>Vamos criar um plugin extens\u00edvel (ou pluggable plugin) que permitir\u00e1 que outros desenvolvedores interajam com ele usando seus hooks personalizados.<\/p>\n<p>Eu vou nomear este plugin como<strong> Custom Hooks Demo<\/strong><em>. <\/em>Sua principal fun\u00e7\u00e3o \u00e9 emitir uma caixa de cota\u00e7\u00e3o onde quer que voc\u00ea insira um c\u00f3digo de atalho. Ele incluir\u00e1 a\u00e7\u00f5es e filtros personalizados nos locais certos para possibilitar que outros desenvolvedores possam modificar ou ampliar sua funcionalidade.<\/p>\n<p>Voc\u00ea pode consultar o meu <a href=\"https:\/\/kinsta.com\/pt\/blog\/codigo-curto-wordpress\/\">guia de atalhos do WordPress<\/a> para saber mais sobre como funcionam os atalhos.<\/p>\n<p>Vamos come\u00e7ar com o plugin extens\u00edvel.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n\/*\nPlugin Name :  Custom Hooks Demo\nDescription :  Demonstrating how to create an extensible WordPress plugin using custom hooks.\nAuthor      :  Salman Ravoof\nAuthor URI  :  https:\/\/salmanravoof.com\/\nLicense     :  GPLv2 or later\nLicense URI :  https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\nText Domain :  custom-hooks-demo\n*\/\n\n\/** \n * the [custom_hooks_demo] shortcode returns the HTML code for a quote box.\n * @return string HTML code for a quote box\n*\/\nadd_shortcode( 'custom_hooks_demo', 'my_shortcode_callback' );\n\nfunction my_shortcode_callback ( $arguments ) {\n    ob_start(); \/\/ start object buffering to collect all output before sending it to the browser\n    \n    \/\/ set an action hook to run before you output anything\n    do_action( 'the_topmost_custom_action' );\n    \n    \/\/ define your variables which you want to allow to be filtered\n    $quote_content = \"Z.E.R.O. That's the number of people who'd like to have any website autoplay music on their browsers.\";\n    $quote_author = \"John Doenuts\";\n    \n    \/\/ create your custom filters after you've set the variables\n    $quote_content = apply_filters( 'custom_quote_content', $quote_content );\n    $quote_author = apply_filters( 'custom_quote_author', $quote_author );\n    \n    \/\/ build the shortcode output template\n    echo \"&lt;div style=\\\"border:3px solid #5333ed;\\\"&gt;&lt;blockquote style=\\\"margin:20px;border-color:#5333ed;\\\"&gt;\";\n    echo $quote_content;\n    echo \"&lt;br&gt;&lt;br&gt;\";\n    echo \"\u2015 &lt;strong&gt;\" . $quote_author . \"&lt;\/strong&gt;\";\n    echo \"&lt;\/blockquote&gt;&lt;\/div&gt;\";\n    \n    \/\/ set an action hook to run after you output everything\n    do_action( 'the_ending_custom_action' );\n    \n    return ob_get_clean(); \/\/ get buffer contents, delete the buffer, and then stop buffering\n}<\/code><\/pre>\n<ul>\n<li>A fun\u00e7\u00e3o <code><strong>add_shortcode()<\/strong><\/code> \u00e9 utilizada para criar o c\u00f3digo de atalho personalizado. E ent\u00e3o voc\u00ea define a fun\u00e7\u00e3o callback do shortcode com toda essa funcionalidade do plugin.<\/li>\n<li><a href=\"https:\/\/www.php.net\/manual\/en\/function.ob-start.php\">ob_start()<\/a> \u00e9 uma fun\u00e7\u00e3o PHP que habilita o buffer de sa\u00edda. \u00c9 uma fun\u00e7\u00e3o super \u00fatil que instrui o PHP a segurar qualquer sa\u00edda na mem\u00f3ria buffer do servidor ao inv\u00e9s de emiti-la imediatamente. Voc\u00ea pode us\u00e1-lo para construir c\u00f3digo HTML complexo e leg\u00edvel no PHP.<\/li>\n<li><code><strong>do_action( 'the_topmost_custom_action' )<\/strong><\/code> define sua primeira a\u00e7\u00e3o personalizada. Para torn\u00e1-la \u00fatil, voc\u00ea precisa defini-la antes que o plugin produza alguma coisa. Outros desenvolvedores podem se conectar a esta a\u00e7\u00e3o personalizada para executar seu c\u00f3digo antes que este atalho personalizado imprima qualquer coisa.<\/li>\n<li>Crie as vari\u00e1veis que voc\u00ea deseja filtrar. Neste plugin, essas vari\u00e1veis s\u00e3o <code><strong>$quote_content<\/strong> e <strong>$quote_author<\/strong><\/code>. Elas s\u00e3o ambas strings neste exemplo, mas voc\u00ea pode configur\u00e1-las para serem qualquer tipo de dado PHP (por exemplo, integer, boolean, array).<\/li>\n<li>Use a fun\u00e7\u00e3o <code><strong>apply_filters()<\/strong><\/code> para criar seus filtros personalizados. Como todos os filtros retornam um valor, voc\u00ea pode atribuir as vari\u00e1veis previamente definidas para o valor retornado por este filtro. Outros desenvolvedores podem agora se conectar a este filtro para modificar os valores padr\u00e3o das vari\u00e1veis pr\u00e9-definidas.<\/li>\n<li>Use os comandos de <code><strong>echo<\/strong><\/code> para construir a sa\u00edda do seu atalho linha por linha. Como ativamos o buffer de sa\u00edda, nenhuma sa\u00edda chegar\u00e1 ao navegador imediatamente.<\/li>\n<li><code><strong>do_action( 'the_ending_custom_action' )<\/strong><\/code> define sua \u00faltima a\u00e7\u00e3o personalizada. Voc\u00ea precisa defini-la no final, mas antes de return todo o conte\u00fado do buffer.<\/li>\n<li><a href=\"https:\/\/www.php.net\/manual\/en\/function.ob-get-clean.php\">ob_get_clean()<\/a> \u00e9 uma fun\u00e7\u00e3o 3 em 1 padr\u00e3o do PHP. Ela ir\u00e1 recuperar o conte\u00fado do buffer, eliminar todos os dados do buffer, e ent\u00e3o parar o buffer de sa\u00edda. Ele ir\u00e1 <code><strong>return<\/strong><\/code> o conte\u00fado do buffer coletado como uma \u00fanica string concatenada.<\/li>\n<\/ul>\n<p>Uma vez salvo e ativado, adicionando o atalho <code><strong>[custom_hooks_demo]<\/strong><\/code> ao conte\u00fado do seu post, sair\u00e1 uma caixa de cota\u00e7\u00e3o com os valores padr\u00e3o.<\/p>\n<figure id=\"attachment_72264\" aria-describedby=\"caption-attachment-72264\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72264 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/caixa-orcamento-original-usando-plugin-custom-hooks-demo.png\" alt=\"A caixa de or\u00e7amento original usando o plugin Custom Hooks Demo\" width=\"1100\" height=\"530\"><figcaption id=\"caption-attachment-72264\" class=\"wp-caption-text\">A caixa de or\u00e7amento original usando o plugin Custom Hooks Demo<\/figcaption><\/figure>\n<p>Agora, vamos criar outro plugin chamado<strong> Custom Hooks Demo Extension<\/strong>. Ele ir\u00e1 se conectar a todos os hooks personalizados criados pelo plugin anterior e fazer ou modificar alguma coisa.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n\/*\nPlugin Name :  Custom Hooks Demo Extension\nDescription :  Demonstrating how you can extend WordPress plugin functionality with its custom hooks.\nAuthor      :  Salman Ravoof\nAuthor URI  :  https:\/\/salmanravoof.com\/\nLicense     :  GPLv2 or later\nLicense URI :  https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\nText Domain :  custom-hooks-demo-extension\n*\/\n\n\/**\n * replace the quote content by hooking into the 'custom_quote_content' filter\n*\/\nadd_filter( 'custom_quote_content', 'new_quote_content_callback' );\nfunction new_quote_content_callback( $content ) {\n    $content = \"There are no bugs in programming. Only unexpected features.\";\n    return $content;\n}\n\n\/**\n * replace the quote author by hooking into the 'custom_quote_author'\n*\/\nadd_filter( 'custom_quote_author', 'new_quote_author_callback' );\nfunction new_quote_author_callback( $author ) {\n    $author = \"Jane Doodle\";\n    return $author;\n}\n\n\/**\n * add an image to the top of the shortcode output by hooking into the 'the_topmost_custom_action'\n*\/\nadd_action( 'the_topmost_custom_action', 'quote_image_callback' );\nfunction quote_image_callback() {\n    $url = \"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/f\/f9\/Quote-right-cs.svg\/75px-Quote-right-cs.svg.png\";\n    echo '&lt;div&gt;&lt;img class=\"aligncenter\" src=\"'.$url.'\"&gt;&lt;\/div&gt;';\n}\n\n\/**\n * add a button below the shortcut output by hooking into the 'the_ending_custom_action'\n*\/\nadd_action( 'the_ending_custom_action', 'add_button_callback' );\nfunction add_button_callback() {\n    echo '&lt;div style=\"text-align:center;\"&gt;&lt;button name=\"nice\"&gt;Nice Quote!&lt;\/button&gt;&lt;\/div&gt;';\n}<\/code><\/pre>\n<p>Como voc\u00ea pode ver, este plugin de extens\u00e3o n\u00e3o cont\u00e9m nada al\u00e9m de a\u00e7\u00e3o e fun\u00e7\u00f5es de filtragem que se encaixam no plugin original nos lugares certos para fazer modifica\u00e7\u00f5es.<\/p>\n<p>Ele usa as fun\u00e7\u00f5es <code><strong>add_action()<\/strong><\/code> e <code><strong>add_filter()<\/strong><\/code> para registrar suas fun\u00e7\u00f5es de callback com as a\u00e7\u00f5es e filtros personalizados criados pelo plugin original (por exemplo, <code><strong>the_topmost_custom_action<\/strong><\/code>, <code><strong>custom_quote_author<\/strong><\/code>).<\/p>\n<figure id=\"attachment_72262\" aria-describedby=\"caption-attachment-72262\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72262 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/plugin-extensao-modifica-caixa-cotacao-original.png\" alt=\"O plugin de extens\u00e3o modifica a caixa de cota\u00e7\u00e3o original\" width=\"1100\" height=\"682\"><figcaption id=\"caption-attachment-72262\" class=\"wp-caption-text\">O plugin de extens\u00e3o modifica a caixa de cota\u00e7\u00e3o original<\/figcaption><\/figure>\n<p>Hooks de a\u00e7\u00e3o personalizados permitem que voc\u00ea interje seu c\u00f3digo nos intervalos certos no plugin original e execute seus pr\u00f3prios scripts. Aqui, n\u00f3s estamos<a href=\"https:\/\/kinsta.com\/pt\/blog\/estrategia-conteudo-visual\/\"> adicionando uma imagem<\/a> no topo e um bot\u00e3o no fundo.<\/p>\n<p>Da mesma forma, hooks de filtro personalizados permitem modificar os valores do conte\u00fado da cota\u00e7\u00e3o e seu nome de autor. O resultado final \u00e9 um plugin que \u00e9 totalmente extens\u00edvel por qualquer pessoa sem modificar o seu c\u00f3digo fonte.<\/p>\n<h3>Trabalhando com Hooks Personalizados de Desenvolvedores Terceirizados<\/h3>\n<p>Hooks personalizados permitem que <a href=\"https:\/\/kinsta.com\/pt\/topicos\/plugins-wordpress\/\">plugins<\/a> e <a href=\"https:\/\/kinsta.com\/pt\/blog\/temas-wordpress-mais-rapidos\/\">temas<\/a> individuais para <a href=\"https:\/\/kinsta.com\/pt\/topicos\/plugins-wordpress\/\">WordPress<\/a> tenham um rico ecossistema de plugins extens\u00edveis. Considere o plugin WooCommerce. Ele adiciona funcionalidade de com\u00e9rcio eletr\u00f4nico ao WordPress, mas tamb\u00e9m inclui <a href=\"https:\/\/docs.woocommerce.com\/wc-apidocs\/hook-docs.html\">toneladas de hooks dentro de seu c\u00f3digo<\/a>.<\/p>\n<figure id=\"attachment_72270\" aria-describedby=\"caption-attachment-72270\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72270 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/woocommerce-acao-referencia-gancho-filtro.png\" alt=\"WooCommerce A\u00e7\u00e3o e Refer\u00eancia de Gancho de Filtro\" width=\"1100\" height=\"562\"><figcaption id=\"caption-attachment-72270\" class=\"wp-caption-text\">WooCommerce A\u00e7\u00e3o e Refer\u00eancia de Hook de Filtro<\/figcaption><\/figure>\n<p><a href=\"https:\/\/kinsta.com\/pt\/blog\/plugins-ecommerce-do-wordpress\/\">O WooCommerce tem centenas de extens\u00f5es<\/a> e <a href=\"https:\/\/kinsta.com\/pt\/blog\/plugins-woocommerce\/\">plugins<\/a> que utilizam seus hooks para construir sobre sua funcionalidade principal e torn\u00e1-la ainda melhor.<\/p>\n<p>Voc\u00ea pode usar estas extens\u00f5es para integrar o WooCommerce com Stripe, MailChimp, Salesforce, Zapier, e muito mais.<\/p>\n<figure id=\"attachment_72269\" aria-describedby=\"caption-attachment-72269\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72269 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/extensoes-ampliam-funcionalidade-woocommerce.png\" alt=\"As extens\u00f5es ampliam a funcionalidade do WooCommerce\" width=\"1100\" height=\"728\"><figcaption id=\"caption-attachment-72269\" class=\"wp-caption-text\">As extens\u00f5es ampliam a funcionalidade do WooCommerce<\/figcaption><\/figure>\n<p>Uma boa pr\u00e1tica \u00e9 verificar a se\u00e7\u00e3o de documenta\u00e7\u00e3o dos populares plugins do WordPress para ver como eles implementam hooks personalizados. Algumas das minhas principais sugest\u00f5es s\u00e3o <a href=\"https:\/\/docs.easydigitaldownloads.com\/article\/559-developers-intro-to-easy-digital-downloads\">Easy Digital Downloads<\/a>, <a href=\"https:\/\/codex.buddypress.org\/\">BuddyPress<\/a>, <a href=\"https:\/\/quizandsurveymaster.com\/docs\/developer\/hooks-and-filters\/\">Quiz and Survey Master<\/a>, e <a href=\"https:\/\/docs.gravityforms.com\/category\/developers\/hooks\/\">Gravity Forms<\/a>.<\/p>\n<h3>Quando usar hooks personalizados?<\/h3>\n<p>Dependendo do <a href=\"https:\/\/kinsta.com\/pt\/blog\/themeforest-pros-contras\/\">tema<\/a> ou <a href=\"https:\/\/kinsta.com\/blog\/publish-plugin-wordpress-plugin-directory\/\">plugin que voc\u00ea est\u00e1 criando<\/a>, e a quem se destina, voc\u00ea pode se perguntar se precisa adicionar algum Hook personalizado.<\/p>\n<p>Uma boa regra geral quando se decide se deve ou n\u00e3o adicionar hooks personalizados \u00e9 verificar se eles oferecem algum benef\u00edcio de extensibilidade para outros desenvolvedores. Se n\u00e3o, ent\u00e3o \u00e9 melhor esperar at\u00e9 que outros desenvolvedores lhe pe\u00e7am para adicion\u00e1-los.<\/p>\n<p>Voc\u00ea precisa estar altamente seguro sobre a adi\u00e7\u00e3o de hooks personalizados ao seu plugin ou tema. Uma vez lan\u00e7ado, e se outros desenvolvedores j\u00e1 o utilizaram, voc\u00ea n\u00e3o poder\u00e1 nunca mud\u00e1-lo sem quebrar a compatibilidade com vers\u00f5es anteriores.<\/p>\n<h2>Remo\u00e7\u00e3o das Fun\u00e7\u00f5es de Callback dos Hooks do WordPress<\/h2>\n<p>Voc\u00ea j\u00e1 viu exemplos de como remover fun\u00e7\u00f5es de callback registradas em determinados hooks. Estes callbacks podem ser registrados por plugins, temas, ou at\u00e9 mesmo pelo pr\u00f3prio WordPress Core. Vamos dar mais exemplos de como remover fun\u00e7\u00f5es de callback com hooks.<\/p>\n<p>Para remover uma fun\u00e7\u00e3o callback de um Hook, dependendo se ele est\u00e1 registrado em uma a\u00e7\u00e3o ou filtro, voc\u00ea precisa usar as fun\u00e7\u00f5es <code><strong>remove_action()<\/strong><\/code> ou <code><strong>remove_filter()<\/strong><\/code>.<\/p>\n<p>Uma ressalva \u00e9 que voc\u00ea precisa chamar estas fun\u00e7\u00f5es com os mesmos par\u00e2metros usados para registrar a fun\u00e7\u00e3o de retorno de chamada. Basicamente, copie-colar os par\u00e2metros de suas fun\u00e7\u00f5es <code><strong>add_action()<\/strong><\/code> ou <code><strong>add_filter()<\/strong><\/code>.<\/p>\n<p>Al\u00e9m disso, voc\u00ea pode remover as fun\u00e7\u00f5es de callback somente ap\u00f3s elas serem registradas. Se voc\u00ea tentar remov\u00ea-las antes de serem cadastradas, o processo de remo\u00e7\u00e3o falhar\u00e1. Voc\u00ea precisa obter a ordem de execu\u00e7\u00e3o dos hooks corretamente.<\/p>\n<p>Digamos que voc\u00ea queira remover uma fun\u00e7\u00e3o de callback registrada por um tema que acrescenta incha\u00e7o ao seu site (<a href=\"https:\/\/kinsta.com\/pt\/aprenda\/acelerar-o-seu-site-wordpress\/\">voc\u00ea want a fast site<\/a>, n\u00e3o \u00e9 mesmo?).<\/p>\n<pre><code class=\"language-php\">function wp_bloated_callback_function() {\u00a0 \u00a0 \n\/\/ some code that adds a lot of bloat to the site\n}\nadd_action( 'template_redirect', 'wp_bloated_callback_function', 5 );<\/code><\/pre>\n<p>Por exemplo, a fun\u00e7\u00e3o de callback acima poderia carregar muitos scripts e folhas de estilo desnecess\u00e1rios. Remov\u00ea-lo dar\u00e1 ao seu site um enorme <a href=\"https:\/\/kinsta.com\/pt\/aprenda\/velocidade-de-sites\/\">aumento de desempenho<\/a>.<\/p>\n<p>Entretanto, voc\u00ea precisa garantir que a fun\u00e7\u00e3o <code><strong>remove_action()<\/strong><\/code> s\u00f3 seja executada ap\u00f3s a a\u00e7\u00e3o <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/template_redirect\/\">template_redirect<\/a>. Uma maneira de fazer isso \u00e9 se conectar \u00e0 a\u00e7\u00e3o <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/after_setup_theme\/\">after_setup_theme,<\/a> pois ela \u00e9 acionada ap\u00f3s a a\u00e7\u00e3o <code><strong>template_redirect<\/strong><\/code>.<\/p>\n<pre><code class=\"language-php\">function wp_remove_bloat() {\n    \/\/ ensure all parameters are identical to the original add_action() function\n  \u00a0 remove_action( 'template_redirect', 'wp_bloated_callback_function', 5 );\n}\n\n\/\/ ensure that remove_action() is called only after add_action()\nadd_action( 'after_setup_theme', 'wp_remove_bloat' );<\/code><\/pre>\n<p>O <code><strong>wp_bloated_callback_function()<\/strong><\/code> agora se desvincula da a\u00e7\u00e3o <code><strong>template_redirect<\/strong><\/code>.<\/p>\n<h3>Casos Especiais para Remo\u00e7\u00e3o de Fun\u00e7\u00f5es de Callback<\/h3>\n<p>H\u00e1 mais para remover as fun\u00e7\u00f5es de callback do que simplesmente desativ\u00e1-las completamente. \u00c0s vezes voc\u00ea pode precisar remov\u00ea-las temporariamente, executar seu c\u00f3digo e depois adicion\u00e1-las novamente.<\/p>\n<p>Por exemplo, a a\u00e7\u00e3o <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/save_post\/\">save_post<\/a> aciona toda vez que as fun\u00e7\u00f5es <code><strong>wp_insert_post()<\/strong><\/code> e <code><strong>wp_publish_post()<\/strong><\/code> s\u00e3o chamadas. Voc\u00ea pode <a href=\"https:\/\/core.trac.wordpress.org\/browser\/tags\/5.4\/src\/wp-includes\/post.php#L4135\">encontr\u00e1-las ambas definidas<\/a> no arquivo<strong> <code>wp-includes\/post.php<\/code>.<\/strong><\/p>\n<p>Ent\u00e3o, se voc\u00ea tiver uma fun\u00e7\u00e3o de callback ligada \u00e0 a\u00e7\u00e3o<strong> save_post<\/strong>, e se voc\u00ea chamar as fun\u00e7\u00f5es<strong> wp_insert_post()<\/strong> ou<strong> wp_publish_post()<\/strong> dentro da sua fun\u00e7\u00e3o de callback, a a\u00e7\u00e3o<strong> save_post<\/strong> ir\u00e1 disparar v\u00e1rias vezes.<\/p>\n<pre><code class=\"language-php\">function some_callback_function( $post_id, $post ) {\n\u00a0 \u00a0 \/\/ do something here\n  \u00a0 wp_insert_post( [some_array] ); \/\/ this function also calls the 'save_post' action\n\u00a0 \u00a0 \/\/ maybe do something more\n}\nadd_action( 'save_post', 'some_callback_function', 10, 2 );<\/code><\/pre>\n<p>Uma fun\u00e7\u00e3o que chama a a\u00e7\u00e3o e que tamb\u00e9m a chama pode criar resultados inesperados. Uma maneira de contornar este problema \u00e9 usar a fun\u00e7\u00e3o <code><strong>remove_action()<\/strong><\/code> dentro da sua fun\u00e7\u00e3o callback antes de chamar <code><strong>wp_insert_post()<\/strong><\/code>.<\/p>\n<pre><code class=\"language-php\">function some_callback_function( $post_id, $post ) {\n\u00a0 \u00a0 \/\/ do something here\n\u00a0 \u00a0 \n    \/\/ remove the callback function from the \u2018save_post\u2019 action\n\u00a0 \u00a0 remove_action( 'save_post', 'some_callback_function', 10, 2 );\n\u00a0 \u00a0 \n    \/\/ now run the wp_insert_post() function\n    wp_insert_post( [some_array] );\n\u00a0 \u00a0 \n    \/\/ add the callback function back to the \u2018save_post\u2019 action\n\u00a0 \u00a0 add_action( 'save_post', 'some_callback_function', 10, 2 );\n\u00a0 \u00a0 \n    \/\/ maybe do something more\n}\nadd_action( 'save_post', 'some_callback_function', 10, 2 );<\/code><\/pre>\n<p>Esse \u00e9 outro uso pr\u00e1tico das fun\u00e7\u00f5es <code><strong>remove_action()<\/strong><\/code> ou <code><strong>remove_filter()<\/strong><\/code>. Cavar mais fundo no WordPress Core ajudar\u00e1 voc\u00ea a entender como voc\u00ea pode evitar essas situa\u00e7\u00f5es melhor.<\/p>\n<h2>Tutoriais B\u00f4nus Hooks WordPress<\/h2>\n<ul>\n<li><a href=\"https:\/\/kinsta.com\/pt\/blog\/adicionar-codigo-ao-cabecalho-e-rodape-do-wordpress\/#how-to-manually-add-code-to-wordpress-header-and-footer\"> Adicionar Manualmente o C\u00f3digo ao Cabe\u00e7alho e Rodap\u00e9 do WordPress <\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/pt\/blog\/biblioteca-midia-wordpress\/\"> Seu Guia Completo para a Biblioteca de M\u00eddia WordPress <\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/pt\/blog\/wordpress-cron-job\/\"> Como Criar e Modificar um Trabalho de Cron do WordPress <\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/pt\/blog\/tema-filho-no-wordpress\/#create\"> Como Criar um Tema filho WordPress <\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/pt\/blog\/desabilitar-wordpress-plugins\/\"> Desativar o carregamento de plugins do WordPress em p\u00e1ginas e posts espec\u00edficos <\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/pt\/blog\/desativar-os-emojis-no-wordpress\/#2-disable-emojis-in-wordpress-with-code\"> Desabilitar Emojis no WordPress com C\u00f3digo <\/a><\/li>\n<\/ul>\n\n<h2>Resumo<\/h2>\n<p>H\u00e1 m\u00faltiplas vantagens em usar os hooks do WordPress se voc\u00ea \u00e9 um <a href=\"https:\/\/kinsta.com\/pt\/blog\/contrate-um-desenvolvedor-do-wordpress\/\">desenvolvedor do WordPress<\/a>.<\/p>\n<p>Os hooks n\u00e3o s\u00f3 permitem modificar ou ampliar a funcionalidade central do WordPress, como tamb\u00e9m podem ser usados para modificar plugins, temas e deixar outros desenvolvedores interagirem com seus plugins ou temas.<\/p>\n<p>\u00c9 hora de ficar viciado nos hooks do WordPress!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Os Hooks do WordPress s\u00e3o uma das ferramentas mais importantes a ter no arsenal de um desenvolvedor de WordPress. Eles s\u00e3o a base do plugin WordPress &#8230;<\/p>\n","protected":false},"author":117,"featured_media":37491,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[430,44],"topic":[1026,997],"class_list":["post-37457","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-hook-wordpress","tag-webdev","topic-desenvolvimento-wordpress","topic-funcoes-php"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Hooks Bootcamp WordPress: Como Utilizar as A\u00e7\u00f5es, Filtros e Hooks Personalizados<\/title>\n<meta name=\"description\" content=\"Aprenda sobre Hooks WordPress em profundidade. Domine a\u00e7\u00f5es, filtros e hooks personalizados, criando seu pr\u00f3prio plugin extens\u00edvel. Nivele suas habilidades de desenvolvimento do WordPress agora!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Hooks Bootcamp WordPress: Como Utilizar as A\u00e7\u00f5es, Filtros e Hooks Personalizados\" \/>\n<meta property=\"og:description\" content=\"Aprenda sobre Hooks WordPress em profundidade. Domine a\u00e7\u00f5es, filtros e hooks personalizados, criando seu pr\u00f3prio plugin extens\u00edvel. Nivele suas habilidades de desenvolvimento do WordPress agora!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2020-06-01T07:29:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-22T07:46:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/06\/ganchos-wordpress.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Salman Ravoof\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Aprenda sobre Hooks WordPress em profundidade. Domine a\u00e7\u00f5es, filtros e hooks personalizados, criando seu pr\u00f3prio plugin extens\u00edvel. Nivele suas habilidades de desenvolvimento do WordPress agora!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/06\/ganchos-wordpress.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@salmanravoof\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salman Ravoof\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"71 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"Hooks Bootcamp WordPress: Como Utilizar as A\u00e7\u00f5es, Filtros e Hooks Personalizados\",\"datePublished\":\"2020-06-01T07:29:01+00:00\",\"dateModified\":\"2023-08-22T07:46:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/\"},\"wordCount\":11378,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/06\/ganchos-wordpress.jpg\",\"keywords\":[\"Hook WordPress\",\"webdev\"],\"articleSection\":[\"Desenvolvimento WordPress\"],\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/\",\"name\":\"Hooks Bootcamp WordPress: Como Utilizar as A\u00e7\u00f5es, Filtros e Hooks Personalizados\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/06\/ganchos-wordpress.jpg\",\"datePublished\":\"2020-06-01T07:29:01+00:00\",\"dateModified\":\"2023-08-22T07:46:21+00:00\",\"description\":\"Aprenda sobre Hooks WordPress em profundidade. Domine a\u00e7\u00f5es, filtros e hooks personalizados, criando seu pr\u00f3prio plugin extens\u00edvel. Nivele suas habilidades de desenvolvimento do WordPress agora!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/06\/ganchos-wordpress.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/06\/ganchos-wordpress.jpg\",\"width\":1024,\"height\":512,\"caption\":\"O Bootcamp de Ganchos WordPress: Como Usar A\u00e7\u00f5es, Filtros e Ganchos Personalizados\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Fun\u00e7\u00f5es do PHP\",\"item\":\"https:\/\/kinsta.com\/pt\/topicos\/funcoes-php\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Hooks Bootcamp WordPress: Como Utilizar as A\u00e7\u00f5es, Filtros e Hooks Personalizados\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/pt\/#website\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\",\"name\":\"Salman Ravoof\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"caption\":\"Salman Ravoof\"},\"description\":\"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.\",\"sameAs\":[\"https:\/\/salmanravoof.com\",\"https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/\",\"https:\/\/x.com\/salmanravoof\"],\"url\":\"https:\/\/kinsta.com\/pt\/blog\/author\/salmanravoof\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Hooks Bootcamp WordPress: Como Utilizar as A\u00e7\u00f5es, Filtros e Hooks Personalizados","description":"Aprenda sobre Hooks WordPress em profundidade. Domine a\u00e7\u00f5es, filtros e hooks personalizados, criando seu pr\u00f3prio plugin extens\u00edvel. Nivele suas habilidades de desenvolvimento do WordPress agora!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/","og_locale":"pt_PT","og_type":"article","og_title":"Hooks Bootcamp WordPress: Como Utilizar as A\u00e7\u00f5es, Filtros e Hooks Personalizados","og_description":"Aprenda sobre Hooks WordPress em profundidade. Domine a\u00e7\u00f5es, filtros e hooks personalizados, criando seu pr\u00f3prio plugin extens\u00edvel. Nivele suas habilidades de desenvolvimento do WordPress agora!","og_url":"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2020-06-01T07:29:01+00:00","article_modified_time":"2023-08-22T07:46:21+00:00","og_image":[{"width":1024,"height":512,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/06\/ganchos-wordpress.jpg","type":"image\/jpeg"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_description":"Aprenda sobre Hooks WordPress em profundidade. Domine a\u00e7\u00f5es, filtros e hooks personalizados, criando seu pr\u00f3prio plugin extens\u00edvel. Nivele suas habilidades de desenvolvimento do WordPress agora!","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/06\/ganchos-wordpress.jpg","twitter_creator":"@salmanravoof","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Salman Ravoof","Tempo estimado de leitura":"71 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"Hooks Bootcamp WordPress: Como Utilizar as A\u00e7\u00f5es, Filtros e Hooks Personalizados","datePublished":"2020-06-01T07:29:01+00:00","dateModified":"2023-08-22T07:46:21+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/"},"wordCount":11378,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/06\/ganchos-wordpress.jpg","keywords":["Hook WordPress","webdev"],"articleSection":["Desenvolvimento WordPress"],"inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/","url":"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/","name":"Hooks Bootcamp WordPress: Como Utilizar as A\u00e7\u00f5es, Filtros e Hooks Personalizados","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/06\/ganchos-wordpress.jpg","datePublished":"2020-06-01T07:29:01+00:00","dateModified":"2023-08-22T07:46:21+00:00","description":"Aprenda sobre Hooks WordPress em profundidade. Domine a\u00e7\u00f5es, filtros e hooks personalizados, criando seu pr\u00f3prio plugin extens\u00edvel. Nivele suas habilidades de desenvolvimento do WordPress agora!","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/06\/ganchos-wordpress.jpg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/06\/ganchos-wordpress.jpg","width":1024,"height":512,"caption":"O Bootcamp de Ganchos WordPress: Como Usar A\u00e7\u00f5es, Filtros e Ganchos Personalizados"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/pt\/blog\/hooks-wordpress\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"Fun\u00e7\u00f5es do PHP","item":"https:\/\/kinsta.com\/pt\/topicos\/funcoes-php\/"},{"@type":"ListItem","position":3,"name":"Hooks Bootcamp WordPress: Como Utilizar as A\u00e7\u00f5es, Filtros e Hooks Personalizados"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/pt\/#website","url":"https:\/\/kinsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987","name":"Salman Ravoof","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","caption":"Salman Ravoof"},"description":"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.","sameAs":["https:\/\/salmanravoof.com","https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/","https:\/\/x.com\/salmanravoof"],"url":"https:\/\/kinsta.com\/pt\/blog\/author\/salmanravoof\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/37457","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/users\/117"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/comments?post=37457"}],"version-history":[{"count":9,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/37457\/revisions"}],"predecessor-version":[{"id":61935,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/37457\/revisions\/61935"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37457\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37457\/translations\/fr"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37457\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37457\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37457\/translations\/pt"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37457\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37457\/translations\/nl"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37457\/translations\/se"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37457\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/37491"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=37457"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=37457"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=37457"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}