Diferença entre ganchos de filtro e ação?

48

Eu estive olhando a API do plugin um pouco mais a fundo recentemente e fiquei me perguntando quais as diferenças reais entre os ganchos de ação e filtro . Ambos são eventos que recebem dados como um parâmetro e eles parecem ser capazes de fazer as mesmas coisas.

Obviamente, vejo que as ações são chamadas quando as ações ocorrem e os filtros são chamados quando os dados são manipulados, mas parece ser apenas uma diferença de nomenclatura semântica.

Além da semântica e para que são usados, quais são as diferenças reais entre eles?

    
por Sruly 29.08.2010 / 14:27
fonte

3 respostas

55

Oi @Sruly :

Você praticamente respondeu à sua própria pergunta, mas vou elaborar um pouco.

Ganchos de ação

Os Ganchos de Ações são destinados ao uso quando o núcleo do WordPress ou algum plugin ou tema lhe dá a oportunidade de inserir seu código em um determinado ponto e executar um ou mais dos seguintes procedimentos:

  1. Use echo para injetar algum HTML ou outro conteúdo no buffer de resposta,
  2. Modifique o estado da variável global para uma ou mais variáveis e / ou
  3. Modifique os parâmetros passados para sua função de gancho (assumindo que o gancho foi chamado por do_action_ref_array() em vez de do_action() , pois o último não suporta a passagem de variáveis por referência .)

Ganchos de filtro

Ganchos de Filtro comportam-se muito parecidos com os Ganchos de Ação , mas seu uso pretendido é receber um valor e potencialmente retornar uma versão modificada do valor. Um gancho de filtro também pode ser usado como um Action Hook, ou seja, para modificar uma variável global ou gerar algum HTML, assumindo que é isso que você precisa fazer quando o hook é chamado. Uma coisa que é muito importante sobre Ganchos de Filtro com os quais você não precisa se preocupar com Ganchos de Ação é que a pessoa que usa um Gancho de Filtro deve retornar (uma versão modificada do ) o primeiro parâmetro foi passado. Um erro comum entre os novatos é esquecer de devolver esse valor!

Usando parâmetros adicionais para fornecer contexto em ganchos de filtro

Como um aparte eu senti que Filter Hooks eram prejudicados em versões anteriores do WordPress, porque eles receberiam apenas um parâmetro; ou seja, eles receberiam um valor para modificar, mas nenhum segundo ou terceiro parâmetro para fornecer qualquer contexto. Ultimamente, e positivamente, no entanto, parece que a equipe principal do WordPress tem adicionado, com alegria (para mim) parâmetros extras para Filtrar Ganchos, para que você possa descobrir mais contexto. Um bom exemplo é o posts_where hook; Eu acredito que algumas versões suportam apenas um parâmetro sendo a classe "where" SQL da consulta atual, mas agora ela aceita tanto a cláusula where como uma referência à instância atual do WP_Query class que está chamando o gancho.

Então, qual é a diferença real?

Na realidade, os Ganchos de Filtro são praticamente um superconjunto dos Action Hooks. O primeiro pode fazer qualquer coisa que o último possa fazer e um pouco mais, embora o desenvolvedor não tenha a responsabilidade de retornar um valor com o Gancho de ação que ele ou ela faz com o Gancho do Filtro.

Dando orientação e intenção de telegrafia

Mas isso provavelmente não é o que é importante. Eu acho que o importante é que, por um desenvolvedor que escolhe usar um gancho de ação contra um gancho de filtro ou vice-versa, eles estão telegrafando suas intenções e, portanto, dando orientação ao expoente. ou desenvolvedor de plug-ins que possa estar usando o gancho. Em essência, eles estão dizendo "Vou ligar para você, fazer o que for preciso" OR "eu" você vai passar esse valor para modificar, mas certifique-se de passá-lo de volta . "

Então, finalmente, , acho que a orientação fornecida pela escolha do tipo de gancho é o valor real por trás da distinção . OMI, de qualquer maneira.

Espero que isso ajude!

    
por MikeSchinkel 29.08.2010 / 15:57
fonte
11

Se você olhar a fonte para a função add_action() core, é apenas um wrapper para add_filter() function ...

E se você observar a função do_action() core, ela é muito semelhante à função apply_filters() core, com uma diferença muito importante: ela não retorna um valor.

Então, o que isso significa? as ações são como filtros, exceto que uma ação não retorna um valor, portanto, você não pode modificar os dados. Isso mostra que era simples criar o mecanismo de ação do WordPress simplesmente copiando o mecanismo de filtro e não retornando um valor. Basicamente, tudo que você pode fazer com uma ação é simplesmente executar uma função sem modificar algum valor.

    
por trusktr 29.06.2013 / 20:41
fonte
3

Em simples palavras.

  

Ações são aquelas funções do PHP que executam a saída.

     

Filtros são aquelas funções do PHP que retornam a saída.

Atualizado: Podemos estender qualquer plugin que use as ações e filtros sem modificar o código. Adicionando filtros e ações em nosso próprio tema ou plug-in.

Como usar?

Ação:

Verifique abaixo os exemplos simples no seu arquivo functions.php do tema.

  1. Exemplo 1: (exemplo simples do PHP)
function test() {
     echo "Output";
}

test();

Acima do programa, imprima a saída:

Output

[NOTA: Aqui test () simplesmente chama a função. E execute a função de retorno de chamada 'teste'.]

  1. Exemplo dois: (uso simples da ação)
function test1() {
     echo "Output";
}
add_action( 'test', 'test1' );

do_action( 'test' );

Acima do programa, imprima a saída:

Output

[NOTA: Aqui do_action('test') funciona como função de chamada. E execute a função de retorno de chamada 'test1'.]

  1. Exemplo Três: (Outro uso de Ações)
function test2() {
     echo "Test 2";
}
add_action( 'test', 'test2', 1 );

function test1() {
     echo "Test 1";
}
add_action( 'test', 'test1', 2 );

do_action( 'test' );

Acima do programa, imprima a saída:

Test 2Test 1

[NOTA: Aqui do_action('test') funciona como função de chamada. E execute funções de callback em suas prioridades.

Função de retorno de chamada 'test1' tem prioridade 2 E 'test2' tem prioridade 1.]

Se as prioridades forem alteradas, como 'test1' com prioridade 1 E 'test2' com prioridade 2, a saída será:

Test 1Test 2
  1. Exemplo Quatro: (suporte de terceiros) Adicione o código abaixo em functions.php
function test1() {
     do_action( 'test_before' );
     echo "Test 1";
     do_action( 'test_after' );
}
add_action( 'test', 'test1' );

do_action( 'test' );

Acima do programa, imprima a saída:

Test 1

Agora, crie um plug-in de exemplo para verificar como ele funciona para desenvolvedores de terceiros.

  1. Crie uma pasta "simples" no diretório /wp-content/plugins/ .
  2. Crie um arquivo chamado 'simple.php' e adicione o código abaixo.
/*
* Plugin Name: Simple Plugin
*/
function test_callback_function() {
     echo "From plugin";
}
add_action( 'test', 'test_callback_function' );

Agora, ative nosso plug-in simples no painel de controle do WordPress.

Abra o plugin do menu e ative-o.

Após ativar o plugin acima do programa, imprima a saída:

Test 1From plugin

[NOTA: Se adicionarmos a prioridade para a ação do nosso plugin de 1 a 9, imprima a saída como:

From pluginTest 1

Porque o WordPress considera o 10 priority by default para todas as ações adicionadas.]

Filtros

Verifique os exemplos abaixo:

Exemplo simples de PHP:

$data = array( 'one', 'two' );
print_r( $data );

Acima do programa, imprima a saída:

Array ( [0] => one [1] => two )
  1. Exemplo 1: (uso simples do filtro)
$data = apply_filters( 'my_filter_name', array( 'one', 'two' ) );
print_r( $data );

add_filter( 'my_filter_name', function( $old_data ) {
     return array( 'three', 'four' );
});

Acima do programa, imprima a saída:

Array ( [0] => three [1] => four )

Aqui, adicionamos o filtro my_filter_name e alteramos a saída existente array( 'one', 'two' ) com array( 'three', 'four' ) sem alterar os arquivos de tema / plug-in.

por maheshwaghmare 03.02.2017 / 16:37
fonte