Diferença entre add_filter e apply_filters

17

Procurei uma explicação adequada da diferença entre add_filter()e apply_filters()aqui, mas não consegui encontrar uma.

Alguém pode me dizer quais informações ou lógica considerar antes de usar add_filterou apply_filtersem um contexto.

Isso torna obrigatório o uso de um e não do outro?

  • É correto que add_filterapenas adicione uma função à fila de funções aguardando para serem executadas em uma variável e apply_filtersexecute as funções em ordem?

  • Também está correto que apply_filtersquando chamado com um argumento (o nome da função a ser executada) executará essa função antes de todas as outras (se elas existirem) na fila?

hanachi
fonte
2
E a documentação existente aqui e aqui não a explica adequadamente para você?
t31os 30/01
3
Eu acho que essa é realmente uma boa pergunta. Como um novo desenvolvedor de wordpress, esse pode ser um conceito confuso.
Shawn

Respostas:

26

A maioria dos itens a seguir pode ser encontrada no Codex :


apply_filters

As funções de retorno de chamada anexadas ao gancho de filtro $tagsão chamadas ao chamar esta função. Essa função pode ser usada para criar um novo gancho de filtro simplesmente chamando essa função com o nome do novo gancho especificado usando o parâmetro $ tag.

$value = apply_filters( $tag, $value, $var_1, $var_2, ... );

Em essência:
Você usa apply_filterspara filtrar um determinado $value- no que diz respeito ao próprio valor, bem como variáveis opcionalmente fornecidas $var_1através $var_n.


add_filter

Conecte uma função a uma ação de filtro específica.

add_filter( $tag, $function_to_add, $priority, $accepted_args );

Essencialmente:
você usa add_filterpara conectar uma função personalizada à ação de filtro fornecida ( $tag), que você pode ter gerado apply_filtersanteriormente (ou era uma ação de filtro interna ou deriva de um plug-in / seu tema).


Então, aqui está um exemplo fictício :

function print_initials( $name ) {

    if ( ! is_string( $name ) ) {
        return;
    }

    $fragments = explode( ' ', $name );

    /**
     * Filter wether to print initials in reverse order.
     *
     * @param bool $reverse Print initials in reverse order?
     */
    if ( apply_filters( 'reverse_initials', FALSE ) ) {
        $fragments = array_reverse( $fragments );
    }

    foreach ( $fragments as $f ) {
        echo substr( $f, 0, 1 );
    }
}

print_initials( 'Some Guy' ); // outputs: SG

add_filter( 'reverse_initials', '__return_true' );

print_initials( 'Some Guy' ); // outputs: GS

Agora, se apenas chamarmos nossa função como está, as iniciais serão impressas da esquerda para a direita - porque é isso que definimos como comportamento padrão.

Na segunda vez, obtemos as iniciais na ordem inversa - porque a função de filtro __return_true, ligada à nossa ação de filtro, sempre retorna TRUEe, assim, faz com que as iniciais sejam exibidas da direita para a esquerda.

tfrommen
fonte
3
Essa é uma ótima resposta e mostra como você pode substituir os filtros. Obrigado.
Shawn