it-swarm.dev

Wo finde ich eine Liste der WordPress-Hooks?

Wo finde ich eine Liste aller WordPress-Hooks und überschreibbaren Funktionen (pluggable, scriptable, etc)?

Edit: Plugin ist hier aufgelistet .

46
Arlen Beiler

@Arlen: Wie Keith S betont Adam Browns Hook-Liste ist 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 veranlasste mich, ein Plugin mit dem Namen "Instrument Hooks for WordPress" zu schreiben. Sie finden denvollständige Quelle untenScreenshot und können ihn auch von Gist herunterladen hier.

Hier ist ein Screenshot davon, wie die Instrumentierung aussieht:

Screenshot of Instrument Hooks for WordPress Plugin in action

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

http://example.com?instrument=hooks

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

<?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;
        }
    }
}
44
MikeSchinkel

Debug Bar Action Hooks Plugin

Zeigt eine Liste der Aktionen an, die für die aktuelle Anforderung ausgelöst wurden. Benötigt das Debug Bar Plugin.

  

4
sam

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

Natürlich sind einige Hooks abhängig von anderen Daten dynamisch. Nimm die wp_transition_post_status Funktion:

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 event und einen benutzerdefinierten Beitragsstatus cancelled registrieren, verfügen Sie über einen Aktions-Hook cancelled_event.

2
Jan Fabry

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 die Deaktivierung 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;
}
1
Volomike

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 erklären, wie es eine vollständige Liste für WordPress-Hooks gibt, die jeweils beschreiben. Sie finden es hier für Hooks , Klassen , Funktionen , Pluginsenter image description here

zu beschreiben enter image description here

0
sohan

Ich benutze dies, um die Reihenfolge der Haken zu finden. Um die filters zu erhalten, ändern Sie einfach 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');
0
Wadde