Como os filtros e ganchos realmente funcionam em PHP

19

Como os filtros e ganchos funcionam no WordPress?

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

    
por Aaron Lee 13.08.2013 / 10:53

2 respostas

32

Visão geral

Basicamente, a " API de plug-in ", que chama 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

Internos Básicos

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

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

O primeiro $wp_filter é um Array global que mantém todos os nomes de filtro como subarrays. Cada um desses subarranjos, em seguida, contém ainda mais subarrays que são callbacks invocados em uma matriz de prioridade.

Breve em profundidade

Assim, quando uma função executar é chamada, o WordPress pesquisa essas matrizes globais para as chaves com esse nome. Em seguida, os callbacks anexados são executados com prioridade após a prioridade. A única coisa que acontece na frente são os retornos de chamada anexados ao filtro all .

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

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

Em seguida, adiciona seu retorno de chamada à pilha global $wp_filter :

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

Como você pode ver a sub-matriz principal é $tag (ou nome da ação / filtro), então tudo é invocado sob uma prioridade específica, e a string de retorno / ID "exclusiva" é usada como chave.

Mais tarde, quando um filtro é chamado - acontecendo com o $tag / action- / filter-name - a matriz é pesquisada e os callbacks são chamados. Como está usando call_user_func_array , realmente não importa quantos argumentos estão anexados. WordPress resolve isso sozinho.

foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
    call_user_func_array(
        $the_['function'], 
        array_slice(
            $args, 
            0, 
            (int) $the_['accepted_args']
        )
    );
}
    
por kaiser 13.08.2013 / 15:22
4
Os

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

Um exemplo é o gancho wp_head no WordPress. Você pode usar esse gancho no seu tema 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 no framework do tema Genesis. / p>

Exemplo:

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

Veja como fica o gancho se você abriu o arquivo header.php no framework do tema Genesis:

do_action( 'genesis_header' );

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

Filtros permitem modificar a saída de uma função existente e são incluídos nos arquivos principais do WordPress e em algumas estruturas de temas 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

Veja um exemplo de como você pode usar um filtro em uma estrutura de temas como Gênesis:

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 tamanho 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 wp-includes / post-template.php.

Veja como fica:

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

Você também pode usar ganchos e filtros em plugins 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 seu tema pai sem editar os arquivos principais do WordPress ou seus arquivos de tema pai.

É 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 de temas pai. Dessa forma, você também pode alterar os temas com segurança.

    
por Brad Dalton 14.08.2013 / 11:05

Tags