Onde posso encontrar uma lista de ganchos do WordPress?

48

Onde posso encontrar uma lista de todos os ganchos do WordPress e funções facilmente elimináveis ​​(plugável, programável, etc)?

Edit: Plugin está listado aqui .

Arlen Beiler
fonte
Este é o meu site go-to quando estou procurando informações sobre ganchos ... Banco de dados de ganchos WordPress
Keith S.
1
O WordPress finalmente documentou todos os seus ganchos . : D Você pode navegar e pesquisar lá.
sam

Respostas:

45

@Arlen: Como Keith S salienta, a Lista de ganchos de Adam Brown é o recurso definitivo de ganchos para o WordPress. No entanto, não é perfeito:

  • Ele não mostra os ganchos na ordem em que são chamados,
  • Ele não fornece o nome do arquivo ou o número da linha quando chamado,
  • Ele não fornece vários argumentos passados,
  • Não é uma lista completa porque alguns ganchos podem ser chamados dinamicamente,
  • E não mostra ganchos de plugins.

Portanto, embora a lista de Adam seja um ótimo recurso, especialmente para entender quando os ganchos foram adicionados historicamente, não é tão útil como se você pudesse instrumentá-los em qualquer página do site.

Estou brincando com essa idéia há um tempo, então sua pergunta me levou a escrever um plug - in chamado " Instrument Hooks for WordPress ". Você pode encontrar a fonte completa abaixo da captura de tela e também pode baixá-la da lista aqui .

Então, aqui está uma captura de tela da aparência da instrumentação:

Captura de tela do gancho de instrumento para o plug-in WordPress em ação

Você aciona a instrumentação usando o parâmetro URL instrument=hooks, ou seja:

http://example.com?instrument=hooks

E, como prometido, aqui está a fonte (ou faça o download aqui .):

<?php
/*
Plugin Name: Instrument Hooks for WordPress
Description: Instruments Hooks for a Page. Outputs during the Shutdown Hook.
Version: 0.1
Author: Mike Schinkel
Author URI: http://mikeschinkel.com
*/

if ($_GET['instrument']=='hooks') {

    add_action('shutdown','instrument_hooks');
    function instrument_hooks() {
        global $wpdb;
        $hooks = $wpdb->get_results("SELECT * FROM wp_hook_list ORDER BY first_call");
        $html = array();
        $html[] = '<style>#instrumented-hook-list table,#instrumented-hook-list th,#instrumented-hook-list td {border:1px solid gray;padding:2px 5px;}</style>
<div align="center" id="instrumented-hook-list">
    <table>
        <tr>
        <th>First Call</th>
        <th>Hook Name</th>
        <th>Hook Type</th>
        <th>Arg Count</th>
        <th>Called By</th>
        <th>Line #</th>
        <th>File Name</th>
        </tr>';
        foreach($hooks as $hook) {
            $html[] = "<tr>
            <td>{$hook->first_call}</td>
            <td>{$hook->hook_name}</td>
            <td>{$hook->hook_type}</td>
            <td>{$hook->arg_count}</td>
            <td>{$hook->called_by}</td>
            <td>{$hook->line_num}</td>
            <td>{$hook->file_name}</td>
            </tr>";
        }
        $html[] = '</table></div>';
        echo implode("\n",$html);
    }

    add_action('all','record_hook_usage');
    function record_hook_usage($hook){
        global $wpdb;
        static $in_hook = false;
        static $first_call = 1;
        static $doc_root;
        $callstack = debug_backtrace();
        if (!$in_hook) {
            $in_hook = true;
            if ($first_call==1) {
                $doc_root = $_SERVER['DOCUMENT_ROOT'];
                $results = $wpdb->get_results("SHOW TABLE STATUS LIKE 'wp_hook_list'");
                if (count($results)==1) {
                    $wpdb->query("TRUNCATE TABLE wp_hook_list");
                } else {
                    $wpdb->query("CREATE TABLE wp_hook_list (
                    called_by varchar(96) NOT NULL,
                    hook_name varchar(96) NOT NULL,
                    hook_type varchar(15) NOT NULL,
                    first_call int(11) NOT NULL,
                    arg_count tinyint(4) NOT NULL,
                    file_name varchar(128) NOT NULL,
                    line_num smallint NOT NULL,
                    PRIMARY KEY (first_call,hook_name))"
                    );
                }
            }
            $args = func_get_args();
            $arg_count = count($args)-1;
            $hook_type = str_replace('do_','',
                str_replace('apply_filters','filter',
                    str_replace('_ref_array','[]',
                        $callstack[3]['function'])));
            $file_name = str_replace($doc_root,'',$callstack[3]['file']);
            $line_num = $callstack[3]['line'];
            $called_by = $callstack[4]['function'];
            $wpdb->query("INSERT wp_hook_list
                (first_call,called_by,hook_name,hook_type,arg_count,file_name,line_num)
                VALUES ($first_call,'$called_by()','$hook','$hook_type',$arg_count,'$file_name',$line_num)");
            $first_call++;
            $in_hook = false;
        }
    }
}
MikeSchinkel
fonte
Eu ... um É daquelas coisas que você só pode usar uma ou duas vezes, mas quando você usá-lo, você agradecer as estrelas para ele :)
Keith S.
1
Mike, isso é muito legal! Mas o que você recomendaria para realmente entender o que cada filtro / ação faz? existe um arquivo em que todos esses são listados junto com sua 'atividade'? Obrigado!
Amit
1
@Mit - Sim, essa é a pergunta difícil. :) Obrigado por perguntar. Infelizmente, não vejo como automatizar isso, como fiz para listar os ganchos acima, para não ter uma resposta perfeita para você. Idealmente, para cada gancho, alguém escreveria uma ótima postagem no blog (ou faria uma pergunta aqui que obteve ótima resposta) e, em seguida, "Google it" seria sua resposta. Como é, eu uso um IDE de depuração (PhpStorm + XDEBUG, US $ 49 até setembro de 2010) e defino pontos de interrupção e apenas rastreio o código em execução. Pode haver uma maneira melhor, e se alguém tiver pensado nisso, por favor nos avise!
MikeSchinkel
Uau, esta é a melhor resposta que eu já vi. Aqui de qualquer maneira.
Arlen Beiler
2
@ Mike: Pergunta rápida, por que você armazena isso no banco de dados, em vez de na memória ou em um fluxo temporário?
hakre
2

O Codex possui uma Referência de Ação e uma Referência de Filtro . Adam Brown criou um banco de dados de ganchos com todos os ganchos no código-fonte e adiciona a documentação das páginas wiki, informações da versão e links ao código-fonte. Você pode aprimorá-lo escrevendo a documentação no Codex.

Obviamente, alguns ganchos são dinâmicos, dependendo de outros dados. Tome a wp_transition_post_statusfunção:

function wp_transition_post_status($new_status, $old_status, $post) {
    do_action('transition_post_status', $new_status, $old_status, $post);
    do_action("${old_status}_to_$new_status", $post);
    do_action("${new_status}_$post->post_type", $post->ID, $post);
}

Se você registrar um tipo de postagem personalizado evente um status de postagem personalizado cancelled, você terá um cancelled_eventgancho de ação.

Jan Fabry
fonte
O banco de dados de Adam Browns não é apenas uma combinação dessas duas páginas, possui todas as ações e filtros do WordPress listados. Ou não é isso que você quis dizer.
Arlen Beiler
@Arlen: Sim, de fato, reescrevi para que fique mais claro.
Jan Fabry
1

Embora primitivo, talvez esse código do plugin possa ajudar? Alterne "add_action" por "add_filter" se quiser ver os filtros. Carregue o plug-in e atualize a página inicial do site. Uma vez carregado, é muito difícil desativar, renomeie o arquivo do plug-in na pasta plug-ins e atualize o site novamente - ele será desativado automaticamente. Eu usei esse truque várias vezes para solucionar problemas ou encontrar um lugar onde eu possa inserir algo.

<?php
/*
Plugin Name: Hooks
Plugin URI: http://example.com/
Description: Hooks
Version: 1.00
Author: Hooks
Author URI: http://example.com/
*/

add_action('all','hook_catchall');
function hook_catchall(&$s1 = '', &$s2 = '', &$s3 = '', &$s4 = '') {
    echo "<h1>1</h1>\n";
    print_r($s1);
    echo "<br />\n";
    echo "<h1>2</h1>\n";
    print_r($s2);
    echo "<br />\n";
    echo "<h1>3</h1>\n";    
    print_r($s3);
    echo "<br />\n";
    echo "<h1>4</h1>\n";    
    print_r($s4);
    echo "<br />\n";
    return $s1;
}
Volomike
fonte
Pode não ser bonito, mas na verdade pode ser a maneira mais rápida e fácil em alguns cenários (geralmente uso "printf debugging" para corrigir pequenas coisas em pequenos projetos de linha de comando do Notepad + em vez de usar um IDE inteiro).
Synetech 28/07
0

Eu uso isso para encontrar a ordem dos ganchos. Para obter a filtersmudança justa add_actionpara add_filter.

function echo_all_hooks() {
$not_arr = array('gettext','sanitize_key','gettext_with_context','attribute_escape');
if(!in_array(current_filter(),$not_arr)) echo current_filter()."<br/>";
}
add_action('all','echo_all_hooks');
Wadde
fonte
0

Como o @kaiser sugere, não publique apenas links, estou melhorando. mas não é possível usar o código inteiro aqui, por isso estou usando poucas imagens aqui para explicar como ele tem uma lista completa dos ganchos do WordPress com a descrição de cada um. você pode encontrá-lo aqui para ganchos , classes , funções , plugins , insira a descrição da imagem aqui

para descrever cada insira a descrição da imagem aqui

sohan
fonte