Làm thế nào để biết chức năng nào được nối với một hành động / bộ lọc?


32

Có cách nào để biết những chức năng nào được nối với một hook cụ thể không? Ví dụ: nếu tôi muốn biết những chức năng nào được nối với wp_headhook.


Tôi khá chắc chắn rằng điều này thực hiện những gì bạn muốn: @ Rarst's Debug WordPress hook
anu

hãy xem câu trả lời này cho một câu hỏi tương tự và cụ thể hơn là plugin được đăng bởi mike.
Bai Internet

1
Tôi có thể sai, nhưng không phải nó chỉ tạo ra một danh sách toàn diện về móc sao? Cách tôi đọc câu hỏi là anh ta muốn biết những chức năng nào được gắn vào móc.
anu

Một phần sai, anh ta nói "ví dụ những gì được nối với wp_head", vì vậy đây là một danh sách đầy đủ không chỉ là một hook.
Bai Internet

Thật vậy, tôi muốn xem những chức năng nào được gắn vào một cái móc cụ thể, vì vậy, ví dụ nếu 10 chức năng được nối vào wp_headthì tôi muốn liệt kê những cái đó 10.
Javier Villanueva

Câu trả lời:


16

Nhìn vào biến toàn cầu $wp_filter. Xem plugin của tôi để biết danh sách tất cả các bộ lọc nhận xét cho một ví dụ:

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

Đầu ra mẫu cho 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,
    ),
  ),
)

Toscho chức năng nhỏ tuyệt vời, cảm ơn vì đã chia sẻ điều này. Tôi đang sử dụng nó để đánh giá tất cả các hook hành động được tải cho một chủ đề tại hành động tắt máy.
Kevin Leary

11

để xem danh sách các hàm hoặc hành động được nối với một hook hành động cụ thể, bạn có thể sử dụng đoạn mã sau.

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

5

Đối với mục đích gỡ lỗi đơn giản

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

sẽ làm điều đó ...


1
Trong trường hợp của tôi, gọi var_dump($wp_filter)sản xuất quá nhiều đầu ra. Tôi thích sử dụng var_dump($wp_filter["<action name>"]). (Tương tự như vậy print_r- Cá nhân tôi thích var_dump hơn.)
Acsor

4

Điều này cho thấy một danh sách các bộ lọc dễ đọc hơn

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

Tôi thấy câu trả lời từ @ user3623530 rất hữu ích, nhưng nó không tính đến thực tế là đôi khi Đóng có thể được nối. Đây là phiên bản dài hơn (và xấu xí) của tôi:

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");
}
Licensed under cc by-sa 3.0 with attribution required.