Bagaimana cara mengetahui fungsi apa yang terhubung ke action / filter?

32

Apakah ada cara untuk mengetahui fungsi apa yang dihubungkan ke hook tertentu? Sebagai contoh jika saya ingin tahu fungsi apa yang dikaitkan ke wp_headhook.

Javier Villanueva
sumber
Saya cukup yakin bahwa ini sesuai keinginan Anda: @Rarst's Debug WordPress hooks
anu
lihat jawaban ini untuk pertanyaan serupa dan lebih khusus plugin yang diposting di sana oleh mike.
Bainternet
1
Saya bisa saja salah, tetapi bukankah itu hanya menghasilkan daftar kait yang komprehensif? Cara saya membaca pertanyaan adalah dia ingin tahu fungsi apa yang melekat pada hook.
anu
Sebagian salah, ia berkata "misalnya apa yang terhubung ke wp_head", jadi daftar lengkapnya tidak hanya satu kait.
Bainternet
Memang, saya ingin melihat fungsi apa yang dilampirkan ke pengait tertentu, jadi misalnya jika 10 fungsi terhubung ke wp_headmaka saya ingin mendaftar 10.
Javier Villanueva

Jawaban:

16

Lihatlah variabel global $wp_filter. Lihat plugin saya untuk daftar semua filter komentar untuk contoh:

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

Output sampel untuk 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
sumber
Fungsi kecil yang hebat toscho, terima kasih telah berbagi ini. Saya menggunakannya untuk mengevaluasi semua kait tindakan yang dimuat untuk sebuah tema pada aksi penutupan.
Kevin Leary
11

untuk melihat daftar fungsi atau tindakan yang dikaitkan dengan tindakan tertentu, Anda dapat menggunakan kode berikut.

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

Untuk tujuan debug sederhana

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

akan melakukannya ...

Martin dari WP-Stars.com
sumber
1
Dalam kasus saya, panggilan var_dump($wp_filter)menghasilkan output terlalu banyak. Saya lebih suka menggunakan var_dump($wp_filter["<action name>"]). (Sama berlaku untuk print_r- Saya pribadi lebih suka var_dump.)
Acsor
4

Ini menunjukkan daftar filter yang lebih mudah dibaca

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
sumber
0

Saya menemukan jawaban dari @ user3623530 bermanfaat, tetapi tidak memperhitungkan fakta bahwa kadang-kadang Penutupan dapat dikaitkan. Ini versi verbose (dan jelek) saya yang lebih banyak:

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
sumber