Dove posso trovare un elenco di hook di WordPress?


Risposte:


45

@Arlen: Come sottolinea Keith S , List of Hooks di Adam Brown è la risorsa defacto di hook per WordPress. Tuttavia, non è perfetto:

  • Non mostra gli hook in ordine di quando vengono chiamati,
  • Non fornisce il nome del file o il numero di riga quando viene invocato,
  • Non fornisce un numero di argomenti passati,
  • Non è un elenco completo perché alcuni hook possono essere chiamati in modo dinamico,
  • E non mostra gli hook dai plugin.

Quindi, sebbene la lista di Adam sia una grande risorsa soprattutto per capire quando gli hook sono stati aggiunti storicamente, non è altrettanto utile come se tu fossi in grado di strumentare gli hook in una data pagina del tuo sito.

Ho giocato con questa idea per un po ', quindi la tua domanda mi ha spinto a scrivere un plugin chiamato " Instrument Hooks for WordPress ". Puoi trovare la fonte completa sotto la schermata e puoi anche scaricarla da gist qui .

Quindi ecco uno screenshot di come appare la strumentazione:

Schermata di Instrument Hooks per WordPress Plugin in azione

È possibile attivare la strumentazione utilizzando il parametro URL instrument=hooks, ovvero:

http://example.com?instrument=hooks

E come promesso, ecco la fonte (o scaricala qui .):

<?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;
        }
    }
}

Vorrei ... è una di quelle cose che potresti usare solo una o due volte, ma quando lo usi, ringrazi le stelle per questo :)
Keith S.

1
Mike, è fantastico! Ma cosa consiglieresti per capire veramente cosa fa ogni filtro / azione? c'è un file in cui tutti questi sono elencati insieme alla loro 'attività'? Grazie!
Entro il

1
@Amit - Sì, questa è la domanda difficile. :) Grazie per avermelo chiesto. Sfortunatamente, non riesco a vedere alcun modo per automatizzarlo come ho fatto per elencare i ganci sopra, quindi non ho una risposta perfetta per te. Idealmente per ogni hook qualcuno scriverebbe un ottimo post sul blog (o fa una domanda qui che ha ottenuto un'ottima risposta) e quindi "Google it" sarebbe la tua risposta. Così com'è, utilizzo un IDE di debug (PhpStorm + XDEBUG, US $ 49 fino a settembre 2010) e imposto punti di interruzione e seguo semplicemente il codice di esecuzione. Potrebbe esserci un modo migliore, però, e se qualcun altro ci ha pensato, faccelo sapere!
MikeSchinkel,

Caspita, questa è la risposta migliore che abbia mai visto. Qui comunque.
Arlen Beiler,

2
@ Mike: domanda veloce, perché lo memorizzi nel database anziché nella memoria o in un flusso temporaneo?
Hacre,


2

Il Codice ha un riferimento di azione e un riferimento di filtro . Adam Brown ha creato un database hook che ha tutti gli hook nel codice sorgente e aggiunge la documentazione dalle pagine wiki, informazioni sulla versione e collegamenti al codice sorgente. Puoi migliorarlo scrivendo la documentazione nel Codice.

Naturalmente, alcuni hook sono dinamici, a seconda di altri dati. Prendi la wp_transition_post_statusfunzione:

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 registri un tipo di post personalizzato evente uno stato di post personalizzato cancelled, avrai un cancelled_eventhook di azione.


Il database di Adam Browns non è solo una combinazione di quelle 2 pagine, ma ha ogni singola azione e filtro elencati in WordPress. O non è quello che volevi dire.
Arlen Beiler,

@Arlen: Sì, l'ho riscritto in modo che sia più chiaro.
Jan Fabry,

1

Anche se primitivo, forse questo codice plugin può aiutare? Cambia "add_action" con "add_filter" se vuoi invece guardare i filtri. Carica il plug-in e quindi aggiorna la pagina iniziale del sito. Una volta caricato, è una vera seccatura da disattivare, quindi basta rinominare il file del plugin nella cartella dei plugin e aggiornare nuovamente il sito - si disattiverà automaticamente. Ho usato questo trucco molte volte per risolvere problemi o trovare un posto dove posso inserire qualcosa.

<?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;
}

Potrebbe non essere carino, ma potrebbe effettivamente essere il modo più rapido e semplice in alcuni scenari (uso spesso "debug printf" per correggere piccole cose in piccoli progetti Notepad + da riga di comando invece di utilizzare un intero IDE).
Synetech,

0

Uso questo per trovare l'ordine dei ganci. Per ottenere il filtersgiusto cambiamento add_actionin 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');

0

Come suggerisce @kaiser non pubblicare solo link, lo sto migliorando. ma non è possibile utilizzare l'intero codice qui quindi sto usando poche immagini qui per spiegare che ha un elenco completo per gli hook di WordPress con descriverne ciascuno. puoi trovarlo qui per hook , classi , funzioni , plugin , inserisci qui la descrizione dell'immagine

per descrivere ciascuno inserisci qui la descrizione dell'immagine


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.