Dove posso trovare una lista di hook di WordPress?

13 ago 2010, 18:15:29
Visualizzazioni: 19.3K
Voti: 52

Dove posso trovare una lista di tutti gli hook e funzioni sovrascrivibili (pluggable, scriptable, ecc.) di WordPress?

Modifica: Il plugin è elencato qui.

2
Commenti

Questo è il mio sito di riferimento quando cerco informazioni sugli hook... Database degli Hook di WordPress

Keith S. Keith S.
13 ago 2010 18:25:35

WordPress ha finalmente documentato tutti i suoi hook. :D Puoi navigare e cercare lì.

sam sam
21 nov 2014 02:05:32
Tutte le risposte alla domanda 7
9
47

@Arlen: Come sottolinea Keith S, La Lista degli Hook di Adam Brown è la risorsa di riferimento per gli hook in WordPress. Tuttavia, non è perfetta:

  • Non mostra gli hook nell'ordine in cui vengono chiamati,
  • Non fornisce il nome del file o il numero di riga dove vengono invocati,
  • Non indica il numero di argomenti passati,
  • Non è una lista completa perché alcuni hook possono essere chiamati dinamicamente,
  • E non mostra gli hook dei plugin.

Quindi, sebbene la lista di Adam sia un'ottima risorsa, specialmente per capire quando gli hook sono stati storicamente aggiunti, non è così utile come poter strumentalizzare gli hook su qualsiasi pagina del proprio sito.

Stavo giocando con questa idea da un po', quindi la tua domanda mi ha spinto a scrivere un plugin chiamato "Instrument Hooks for WordPress." Puoi trovare il codice sorgente completo qui sotto lo screenshot e puoi anche scaricarlo da gist qui.

Ecco uno screenshot di come appare la strumentalizzazione:

Screenshot del plugin Instrument Hooks for WordPress in azione

Attivi la strumentalizzazione usando il parametro URL instrument=hooks, ad esempio:

http://example.com?instrument=hooks

E come promesso, ecco il sorgente (o scaricalo qui.):

<?php
/*
Plugin Name: Instrument Hooks for WordPress
Description: Strumentalizza gli Hook per una Pagina. Visualizza l'output durante l'Hook di Shutdown.
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>Prima Chiamata</th>
        <th>Nome Hook</th>
        <th>Tipo Hook</th>
        <th>Conteggio Arg</th>
        <th>Chiamato Da</th>
        <th>Riga #</th>
        <th>Nome File</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;
        }
    }
}
14 ago 2010 05:09:54
Commenti

Lo farei... è una di quelle cose che potresti usare solo una o due volte, ma quando la usi, ringrazi le stelle per averla :)

Keith S. Keith S.
14 ago 2010 06:09:57

Mike, è davvero fantastico! Ma cosa consiglieresti per capire effettivamente cosa fa ogni filtro/azione? C'è un file dove sono elencati tutti insieme alla loro 'attività'? Grazie!

Amit Amit
14 ago 2010 16:10:59

@Amit - Sì, questa è la domanda difficile. :) Grazie per averla fatta. Sfortunatamente, non vedo alcun modo per automatizzarlo come ho fatto per elencare gli hook sopra, quindi non ho una risposta perfetta per te. Idealmente, per ogni hook qualcuno scriverebbe un bel post sul blog (o farebbe una domanda qui che ottenga una grande risposta) e poi "cercalo su Google" sarebbe la tua risposta. Al momento, io uso un IDE di debug (PhpStorm+XDEBUG, 49 dollari fino a settembre 2010) e imposto dei breakpoint e traccio semplicemente il codice in esecuzione. Potrebbe esserci un modo migliore però, e se qualcun altro ci ha pensato fatecelo sapere!

MikeSchinkel MikeSchinkel
15 ago 2010 01:44:49

Wow, questa è la risposta migliore che abbia mai visto. Comunque eccola qui.

Arlen Beiler Arlen Beiler
16 ago 2010 16:15:44

@Mike: Domanda veloce, perché lo memorizzi nel database invece che in memoria o in un flusso temporaneo?

hakre hakre
18 ago 2010 11:31:03

@hakre - Bella domanda! Quando ho iniziato a scrivere il plugin immaginavo che avrebbe raccolto informazioni sugli hook attraverso più caricamenti di pagina. Dopo aver completato l'implementazione mi sono reso conto che sarebbe stato più utile farlo solo per ogni caricamento di pagina, ma avevo già impostato la scrittura su una tabella del database. Ho considerato di cambiarlo ma temevo che potesse consumare troppa memoria (probabilmente una preoccupazione infondata, ma comunque...) Quindi sì, la memoria sarebbe un'alternativa e probabilmente il modo preferibile per farlo. Vuoi fare l'aggiornamento per me? WA è tutto basato sulla partecipazione positiva! :-)

MikeSchinkel MikeSchinkel
18 ago 2010 18:24:21

Può essere utilizzato nella parte amministrativa?

urok93 urok93
21 ago 2012 12:38:38

@drtanz - Non è correlato al front end o all'amministrazione. Dovrebbe funzionare su qualsiasi caricamento di pagina.

MikeSchinkel MikeSchinkel
21 ago 2012 22:48:56

Come piccolo suggerimento. Il plugin Debug Objects ha l'elenco di tutti gli hook e gli hook della pagina corrente come funzionalità.

bueltge bueltge
8 lug 2015 13:33:50
Mostra i restanti 4 commenti
1

Plugin Debug Bar Action Hooks

Mostra un elenco delle azioni attivate per la richiesta corrente. Richiede il plugin debug bar.

Schermata del plugin Debug Bar Action Hooks

22 mag 2012 23:52:41
Commenti

Esistono anche Debug Bar Actions and Filters Addon e Debug Bar Hook Log.

Synetech Synetech
28 lug 2013 20:24:27
2

Il Codex contiene un Riferimento alle Azioni e un Riferimento ai Filtri. Adam Brown ha creato un database degli hook che include tutti gli hook nel codice sorgente, aggiungendo la documentazione dalle pagine wiki, informazioni sulla versione e collegamenti al codice sorgente. Puoi contribuire migliorandolo scrivendo documentazione nel Codex.

Naturalmente, alcuni hook sono dinamici e dipendono da altri dati. Prendiamo la funzione wp_transition_post_status:

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 custom post type event e uno stato personalizzato cancelled, avrai un action hook cancelled_event.

13 ago 2010 18:29:18
Commenti

Il database di Adam Brown non è semplicemente una combinazione di quelle 2 pagine, contiene ogni singola azione e filtro presenti in WordPress elencati. O non è questo che intendevi?

Arlen Beiler Arlen Beiler
13 ago 2010 21:25:58

@Arlen: Esatto, l'ho riscritto per renderlo più chiaro.

Jan Fabry Jan Fabry
13 ago 2010 21:56:34
1

Sebbene primitivo, forse questo codice del plugin può essere d'aiuto? Sostituisci "add_action" con "add_filter" se vuoi esaminare i filtri invece. Carica il plugin e poi ricarica la homepage del sito. Una volta caricato, è molto difficile disattivarlo, quindi basta rinominare il file del plugin nella cartella dei plugin e ricaricare il sito nuovamente -- si disattiverà automaticamente. Ho usato questo trucco molte volte per risolvere problemi o trovare un punto dove 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;
}
18 ago 2010 23:34:31
Commenti

Potrebbe non essere elegante, ma in alcuni scenari potrebbe effettivamente essere il modo più rapido e semplice (spesso uso il "debug con printf" per sistemare piccole cose in progetti semplici con Notepad e riga di comando, invece di usare un IDE completo).

Synetech Synetech
28 lug 2013 20:02:37
0

Uso questa funzione per trovare l'ordine degli hook. Per ottenere i filters basta cambiare add_action in 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');
29 lug 2014 11:37:07
0

Come suggerito da @kaiser, non postare solo link, sto migliorando. Ma non è possibile utilizzare l'intero codice qui, quindi utilizzo alcune immagini per spiegare come avere una lista completa di hook di WordPress con la descrizione di ciascuno. Puoi trovarlo qui per hook, classi, funzioni, plugin, Descrizione dell'immagine qui

per descrivere ciascuno Descrizione dell'immagine qui

4 giu 2015 13:09:40
0

Puoi semplicemente utilizzare un plugin di monitoraggio delle query: https://wordpress.org/plugins/query-monitor/

Monitoraggio query WordPress

12 ago 2019 08:54:00