Cum poți afla ce funcții sunt atașate la o acțiune/filtru?

16 mai 2011, 17:16:20
Vizualizări: 43.4K
Voturi: 40

Există vreo modalitate de a afla ce funcții sunt atașate la un anumit hook? De exemplu, dacă aș dori să știu ce funcții sunt atașate la hook-ul wp_head.

8
Comentarii

aruncă o privire la acest răspuns la o întrebare similară și mai exact la plugin-ul postat acolo de mike.

Bainternet Bainternet
16 mai 2011 17:26:46

Aș putea greși, dar acesta nu produce doar o listă cuprinzătoare de hook-uri? Modul în care înțeleg eu întrebarea este că vrea să știe ce funcții sunt atașate la hook.

anu anu
16 mai 2011 17:37:56

Parțial greșit, el a spus "de exemplu ce este conectat la wp_head", deci este o listă completă nu doar un singur hook.

Bainternet Bainternet
16 mai 2011 18:21:14

Într-adevăr, am vrut să văd ce funcții sunt atașate unui anumit hook, de exemplu dacă 10 funcții sunt conectate la wp_head, atunci aș vrea să le listez pe cele 10.

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

acel plugin va lista toate funcțiile care sunt conectate împreună cu hook-ul lor.

Bainternet Bainternet
16 mai 2011 19:52:17

Sunt destul de sigur că acesta face ceea ce doriți: @Rarst's Debug WordPress hooks

anu anu
16 mai 2011 17:23:06

tocmai am dat peste acest plugin care este destul de grozav pentru asta https://wordpress.org/plugins/simply-show-hooks/

Bryan Willis Bryan Willis
14 ian. 2016 09:24:33

Pentru a contribui - în această privință, nu este foarte prietenos să folosești informațiile colectate despre hook-uri, și mai ales nu pe 'wp_head'. Cea mai apropiată metodă corectă (explicată) este fragmentul de cod:

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

găsit la: https://stackoverflow.com/a/26680808/2445357

Acesta funcționează din 2018 și a fost minunat pentru acest gen de soluții. Vei găsi hook-uri din plugin-uri, clase și obiecte imbricate și le poți număra pe toate! Sau poți lista cu ușurință unde se află funcțiile etc.

Jonas Lundman Jonas Lundman
9 iun. 2018 17:34:18
Arată celelalte 3 comentarii
Toate răspunsurile la întrebare 5
0
23

pentru a vedea lista de funcții sau acțiuni atașate la un anumit hook de acțiune, puteți utiliza următorul cod.

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

Uită-te la variabila globală $wp_filter. Vezi pluginul meu pentru o listă cu toate filtrele de comentarii ca exemplu:

<?php
/*
Plugin Name: Lista Filtrelor de Comentarii
Description: Listează toate filtrele de comentarii pe 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>Filtrele Curent de Comentarii</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";
}

Exemplu de ieșire pentru 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 mai 2011 17:22:27
0

Aceasta afișează o listă mai lizibilă de filtre

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

Pentru scopuri de depanare, un simplu

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

ar fi suficient ...

9 dec. 2015 16:20:30
Comentarii

În cazul meu, apelarea var_dump($wp_filter) a generat prea multă ieșire. Am preferat să folosesc var_dump($wp_filter["<action name>"]). (Același lucru este valabil și pentru print_r - eu personal am preferat var_dump.)

Acsor Acsor
18 iun. 2017 00:42:00
0

Am găsit răspunsul de la @Simone G util, dar nu a luat în considerare faptul că uneori Closures pot fi încărcate (hooked). Iată versiunea mea mai detaliată (și mai puțin elegantă):

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