Unde pot găsi o listă cu toate hook-urile WordPress?
Unde pot găsi o listă cu toate hook-urile și funcțiile care pot fi suprascrise (pluggable, scriptable, etc) din WordPress?
Edit: Plugin-ul este listat aici.
@Arlen: După cum subliniază Keith S, Lista de Hook-uri a lui Adam Brown este resursa de facto pentru hook-urile din WordPress. Totuși, nu este perfectă:
- Nu afișează hook-urile în ordinea în care sunt apelate,
- Nu furnizează numele fișierului sau numărul liniei unde sunt invocate,
- Nu indică numărul de argumente transmise,
- Nu este o listă completă deoarece unele hook-uri pot fi apelate dinamic,
- Și nu afișează hook-urile din plugin-uri.
Deși lista lui Adam este o resursă excelentă, mai ales pentru a înțelege când au fost adăugate istoric hook-urile, nu este la fel de utilă ca posibilitatea de a instrumenta hook-urile pe orice pagină a propriului site.
M-am tot gândit la această idee, iar întrebarea ta m-a determinat să scriu un plugin numit "Instrument Hooks for WordPress". Puteți găsi codul sursă complet mai jos capturii de ecran și îl puteți descărca din gist aici.
Iată o captură de ecran care arată cum arată instrumentarea:
Porniți instrumentarea folosind parametrul URL instrument=hooks
, adică:
Și, cum am promis, iată codul sursă (sau îl puteți descărca aici):
<?php
/*
Plugin Name: Instrument Hooks for WordPress
Description: Instrumentează Hook-urile pentru o Pagină. Afișează rezultatele în timpul Hook-ului 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>Primul Apel</th>
<th>Nume Hook</th>
<th>Tip Hook</th>
<th>Număr Argumente</th>
<th>Apelat De</th>
<th>Linia #</th>
<th>Nume Fișier</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;
}
}
}

Aș... e unul din acele lucruri pe care le-ai putea folosi doar o dată sau de două ori, dar când o faci, mulțumești cerurilor pentru el :)

Mike, asta e foarte tare! Dar ce ai recomanda pentru a înțelege cu adevărat ce face fiecare filtru/acțiune? Există vreun fișier unde toate acestea sunt enumerate împreună cu 'activitatea' lor? Mulțumesc!

@Amit - Da, asta e întrebarea dificilă. :) Mulțumesc că ai întrebat. Din păcate, nu văd nicio modalitate de a automatiza asta așa cum am făcut pentru listarea cârligelor de mai sus, așa că nu am un răspuns perfect pentru tine. În mod ideal, pentru fiecare cârlig cineva ar scrie un articol de blog minunat (sau ar pune o întrebare aici care ar primi un răspuns grozav) și atunci "caută pe Google" ar fi răspunsul tău. În prezent, eu folosesc un IDE pentru depanare (PhpStorm+XDEBUG, 49 USD până în septembrie 2010) și setez puncte de întrerupere și urmăresc codul în execuție. Poate există o cale mai bună, totuși, și dacă cineva s-a gândit la ea, vă rog să ne spuneți!

Uau, acesta este cel mai bun răspuns pe care l-am văzut vreodată. Cel puțin aici.

@Mike: O întrebare rapidă, de ce stochezi asta în baza de date în loc de memorie sau într-un flux temporar?

@hakre - Bună întrebare! Când am început să scriu plugin-ul, mi-am imaginat că va colecta informații despre hook-uri pe mai multe încărcări de pagină. După ce am terminat implementarea, am realizat că ar fi mai util să fac asta doar pentru fiecare încărcare de pagină, dar deja aveam setat să scrie într-o tabelă de baze de date. Am luat în considerare schimbarea, dar m-am gândit că ar putea consuma prea multă memorie (probabil nu o preocupare validă, dar oricum...) Deci da, în memorie ar fi o alternativă și probabil o metodă preferată. Vrei să faci actualizarea pentru mine? WA este despre participare pozitivă! :-)

@drtanz - Nu are legătură cu front-end vs. administrare. Ar trebui să funcționeze la încărcarea oricărei pagini.

Ca un mic indiciu. Plugin-ul Debug Objects are lista tuturor hook-urilor și hook-urile paginii curente ca funcționalitate.

Pluginul Debug Bar Action Hooks
Afisează o listă cu acțiunile declanșate pentru cererea curentă. Necesită pluginul debug bar.

Există și Debug Bar Actions and Filters Addon și Debug Bar Hook Log.

Codex-ul are o Referință de Acțiuni și o Referință de Filtre. Adam Brown a creat o bază de date de hook-uri care conține toate hook-urile din codul sursă și adaugă documentația din paginile wiki, informații despre versiuni și link-uri către codul sursă. Puteți îmbunătăți această bază de date prin scrierea de documentație în Codex.
Desigur, unele hook-uri sunt dinamice, în funcție de alte date. Luați ca exemplu funcția 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);
}
Dacă înregistrați un tip de postare personalizat event
și o stare personalizată a postării cancelled
, veți avea un hook de acțiune cancelled_event
.

Deși primitiv, poate că acest cod de plugin poate ajuta? Înlocuiește "add_action" cu "add_filter" dacă vrei să analizezi filtrele în loc de acțiuni. Încarcă plugin-ul și apoi reîmprospătează pagina de start a site-ului. Odată încărcat, este foarte dificil să-l dezactivezi, așa că pur și simplu redenumește fișierul plugin-ului din directorul de plugin-uri și reîmprospătează din nou site-ul - se va dezactiva automat. Am folosit acest truc de multe ori pentru a depana probleme sau pentru a găsi un loc unde pot insera ceva.
<?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;
}

Folosesc acest lucru pentru a găsi ordinea hook-urilor. Pentru a obține filters
schimbă add_action
în 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');

După cum sugerează @kaiser, nu postați doar link-uri, îmbunătățesc postarea. Dar nu este posibil să folosiți întregul cod aici, așa că folosesc câteva imagini pentru a explica că există o listă completă de hook-uri WordPress cu descrierea fiecăruia. Puteți găsi aici pentru hook-uri, clase, funcții, plugin-uri,
pentru a descrie fiecare

Poți folosi simplu un plugin de monitorizare a interogărilor: https://wordpress.org/plugins/query-monitor/
