Come sapere quali funzioni sono collegate a un'azione / filtro?


32

C'è un modo per sapere quali funzioni sono agganciate a un gancio particolare? Ad esempio, se mi piacerebbe sapere quali funzioni sono agganciate al wp_headgancio.


Sono abbastanza sicuro che questo fa ciò che si vuole: @ di Rarst Debug WordPress aggancia
anu

dai un'occhiata a questa risposta a una domanda simile e più specificamente al plugin pubblicato lì da Mike.
Bainternet,

1
Potrei sbagliarmi, ma questo non produce solo un elenco completo di hook? Il modo in cui sto leggendo la domanda è che vuole sapere quali funzioni sono associate all'hook.
anu,

Parzialmente sbagliato, ha detto "per esempio cosa è collegato a wp_head", quindi è un elenco completo non solo di un singolo hook.
Bainternet,

In effetti, volevo vedere quali funzioni sono associate a un hook particolare, quindi ad esempio se sono collegate 10 funzioni, wp_headvorrei elencarle 10.
Javier Villanueva

Risposte:


16

Guarda la variabile globale $wp_filter. Vedi il mio plugin per un elenco di tutti i filtri di commento per un esempio:

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

Esempio di output per 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,
    ),
  ),
)

Grande piccola funzione toscho, grazie per averlo condiviso. Lo sto usando per valutare tutti gli hook di azione caricati per un tema all'azione di arresto.
Kevin Leary,

11

per visualizzare un elenco di funzioni o azioni collegate a un particolare hook di azioni è possibile utilizzare il codice seguente.

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

5

A scopo di debug un semplice

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

lo farebbe ...


1
Nel mio caso, la chiamata ha var_dump($wp_filter)prodotto un output eccessivo. Ho preferito usare var_dump($wp_filter["<action name>"]). (Lo stesso vale per print_r- ho preferito personalmente var_dump.)
Acsor il

4

Questo mostra un elenco più leggibile di filtri

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

Ho trovato utile la risposta di @ user3623530, ma non ho tenuto conto del fatto che a volte le chiusure possono essere agganciate. Ecco la mia versione più dettagliata (e brutta):

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");
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.