Dove posso trovare una lista di hook di WordPress?
Dove posso trovare una lista di tutti gli hook e funzioni sovrascrivibili (pluggable, scriptable, ecc.) di WordPress?
Modifica: Il plugin è elencato qui.
@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:
Attivi la strumentalizzazione usando il parametro URL instrument=hooks
, ad esempio:
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;
}
}
}

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

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 - 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!

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

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

@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! :-)

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

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

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

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

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
.

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?

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

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');

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,
per descrivere ciascuno

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