จะทราบได้อย่างไรว่าฟังก์ชั่นใดบ้างที่เชื่อมโยงกับแอ็คชั่น / ตัวกรอง


32

มีวิธีที่จะรู้ว่าฟังก์ชั่นใดบ้างที่เกี่ยวกับเบ็ดนั้น ตัวอย่างเช่นหากฉันต้องการทราบว่าฟังก์ชั่นใดบ้างที่wp_headเกี่ยวกับตะขอ


ผมค่อนข้างมั่นใจว่าเรื่องนี้ไม่สิ่งที่คุณต้องการ: @ Rarst ของ Debug WordPress hooks
anu

ลองดูที่คำตอบสำหรับคำถามที่คล้ายกันนี้และโดยเฉพาะอย่างยิ่งปลั๊กอินที่โพสต์ไว้ที่นั่นโดยไมค์
Bainternet

1
ฉันอาจจะผิด แต่นั่นไม่เพียงทำให้รายการเบ็ดที่ครอบคลุม? วิธีที่ฉันอ่านคำถามคือเขาต้องการทราบว่าฟังก์ชั่นใดบ้างที่ติดอยู่กับตะขอ
anu

ผิดบางส่วนเขาพูดว่า "ตัวอย่างเช่นสิ่งที่ติดกับ wp_head" ดังนั้นรายการทั้งหมดไม่เพียงเบ็ดเดียว
Bainternet

แน่นอนฉันต้องการดูว่าฟังก์ชั่นใดบ้างที่ติดอยู่กับตะขอบางอันเช่นถ้าฟังก์ชั่นทั้ง 10 ฟังก์ชั่นถูกเชื่อมต่อไปwp_headแล้วฉันต้องการแสดงรายการที่ 10
Javier Villanueva

คำตอบ:


16

$wp_filterมองเข้าไปในตัวแปรโลก ดูปลั๊กอินของฉันสำหรับรายการตัวกรองความคิดเห็นทั้งหมดสำหรับตัวอย่าง:

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

ตัวอย่างผลลัพธ์สำหรับ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 ขอบคุณที่แบ่งปันสิ่งนี้ ฉันใช้มันเพื่อประเมิน hooks การกระทำทั้งหมดที่โหลดสำหรับชุดรูปแบบที่การดำเนินการปิดระบบ
Kevin Leary

11

เพื่อดูรายการฟังก์ชั่นหรือการกระทำที่ติดกับตะขอการกระทำเฉพาะคุณสามารถใช้รหัสต่อไปนี้

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

5

สำหรับวัตถุประสงค์ในการแก้ไขข้อบกพร่องง่าย ๆ

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

จะทำมัน ...


1
ในกรณีของฉันการโทรvar_dump($wp_filter)ออกเอาต์พุตมากเกินไป var_dump($wp_filter["<action name>"])ฉันต้องการใช้ (เหมือนกันสำหรับprint_r- ฉันชอบ var_dump.)
Acsor

4

รายการนี้แสดงรายการตัวกรองที่สามารถอ่านได้มากขึ้น

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

ฉันพบคำตอบจาก @ user3623530 มีประโยชน์ แต่ไม่ได้คำนึงถึงความจริงที่ว่าบางครั้งการปิดสามารถเชื่อมโยงได้ นี่คือเวอร์ชั่น verbose (และน่าเกลียด) ของฉัน:

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.