Wo finde ich eine Liste der WordPress-Hooks?

Antworten:

45

@Arlen: Wie Keith S betont, ist Adam Browns Hook -Liste die defakte Ressource für Hooks für WordPress. Es ist jedoch nicht perfekt:

  • Die Hooks werden nicht in der Reihenfolge ihres Aufrufs angezeigt.
  • Es gibt weder Dateinamen noch Zeilennummer an, wo es aufgerufen wurde.
  • Es werden keine Argumente übergeben,
  • Es ist keine vollständige Liste, da einige Hooks dynamisch aufgerufen werden können.
  • Und es werden keine Hooks von Plugins angezeigt.

Obwohl Adams Liste eine großartige Ressource ist, um insbesondere zu verstehen, wann Hooks historisch hinzugefügt wurden, ist sie bei weitem nicht so nützlich, als ob Sie die Hooks auf einer bestimmten Seite Ihrer eigenen Site instrumentieren könnten.

Ich habe eine Weile mit dieser Idee gespielt, und Ihre Frage hat mich dazu veranlasst, ein Plugin namens " Instrument Hooks for WordPress " zu schreiben . Die vollständige Quelle finden Sie unterhalb des Screenshots. Sie können sie auch von gist hier herunterladen .

Hier ist ein Screenshot davon, wie die Instrumentierung aussieht:

Screenshot von Instrument Hooks für das WordPress Plugin in Aktion

Sie lösen die Instrumentierung mit dem URL-Parameter aus instrument=hooks, dh:

http://example.com?instrument=hooks

Und wie versprochen, hier ist die Quelle (oder laden Sie sie hier herunter .):

<?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;
        }
    }
}
MikeSchinkel
quelle
Ich würde ... es ist eines dieser Dinge, die Sie möglicherweise nur ein- oder zweimal verwenden, aber wenn Sie es verwenden, danken Sie den Sternen dafür :)
Keith S.
1
Mike, das ist sehr cool! Aber was würden Sie empfehlen, um tatsächlich zu verstehen, was jeder Filter / jede Aktion bewirkt? Gibt es eine Datei, in der alle zusammen mit ihrer Aktivität aufgelistet sind? Vielen Dank!
Amit
1
@Amit - Ja, das ist die schwierige Frage. :) Danke für die Frage. Leider sehe ich keine Möglichkeit, dies so zu automatisieren, wie ich es für das Auflisten der oben genannten Hooks getan habe, sodass ich keine perfekte Antwort für Sie habe. Idealerweise würde jemand für jeden Haken einen großartigen Blog-Beitrag schreiben (oder hier eine Frage stellen, die eine großartige Antwort liefert) und dann "Google it" Ihre Antwort sein. Wie es ist, verwende ich eine Debugging-IDE (PhpStorm + XDEBUG, 49 US-Dollar bis September 2010) und setze Haltepunkte und verfolge einfach den ausführenden Code. Es kann jedoch einen besseren Weg geben, und wenn jemand anderes darüber nachgedacht hat, lassen Sie es uns bitte wissen!
MikeSchinkel
Wow, das ist die beste Antwort, die ich je gesehen habe. Hier sowieso.
Arlen Beiler
2
@ Mike: Kurze Frage, warum speicherst du das in der Datenbank anstatt im Speicher oder in einem temporären Stream?
Hakre
2

Der Codex verfügt über eine Aktionsreferenz und eine Filterreferenz . Adam Brown hat eine Hook-Datenbank erstellt , die alle Hooks im Quellcode enthält, und die Dokumentation von den Wiki-Seiten, Versionsinformationen und Links zum Quellcode hinzugefügt. Sie können es verbessern, indem Sie die Dokumentation im Codex schreiben.

Natürlich sind einige Hooks abhängig von anderen Daten dynamisch. Nehmen Sie die wp_transition_post_statusFunktion:

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

Wenn Sie einen benutzerdefinierten Beitragstyp eventund einen benutzerdefinierten Beitragsstatus registrieren cancelled, haben Sie einen cancelled_eventAktions-Hook.

Jan Fabry
quelle
Die Adam Browns-Datenbank ist nicht nur eine Kombination dieser beiden Seiten, sondern es werden alle Aktionen und Filter in WordPress aufgelistet. Oder hast du das nicht gemeint?
Arlen Beiler
@Arlen: Ja in der Tat, ich habe es umgeschrieben, damit es klarer wird.
Jan Fabry
1

Obwohl primitiv, kann dieser Plugin-Code vielleicht helfen? Wechseln Sie "add_action" mit "add_filter", wenn Sie stattdessen Filter betrachten möchten. Laden Sie das Plugin und aktualisieren Sie die Homepage der Site. Nach dem Laden ist das Deaktivieren sehr mühsam. Benennen Sie die Plug-in-Datei einfach im Plug-in-Ordner um und aktualisieren Sie die Site erneut. Sie wird automatisch deaktiviert. Ich habe diesen Trick mehrmals verwendet, um Probleme zu beheben oder einen Ort zu finden, an dem ich etwas einfügen kann.

<?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;
}
Volomike
quelle
Es mag nicht schön sein, aber in manchen Szenarien ist es tatsächlich der schnellste und einfachste Weg (ich verwende oft das "printf-Debugging", um kleine Probleme in kleinen Notepad + -Befehlszeilenprojekten zu beheben, anstatt eine ganze IDE zu verwenden).
Synetech
0

Ich benutze dies, um die Reihenfolge der Haken zu finden. Um das zu bekommen filterswechsle einfach add_actionzu 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');
Wadde
quelle
0

Da @kaiser vorschlägt, nicht nur Links zu posten, verbessere ich es. Es ist jedoch nicht möglich, den gesamten Code hier zu verwenden. Daher verwende ich hier nur wenige Bilder, um zu erläutern, wie es eine vollständige Liste für WordPress-Hooks gibt, die jeweils beschreiben. Sie finden es hier für Hooks , Klassen , Funktionen , Plugins , Bildbeschreibung hier eingeben

zu beschreiben Bildbeschreibung hier eingeben

Sohan
quelle