Woher wissen, welche Funktionen mit einer Aktion / einem Filter verknüpft sind?

32

Gibt es eine Möglichkeit zu wissen, welche Funktionen an einen bestimmten Hook gebunden sind? Zum Beispiel, wenn ich wissen möchte, welche Funktionen am wp_headHook hängen .

Javier Villanueva
quelle
Ich bin mir ziemlich sicher , dass dies tut , was Sie wollen: @ Rarst Debuggen Wordpress Hooks
anu
werfen sie einen blick auf diese antwort auf eine ähnliche frage und genauer gesagt auf das dort von mike gepostete plugin.
Bainternet
1
Ich könnte mich irren, aber ergibt das nicht einfach eine umfassende Liste von Hooks? Die Art und Weise, wie ich die Frage lese, ist, dass er wissen möchte, welche Funktionen mit dem Haken verbunden sind.
Anu
Teilweise falsch, sagte er "zum Beispiel, was mit wp_head verbunden ist", also ist es eine vollständige Liste, nicht nur ein einzelner Hook.
Bainternet
In der Tat wollte ich sehen, welche Funktionen mit einem bestimmten Hook verknüpft sind. Wenn also beispielsweise 10 Funktionen verknüpft sind, wp_headmöchte ich diese 10 auflisten.
Javier Villanueva,

Antworten:

16

Sehen Sie sich die globale Variable an $wp_filter. In meinem Plugin finden Sie eine Liste aller Kommentarfilter für ein Beispiel:

<?php
/*
Plugin Name: List Comment Filters
Description: List all comment filters on wp_footer
Version:     1.1
Author:      Fuxia Scholz
License:     GPL v2
*/

add_action( 'wp_footer', 'list_comment_filters' );

function list_comment_filters()
{
    global $wp_filter;

    $comment_filters = array ();
    $h1  = '<h1>Current Comment Filters</h1>';
    $out = '';
    $toc = '<ul>';

    foreach ( $wp_filter as $key => $val )
    {
        if ( FALSE !== strpos( $key, 'comment' ) )
        {
            $comment_filters[$key][] = var_export( $val, TRUE );
        }
    }

    foreach ( $comment_filters as $name => $arr_vals )
    {
        $out .= "<h2 id=$name>$name</h2><pre>" . implode( "\n\n", $arr_vals ) . '</pre>';
        $toc .= "<li><a href='#$name'>$name</a></li>";
    }

    print "$h1$toc</ul>$out";
}

Beispielausgabe für pre_comment_author_email:

array (
  10 => 
  array (
    'trim' => 
    array (
      'function' => 'trim',
      'accepted_args' => 1,
    ),
    'sanitize_email' => 
    array (
      'function' => 'sanitize_email',
      'accepted_args' => 1,
    ),
    'wp_filter_kses' => 
    array (
      'function' => 'wp_filter_kses',
      'accepted_args' => 1,
    ),
  ),
)
fuxia
quelle
Tolle kleine Funktion toscho, danke, dass du das geteilt hast. Ich verwende es, um alle Aktions-Hooks auszuwerten, die für ein Thema bei der Aktion zum Herunterfahren geladen wurden.
Kevin Leary
11

Mit dem folgenden Code können Sie eine Liste der Funktionen oder Aktionen anzeigen, die mit einem bestimmten Aktionshook verknüpft sind.

global $wp_filter;
echo '<pre>';
var_dump( $wp_filter['wp_head'] );
echo '</pre>';
Aamer Shahzad
quelle
5

Für Debug-Zwecke eine einfache

global $wp_filter;
echo "<pre>" . print_r($wp_filter, true) . "</pre>";

würde es tun ...

Martin von WP-Stars.com
quelle
1
In meinem Fall hat das Aufrufen var_dump($wp_filter)zu viel Ausgabe erzeugt. Ich habe es vorgezogen var_dump($wp_filter["<action name>"]). (Gleiches gilt für print_r- ich persönlich bevorzuge var_dump.)
Acsor
4

Dies zeigt eine besser lesbare Liste von Filtern

function print_filters_for( $hook = '' ) {
    global $wp_filter;
    if( empty( $hook ) || !isset( $wp_filter[$hook] ) ) return;

    $ret='';
    foreach($wp_filter[$hook] as $priority => $realhook){
        foreach($realhook as $hook_k => $hook_v){
            $hook_echo=(is_array($hook_v['function'])?get_class($hook_v['function'][0]).':'.$hook_v['function'][1]:$hook_v['function']);
            $ret.=  "\n$priority $hook_echo";
        }

    }
     return $ret;
}
Simone G
quelle
0

Ich fand die Antwort von @ user3623530 nützlich, berücksichtigte aber nicht die Tatsache, dass manchmal Closures angehängt werden können. Hier ist meine ausführlichere (und hässlichere) Version:

if( isset($wp_filter[$filterName]) ){
    foreach( $wp_filter[$filterName] as $priority => $hooks){
        foreach ($hooks as $hook_k => $hook_v) {
            $hook_echo=(is_array($hook_v['function'])?get_class($hook_v['function'][0]).':'.$hook_v['function'][1]:$hook_v['function']);
            if(is_object($hook_echo) && ($hook_echo instanceof Closure)){
                $hook_echo="closure";
            }
            error_log($filterName." HOOKED (".serialize($priority)."): ".serialize($hook_k)."".serialize($hook_echo));
        }
    }
} else {
    error_log($filterName." NO FILTERS HOOKED");
}
Derwent
quelle