Comment savoir quelles fonctions sont liées à une action / un filtre?

32

Existe-t-il un moyen de savoir quelles fonctions sont rattachées à un crochet particulier? Par exemple, si vous souhaitez savoir quelles fonctions sont rattachées au wp_headcrochet.

Javier Villanueva
la source
Je suis sûr que cela fait ce que vous voulez: @ Debug WordPress Rarst crochets
anu
jetez un oeil à cette réponse à une question similaire et plus précisément au plugin posté ici par Mike.
Bainternet
1
Je peux me tromper, mais cela ne donne-t-il pas seulement une liste complète de crochets? La façon dont je lis la question est la suivante: il veut savoir quelles fonctions sont rattachées au crochet.
Anu
Partiellement faux, il a dit "par exemple ce qui est lié à wp_head", donc c'est une liste complète et pas seulement un simple crochet.
Bainternet
En effet, je voulais voir quelles fonctions sont attachées à un crochet particulier, alors si par exemple si 10 fonctions sont accrochées, wp_headj'aimerais énumérer ces 10.
Javier Villanueva,

Réponses:

16

Regardez dans la variable globale $wp_filter. Voir mon plugin pour une liste de tous les filtres de commentaires pour un exemple:

<?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";
}

Exemple de sortie pour 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
la source
Super petite fonction toscho, merci de partager cela. Je l'utilise pour évaluer tous les crochets d'action chargés pour un thème lors de l'action d'arrêt.
Kevin Leary
11

Pour voir la liste des fonctions ou des actions rattachées à un crochet d’action particulier, vous pouvez utiliser le code suivant.

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

À des fins de débogage un simple

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

le ferait ...

Martin de WP-Stars.com
la source
1
Dans mon cas, l'appel var_dump($wp_filter)produisait trop de sortie. J'ai préféré utiliser var_dump($wp_filter["<action name>"]). (Idem pour print_r- j'ai personnellement préféré var_dump.)
Acsor
4

Cela montre une liste plus lisible de filtres

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
la source
0

J'ai trouvé la réponse de @ user3623530 utile, mais elle n'a pas tenu compte du fait que parfois, les fermetures peuvent être accrochées. Voici ma version plus verbeuse (et laide):

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
la source