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.


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

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>';

5

À des fins de débogage un simple

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

le ferait ...


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

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");
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.