Diferença entre add_filter e apply_filters

14

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

Alguém pode me dizer qual informação ou lógica considerar antes de usar add_filter ou apply_filters em um contexto.

Isso torna o uso de um imperativo e não o outro?

  • É correto que add_filter apenas adicione uma função à fila de funções esperando para ser executada em uma variável e apply_filters execute as funções em ordem?

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

por hanachi 30.01.2014 / 11:52

1 resposta

23

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 $tag são chamadas chamando esta função. Esta função pode ser usada para criar um novo gancho de filtro simplesmente chamando esta 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_filters para filtrar um dado $value - em relação ao próprio valor, bem como, opcionalmente, forneceu as variáveis $var_1 a $var_n .

add_filter
  

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

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

Em essência:
Você usa add_filter para ligar uma função personalizada à ação de filtro fornecida ( $tag ), que você pode ter gerado por apply_filters antes (ou foi uma ação de filtro interna ou derivada de um plug-in / seu tema) .

Então, aqui está um exemplo ficcional :
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 é o que definimos como comportamento padrão.

Na segunda vez, obtemos as iniciais na ordem inversa, porque a função de filtro __return_true , que é conectada à nossa ação de filtro, sempre retorna TRUE e, portanto, faz com que as iniciais sejam exibidas da direita para a esquerda. p>     

por tfrommen 30.01.2014 / 12:03