Como filtros e ganchos realmente funcionam em PHP


21

Como filtros e ganchos realmente funcionam no WordPress?

Estou perguntando sobre algo avançado. Como é implementado em PHP? Por exemplo, como ele coleta todos os ganchos dos diferentes plugins e os "anexa" aos ganchos principais etc.


2
Até onde eu sei, não existem 'ganchos' ou 'filtros' no php, existem funções. O Wordpress possui funções especiais que antes de suas execuções usam um retorno de chamada de outras funções.
Ofir Baruch


3
@OfirBaruch, tenho certeza de que o OP estava se referindo à sua implementação no WordPress e não estava sugerindo que houvesse alguma implementação nativa do PHP.
Tom Auger

Respostas:


33

visão global

Basicamente, a " API de plug-in " , que convoca filtros e ganchos, consiste nas seguintes funções:

  1. apply_filters()- executar
  2. do_action- executar
  3. apply_filters_ref_array()- executar
  4. do_action_ref_array()- executar
  5. add_filter()- adicionar à pilha
  6. add_action()- adicionar à pilha

Internals básicos

No geral, existem alguns globais (o que mais no mundo WordPress) envolvidos:

global $wp_filter, $wp_actions, $wp_current_filter, $merged_filters;

O primeiro $wp_filteré um global Arrayque contém todos os nomes de filtro como sub-matrizes. Cada um desses subarrays contém ainda mais subarrays que são retornos de chamada convocados em uma matriz prioritária.

Breve em profundidade

Portanto, quando uma função de execução é chamada, o WordPress pesquisa essas matrizes globais pelas chaves com esse nome. Em seguida, os retornos de chamada anexados são executados prioridade após prioridade. A única coisa que acontece na frente são os retornos de chamada anexados ao allfiltro.

Quando você adiciona um retorno de chamada usando add_actionor add_filter, o WordPress primeiro calcula um ID "exclusivo" para não substituir os retornos de chamada já anexados.

$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);

Em seguida, ele adiciona seu retorno de chamada à global $wp_filterpilha:

$wp_filter[ $tag ][ $priority ][ $idx ] = array(
    'function'      => $function_to_add,
    'accepted_args' => $accepted_args
);

Como você pode ver, o subconjunto principal é o $tag(ou o nome da ação / filtro), então tudo é convocado sob uma prioridade específica e, em seguida, a string de identificação / retorno de chamada "única" é usada como chave.

Mais tarde, quando um filtro é chamado - acontecendo com o $tag/ action- / filter-name - a matriz é pesquisada e os retornos de chamada são chamados. Como está sendo usado call_user_func_array, não importa realmente quantos argumentos estão anexados. WordPress resolve isso por si só.

foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
    call_user_func_array(
        $the_['function'], 
        array_slice(
            $args, 
            0, 
            (int) $the_['accepted_args']
        )
    );
}

3
não esqueça que, ao passar pelos retornos de chamada, ele ordena a execução de vários retornos de chamada no mesmo gancho usando sua "prioridade", que é definida (opcionalmente) com add_action () e apply_filters () e o padrão é 10.
Tom Auger

1
@ TomAuger Por favor, sinta-se à vontade para adicionar notas e edições adicionais à resposta.
kaiser

5

Os ganchos estão incluídos nos arquivos principais do WordPress e em alguns arquivos de temas principais. Eles permitem que você conecte o conteúdo em um local específico no arquivo.

Um exemplo é o gancho wp_head no WordPress. Você pode usar esse gancho no tema do seu filho para adicionar conteúdo nesse local '

Exemplo:

add_action('wp_head', 'add_content_to_head');
function add_content_to_head() {
echo 'Your Content';
}

Alguns temas premium também incluem ganchos de ação que você pode usar em um tema filho para fazer a mesma coisa. Aqui está um mapa visual que inclui todos os ganchos de ação e a posição em que eles produzem seu conteúdo na estrutura de temas do Genesis.

Exemplo:

add_action('genesis_header', 'add_content_to_header');
function add_content_to_header() {
echo 'Your Content';
}

Aqui está a aparência do gancho se você abriu o arquivo header.php na estrutura do tema Genesis:

do_action( 'genesis_header' );

Aqui está uma lista de ganchos do WordPress que você pode usar de várias maneiras.

Os filtros permitem modificar a saída de uma função existente e estão incluídos nos arquivos principais do WordPress e em algumas estruturas de tema pai, como o Genesis.

Aqui está uma lista dos filtros que você pode usar com o Genesis Design Framework

Aqui está uma lista dos filtros incluídos no WordPress

Aqui está um exemplo de como você pode usar um filtro em uma estrutura de temas como o Genesis:

add_filter( 'comment_author_says_text', 'custom_comment_author_says_text' );
function custom_comment_author_says_text() {
return 'author says';
}

O código acima pode ser usado em um tema filho para modificar o autor diz o texto em seus comentários. Funciona em qualquer tema.

Aqui está outro exemplo que personaliza o comprimento dos trechos para 50 palavras:

add_filter( 'excerpt_length', 'change_excerpt_length' );
function change_excerpt_length($length) {
return 50; 
}

Você encontrará a função the_excerpt () no arquivo wp-includes / post-template.php.

Aqui está o que parece:

  function the_excerpt() {
        echo apply_filters('the_excerpt', get_the_excerpt());
}

Você também pode usar ganchos e filtros em plug-ins para fazer exatamente a mesma coisa e o código não será perdido quando você atualizar o tema pai ou o WordPress.

Basicamente, ganchos e filtros permitem que você personalize e modifique o WordPress e o tema principal sem editar os arquivos principais do WordPress ou os arquivos de tema principais.

É significativamente mais fácil personalizar um tema filho quando a estrutura do tema pai inclui ganchos e filtros, porque você nunca precisa editar os arquivos de modelo dos temas pais. Dessa forma, você também pode alterar os temas com segurança.


2
Esta é uma ótima visão geral dos ganchos e filtros, mas receio que erre totalmente a pergunta do OP, que é sobre os aspectos internos de como os ganchos funcionam e como o WordPress os cria, armazena e processa. Ótima resposta; você provavelmente deve vincular ao seu tutorial nos Sites WP.
Tom Auger

Ok, eu vou excluí-lo. Por mais que eu devesse ter lido melhor a pergunta, pensei que as respostas já dadas seriam mais fáceis para os iniciantes entenderem se soubessem o básico primeiro.
Brad Dalton

2
Brad, cancelei a exclusão, pois acho que pode ser útil ter essas informações aqui também. Se você não concordar, apenas mencione / faça ping aqui e eu o removerei novamente.
kaiser
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.