Como usar Hooks: Actions e Filters no WordPress

Quando eu estava começando a ver como funcionava o WordPress, todas a vezes que eu precisava fazer alguma coisa eu procurava na internet funções que resolvessem o meu problema e sempre me deparava com algumas delas sendo utilizadas em conjunto com filtros ou ações, e sempre tinha uma dificuldade em entender como que estas funções eram ativadas no momento correto pelo WordPress, sem eu ter que chamar ela em nenhum arquivo que eu fosse criar.

Pouco mais tarde eu vim a descobrir que estas funções são chamadas de gancho, e que estes funcionavam como locais onde eu poderia anexar ou melhor dizendo pendurar (dai o nome de gancho) as minhas funções, contudo os filtros e ações tem focos específicos e que devem ser utilizados para tipos de funções diferentes.

Vamos ver alguns pontos da nossa nossa pequena jornada sobre o que são os Ganchos do WordPress (hooks):

  • Criando Ações para ganchos de ação
  • Criando Filtros para ganchos de filtro

Abaixo eu irei tratar de forma um pouco mais técnica o assunto, caso você tenha alguma dúvida, deixe um comentário.

Os ganchos, eles são a base de todo o sistema do WordPress, sem eles os plugins não seriam capazes de fazer nenhuma modificação nas funcionalidades, pois tudo teria de ser editado no código do WordPress, e não em um plugin ou um tema.

Usando os ganchos os desenvolvedores tem a possibilidade de adicionar as funcionalidades sem perde-las a cada atualização do sistema.

Ações (actions)

As ações permitem disparar uma função em momentos específicos da execução do código do WordPress ou quando um evento ocorre. Por exemplo você pode querer adicionar uma função para manda um e-mail para você todas as vezes que alguém criar um artigo em seu blog.

Antes de entender como utilizar as ações é importante entender qual a estrutura da função do_action(), pois apesar de não fazer o uso direto desta função o seu plugin ou tema vai depender dela para adicionar as funcionalidades a ao sistema.

<?php do_action($tag, $arg=""); ?>
  • $tag — O nome da ação gancho
  • $arg — Os valores que serão passados para a função. No exemplo temos apenas um parâmetro mas na realidade existem funções com muitos parâmetros, e por este motivo é sempre bem legal verificar a quantidade de parâmetros cada ação gancho

Abaixo um exemplo de como ficaria um ação gancho com múltiplos parâmetros:

<?php do_action($tag, $arg_1,$arg_2,$arg_{n}); ?>

Agora nos voltando para um exemplo real, o wp_footer é um exemplo de ação gancho, que é usada para adicionar html/texto no footer do WordPress, muito utilizado para criar códigos de Google Analytics.

O exemplo abaixo leva dois parâmetros quando for executado:

<?php do_action( 'delete_blog', $blog_id, $drop ); ?>

Neste caso o nome da ação é delete_blog e ela aceita dois parâmetros, $blog_ID e $drop.

Pendurando funções em uma Ação gancho (action hook)

As ações não são nada mais do que funções PHP, mas para estas funções serem consideradas ações, é necessário que ela seja pendurada em um dos ganchos do WordPress.

Por exemplo no desenvolvimento de um tema, muitas vezes existe a necessidade de executar uma função quando um tipo de ação gancho for disparada. Ai que entra a função add_action().

<?php add_action($tag, $function, $priority, $accepted_args ); ?>
  • $tag — O nome da ação gancho
  • $function — O nome da função que será disparada
  • $priority — Usando um número inteiro, você define quando essa função deve ser disparada, caso você não coloque nenhum valor, por padrão será usado o número 10.
  • $accepted_args — Os argumentos da sua função, por padrão apenas um argumento é passado.

Você não precisa se limitar a apenas uma função por ação gancho, seu tema ou plugin pode chamar por variadas funções. O próprio WordPress faz uso dessa funcionalidade para adicionar várias funções por ação gancho.

Vamos colocar isso em um exemplo prático de uso de ações em um tema:

<?php
       add_action('wp_footer','webord_footer_copyrights',20);
      function webord_footer_copyrights() {
           echo 'Esse blog funciona orgulhosamente com WordPress desde 2009';
      }
 ?>

Filtros (filter hook)

Os filtros são bem parecidos com as ações em muitos aspectos mas o conceitouma é um pouco diferente, em um filtro você não deve escrever nada, pois muitas vezes você pode acabar com o conhecido erro headers already sent.

Claro que o WordPress é todo montado usando as funcionalidades dos Filtros e das Ações, e assim como o sistema, você pode adicionar filtros para o seu conteúdo de forma fácil tornando o seu plugin ou tema extensível. Usando a sintaxe abaixo:

<?php apply_filter($tag, $value, $arg=""); ?>
  • $tag — O nome da ação gancho
  • $value — Valor a ser atribuido como padrão, e que será passado para a função como primeiro argumento
  • $arg — Os valores que serão passados para a função. No exemplo temos apenas um parâmetro mas na realidade existem funções com muitos parâmetros, e por este motivo é sempre bem legal verificar a quantidade de parâmetros cada filtro gancho

Usando a mesma sintaxe que criamos para as ações ganchos podemos adicionar mais argumentos ao filtro:

<?php apply_filters($tag, $value,$arg_1,$arg_2,$arg_{n}); ?>

Pendurando funções em um Filtro gancho (filter hook)

Usando a estrutura abaixo você pode adicionar filtros a um gancho:

<?php add_filter( $tag, $function_to_add, $priority, $accepted_args ); ?>

  • $tag — O nome do fitro gancho que a função será colocada
  • $function_to_add — O nome da função que será disparada
  • $priority — Usando um número inteiro, você define quando essa função deve ser disparada, caso você não coloque nenhum valor, por padrão será usado o número 10.
  • $accepted_args — Os argumentos da sua função, por padrão apenas um argumento é passado.

Como o nome já diz os filtros funcionam para interceptar um conteúdo e poder fazer algum tipo de mudança ou leitura. Sendo assim são a base para muitos plugins de SEO ou plugins de moderação.

Um exemplo que acho interessante falar de uma idéia simples de plugin, para fazer a substituição de um texto específico no conteúdo de um post. Isso é usado no código base do WordPress, que sempre que você digitar a palavra WordPress, da forma incorreta, ou seja sem o “W” em caixa alta e o “P” em caixa alta ele irá fazer a correção deste texto automaticamente para você. Isso funciona desta forma:

<?php
     add_filter( 'the_content', 'capital_P_dangit', 11 );
     function capital_P_dangit( $text ) {
          return str_replace( 'Wordpress', 'WordPress', $text );
     }
?>

Em nenhum momento eu recomendo fazer isso, pois não é dessa forma simples que o WordPress faz, pois se fosse feito assim alguns links poderiam apontar para locais errados, mas a estrutura é bem simples.

Ainda existe muito o que ser falado sobre Ganchos, Filtros e Ações, se você se interessou o Codex do WordPress.org é seu guia, e pouco lhe faltará. Até que você se aprofunde muito no sistema lá será um ótimo local para pesquisa, e para descobrir qual Gancho você deverá usar, recomendo o banco de ganchos criado pelo Adam Brown.

Qualquer dúvida basta colocar nos comentários que eu ficarei feliz em tentar ajudar.

, , , , , , , , , , , , ,

Comentários (6)

  1. haruan

    on 19/10/2011 at 14:22 said:

    Muito obrigado,
    era isso mesmo que eu estava precisando.

  2. Leandro D. Soares

    on 04/04/2012 at 18:46 said:

    Não entendi aonde salvo esses códigos…
    Eu crio um arquivo .php e com qual nome?

    Eu edito algum arquivo já existente? qual?

    Desculpe…. Mas todo site parte da premissa que a pessoa já sabe isso quando vai explicar o uso de hooks e eu não sei…

    Se puder ajudar…

    • Você pode usar o código para Hooks em dois locais: em um plugin wp-content/plugins/seu-plugin/seu-plugin.php e ativar esse plugin na Administração do site ou no wp-content/themes/tema-ativo/functions.php que é um arquivo que é incluido em toda requisição do WordPress, agora caso queira aplicar um hook em algo que só deve acontecer em uma página de Post pode aplicar no começo do arquivo wp-content/themes/tema-ativo/single.php, ou usar uma tag condicional do WordPress para veriricar onde você está.

      Qualquer dúvida só colocar aqui que eu tento ajudar.

      • Leandro D. Soares

        on 04/04/2012 at 19:48 said:

        Gustavo,

        Obrigado pelo esclarecimento. Já deu uma luz.
        É que estava lendo um artigo:
        http://wp-brasil.org/wpbrasil/como-usar-o-media-uploader-do-wordpress-para-adicionar-arquivos-a-meta-boxes

        (não sei de pode postar o link aqui)

        Que atende exatamente o que desejo, ou seja, colocar alguns arquivos para download para meu blog. Seriam alguns pdf e ppt.

        Seria abusar se eu solicitar a sua ajuda para entender o que fazer com os códigos que foi postado neste link acima?

        Obrigado pela paciência.

        • Então minha dica cara é tu usar o plugin que eu criei para exatamente para este uso.

          http://wordpress.org/extend/plugins/extend-upload/

          Ele funciona bem parecido com o código que está no link que você passou mas ele é mais bem polido.

          Para utilizar você só precisa instalar ele no seu tema e colocar o seguinte código no seu functions.php:

          	add_action( 'init', function() {
          		global $pagenow;
          		if( 'post-new.php' == $pagenow ) { // Aqui é colocar o código na página, e apenas naquela que é necessária, você pode printar essa variável na tela para poder verificar qual o $pagenow que você precisa
          			wp_enqueue_script( 'extend-upload' );
          			wp_enqueue_style( 'extend-upload' );
          		}
          	} );
          

          Ai o seu html deve ficar assim, sempre atentando para as três classes utilizadas abaixo:

          • uc-container: Para um elemento que contenha os dois abaixo
          • uc-call: Um elemento que recebe a ação de no clique abrir o thickbox
          • uc-answer: Um input field que recebe o valor após o clique em “Inserir no Post” dentro da thickbox
          	<div class='uc-container'>
          		<a class='uc-call' data='<?php echo json_encode( array( 'url' => admin_url( 'media-upload.php?post_id=0&TB_iframe=1&width=640&height=253' ) ) ); ?>'><small><?php _e( "Upload do arquivo" ); ?>"</small></a>
          		<input class="uc-answer" type='text' />
          	</div>
          
  3. Leandro D. Soares

    on 04/04/2012 at 20:31 said:

    Cara,

    Muito obrigado mesmo. Vou testar aqui.
    Aproveitando ainda mais, você recomenda algum curso on-line sobre WordPress?

    Ps. Depois posto aqui o resultado de sua dica.

Deixar uma Resposta

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>