Unde pot găsi o listă cu toate hook-urile WordPress?

13 aug. 2010, 18:15:29
Vizualizări: 19.3K
Voturi: 52

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.

2
Comentarii

Acesta este site-ul meu preferat când caut informații despre hook-uri... Baza de date WordPress Hooks

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

WordPress a documentat în sfârșit toate hook-urile sale. :D Poți naviga și căuta acolo.

sam sam
21 nov. 2014 02:05:32
Toate răspunsurile la întrebare 7
9
47

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

Captură de ecran a Plugin-ului Instrument Hooks for WordPress în acțiune

Porniți instrumentarea folosind parametrul URL instrument=hooks, adică:

http://example.com?instrument=hooks

Ș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;
        }
    }
}
14 aug. 2010 05:09:54
Comentarii

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

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

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 Amit
14 aug. 2010 16:10:59

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

MikeSchinkel MikeSchinkel
15 aug. 2010 01:44:49

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

Arlen Beiler Arlen Beiler
16 aug. 2010 16:15:44

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

hakre hakre
18 aug. 2010 11:31:03

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

MikeSchinkel MikeSchinkel
18 aug. 2010 18:24:21

Poate fi folosit în partea de administrare?

urok93 urok93
21 aug. 2012 12:38:38

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

MikeSchinkel MikeSchinkel
21 aug. 2012 22:48:56

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

bueltge bueltge
8 iul. 2015 13:33:50
Arată celelalte 4 comentarii
1

Pluginul Debug Bar Action Hooks

Afisează o listă cu acțiunile declanșate pentru cererea curentă. Necesită pluginul debug bar.

Interfața pluginului Debug Bar Action Hooks care afișează acțiunile WordPress

22 mai 2012 23:52:41
Comentarii

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

Synetech Synetech
28 iul. 2013 20:24:27
2

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.

13 aug. 2010 18:29:18
Comentarii

Baza de date a lui Adam Brown nu este doar o combinație a acelor două pagini, ci conține listate fiecare acțiune și filtru din WordPress. Sau nu la asta te-ai referit.

Arlen Beiler Arlen Beiler
13 aug. 2010 21:25:58

@Arlen: Exact așa, am rescris-o pentru a fi mai clară.

Jan Fabry Jan Fabry
13 aug. 2010 21:56:34
1

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;
}
18 aug. 2010 23:34:31
Comentarii

Poate nu este cel mai elegant mod, dar în unele scenarii ar putea fi de fapt cea mai rapidă și simplă soluție (adesea folosesc „depanarea prin printf” pentru a repara lucruri minore în proiecte mici, fără IDE, doar cu Notepad și linia de comandă).

Synetech Synetech
28 iul. 2013 20:02:37
0

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');
29 iul. 2014 11:37:07
0

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, descrierea imaginii aici

pentru a descrie fiecare descrierea imaginii aici

4 iun. 2015 13:09:40
0

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

Interfața plugin-ului Query Monitor pentru WordPress

12 aug. 2019 08:54:00