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

16 mag 2011, 17:16:20
Visualizzazioni: 43.4K
Voti: 40

Esiste un modo per sapere quali funzioni sono agganciate a un particolare hook? Per esempio, se volessi sapere quali funzioni sono agganciate all'hook wp_head.

8
Commenti

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

Bainternet Bainternet
16 mag 2011 17:26:46

Potrei sbagliarmi, ma questo non produce semplicemente un elenco completo di hook? Dal modo in cui interpreto la domanda, lui vuole sapere quali funzioni sono collegate all'hook.

anu anu
16 mag 2011 17:37:56

Parzialmente sbagliato, ha detto "ad esempio cosa c'è collegato a wp_head", quindi è una lista completa non solo un singolo hook.

Bainternet Bainternet
16 mag 2011 18:21:14

In effetti, volevo vedere quali funzioni sono collegate a un particolare hook, quindi per esempio se 10 funzioni sono agganciate a wp_head allora vorrei elencare quelle 10.

Javier Villanueva Javier Villanueva
16 mag 2011 19:13:18

beh quel plugin elencherà tutte le funzioni che sono collegate con il loro hook.

Bainternet Bainternet
16 mag 2011 19:52:17

sono abbastanza sicuro che questo faccia quello che vuoi: @Rarst's Debug WordPress hooks

anu anu
16 mag 2011 17:23:06

mi sono appena imbattuto in questo plugin che è davvero ottimo per questo https://wordpress.org/plugins/simply-show-hooks/

Bryan Willis Bryan Willis
14 gen 2016 09:24:33

Per contribuire - in questo caso, non è molto user-friendly utilizzare le informazioni sugli hook raccolte, specialmente non su 'wp_head'. Il modo più corretto e spiegato è lo snippet:

function list_hooks($hook = '') ...

trovato su: https://stackoverflow.com/a/26680808/2445357

Funziona dal 2018 ed è stato fantastico per questo tipo di soluzioni. Troverai hook da plugin, classi e oggetti annidati e li conterai tutti! O semplicemente elencherai dove risiedono le funzioni ecc. ecc.

Jonas Lundman Jonas Lundman
9 giu 2018 17:34:18
Mostra i restanti 3 commenti
Tutte le risposte alla domanda 5
0
23

Per visualizzare l'elenco delle funzioni o azioni collegate a un particolare action hook puoi utilizzare il seguente codice.

global $wp_filter;
echo '<pre>';
var_dump( $wp_filter['wp_head'] );
echo '</pre>';
3 feb 2016 20:07:41
0
19

Esamina la variabile globale $wp_filter. Guarda il mio plugin per una lista di tutti i filtri dei commenti come esempio:

<?php
/*
Plugin Name: List Comment Filters
Description: Elenca tutti i filtri dei commenti su 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>Filtri dei Commenti Correnti</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,
    ),
  ),
)
16 mag 2011 17:22:27
0

Questo mostra un elenco più leggibile dei 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;
}
15 apr 2016 04:28:55
1

Per scopi di debug un semplice

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

sarebbe sufficiente...

9 dic 2015 16:20:30
Commenti

Nel mio caso, chiamare var_dump($wp_filter) produceva troppo output. Ho preferito usare var_dump($wp_filter["<action name>"]). (Lo stesso vale per print_r - personalmente ho preferito var_dump.)

Acsor Acsor
18 giu 2017 00:42:00
0

Ho trovato utile la risposta di @Simone G, ma non teneva conto del fatto che a volte è possibile agganciare delle Closure. Ecco la mia versione più dettagliata (e meno elegante):

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");
}
21 feb 2017 05:38:43