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


51

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

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

Além da semântica e para que são usadas, que diferenças reais existem entre elas?

Respostas:


58

Olá @Sruly :

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

Ganchos de ação

Os ganchos de ações destinam-se ao uso quando o núcleo do WordPress ou algum plug-in ou tema oferece a oportunidade de inserir seu código em um determinado momento e executar um ou mais dos seguintes procedimentos:

  1. Use echopara 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 em do_action_ref_array()vez de, do_action()pois o último não suporta a passagem de variáveis por referência ).

Ganchos de filtro

Os ganchos de filtro se comportam de maneira muito semelhante aos 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 gancho de ação, ou seja, para modificar uma variável global ou gerar algum HTML, assumindo que é isso que você precisa fazer quando o gancho é chamado. Uma coisa que é muito importante sobre os ganchos de filtro com os quais você não precisa se preocupar com os ganchos de ação é que a pessoa que usa um gancho de filtro deve retornar (uma versão modificada) o primeiro parâmetro que foi passado. Um erro comum para iniciantes é esquecer de retornar esse valor!

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

Como um aparte , senti que os ganchos de filtro eram prejudicados nas 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âmetros para fornecer qualquer contexto. Ultimamente e positivamente, no entanto, parece que a equipe principal do WordPress tem alegremente (para mim) adicionado parâmetros extras aos Filter Hooks, para que você possa descobrir mais contexto. Um bom exemplo é o posts_wheregancho; Acredito que algumas versões anteriores aceitavam apenas um parâmetro, sendo a classe "where" da consulta atual, mas agora aceitam a cláusula where e uma referência à instância atual da WP_Queryclasse que está chamando o gancho.

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

Na realidade, os Hooks de filtro são praticamente um superconjunto de Hooks de ação. O primeiro pode fazer qualquer coisa que o segundo 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 de Filtro.

Orientação e intenção de telegrafar

Mas provavelmente não é isso que é importante. Eu acho que o importante é que, por um desenvolvedor que escolhe usar um gancho de ação versus um gancho de filtro ou vice-versa, ele está telegrafando suas intenções e, assim, dando orientação ao desenvolvedor de programadores ou plugins que possam estar usando o gancho. Em essência, eles estão dizendo: "Vou ligar para você, faça o que for necessário" OU "Vou passar esse valor para você modificar, mas certifique-se de devolvê-lo ".

Então, em última análise , acho que a orientação fornecida pela escolha do tipo de gancho é o valor real por trás da distinção . IMO, pelo menos.

Espero que isto ajude!


Para mim, parece que você poderia ter usado filtros para tudo, já que retornar uma variável é opcional no PHP. Alguém sabe por que os desenvolvedores do WordPress optaram por ter dois termos separados? É puramente por razões semânticas? Tecnicamente eu não posso ver a necessidade para ele ...
TheStoryCoder

2
@TheStoryCoder "É puramente por razões semânticas?" Parece que é exatamente o que minha resposta explicou, cinco (5) anos atrás ...?
MikeSchinkel

11

Se você procurar na fonte a add_action()função principal, é apenas um invólucro para a add_filter()função ...

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

Então o que isso quer dizer? ações são como filtros, exceto que uma ação não retorna um valor; portanto, você não pode modificar 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 o que você pode fazer com uma ação é simplesmente executar uma função sem modificar algum valor.


5

Em palavras simples.

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

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

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


Como usar?

Açao:

Confira abaixo exemplos simples no seu functions.phparquivo de tema .

  1. Exemplo Um: ( Exemplo simples de PHP)
teste de funcionamento() {
     eco "Saída";
}

teste();

O programa acima imprime a saída:

Resultado

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


  1. Exemplo Dois: (Uso Simples de Ação)
função test1 () {
     eco "Saída";
}
add_action ('teste', 'teste1');

do_action ('teste');

O programa acima imprime a saída:

Resultado

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


  1. Exemplo três: (outro uso de ações)
função test2 () {
     eco "Teste 2";
}
add_action ('teste', 'teste2', 1);

função test1 () {
     eco "Teste 1";
}
add_action ('teste', 'teste1', 2);

do_action ('teste');

O programa acima imprime a saída:

Teste 2Teste 1

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

A 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á:

Teste 1Teste 2

  1. Exemplo quatro: (suporte de terceiros) Adicione o código abaixo emfunctions.php
função test1 () {
     do_action ('test_before');
     eco "Teste 1";
     do_action ('test_after');
}
add_action ('teste', 'teste1');

do_action ('teste');

O programa acima imprime a saída:

Teste 1

Agora, crie um plug-in de amostra para verificar como funciona para o desenvolvedor de terceiros.

  1. Crie uma pasta 'simples' no /wp-content/plugins/diretório
  2. Crie um arquivo chamado 'simple.php' e adicione o código abaixo.
/ *
* Nome do Plugin: Plugin Simples
* /
função test_callback_function () {
     eco "Do plugin";
}
add_action ('teste', 'test_callback_function');

Agora, ative nosso plugin Simples no painel de administração do WordPress.

Vá para o plugin do menu e ative-o.

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

Teste 1De plug-in

[NOTA: Se adicionarmos a prioridade para a ação do plug-in de 1 a 9, ela imprimirá a saída como:

Do pluginTest 1

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

Filtros

Veja os exemplos abaixo:

Exemplo simples de PHP:

$ data = array ('um', 'dois');
print_r ($ dados);

O programa acima imprime a saída:

Matriz ([0] => um [1] => dois)
  1. Exemplo 1: (Uso simples do filtro)
$ data = apply_filters ('my_filter_name', array ('um', 'dois'));
print_r ($ dados);

add_filter ('my_filter_name', função ($ old_data) {
     matriz de retorno ('três', 'quatro');
});

O programa acima imprime a saída:

Matriz ([0] => três [1] => quatro)

Aqui, Nós adicionamos filtro my_filter_namee mudar a saída existente array( 'one', 'two' )com array( 'three', 'four' )sem alterar o tema / plugin arquivos.



Obrigado @maheshwaghmare por um truque tão simples. por favor, escreva sobre 'Filtros' também
Adi

O que exatamente você quer dizer com "em breve"?
Rapti

@Rapti Desculpe pelo atraso. Hoje à noite vou adicionar a resposta relacionada aos filtros. No futuro, criarei um artigo descritivo sobre Ganchos (ações e filtros).
Mahshwaghmare

@maheshwaghmare procrastinar muito? : P

Boa explicação, eu tenho uma melhor compreensão agora
budiantoip
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.