액션 / 필터에 어떤 기능이 연결되어 있는지 확인하는 방법


32

어떤 기능이 특정 후크에 연결되어 있는지 알 수있는 방법이 있습니까? 예를 들어 어떤 기능이 후크에 연결되어 있는지 알고 싶습니다 wp_head.


나는 이것이 당신이 원하는 것을 확신합니다 : @ Rarst 's Debug WordPress hooks
anu

비슷한 질문에 대한 이 답변 을 보고 더 구체적으로 mike가 게시 한 플러그인을 살펴보십시오 .
Bainternet

1
나는 틀릴 수는 있지만 포괄적 인 후크 목록을 생성하지는 않습니까? 내가 질문을 읽는 방식은 후크에 어떤 기능이 첨부되어 있는지 알고 싶어한다는 것입니다.
anu

부분적으로 틀린 그는 "예를 들어 wp_head에 연결된 것"이라고 말 했으므로 단일 후크뿐만 아니라 전체 목록이 있습니다.
Bainternet

실제로, 나는 어떤 함수가 특정 후크에 연결되어 있는지 확인하고 싶었습니다. 예를 들어 10 개의 함수가 연결되어 있다면 10 개 wp_head를 나열하고 싶습니다.
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, 이것을 공유해 주셔서 감사합니다. 종료 작업에서 테마에로드 된 모든 작업 후크를 평가하는 데 사용하고 있습니다.
케빈 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의 답변이 유용하다는 것을 알았지 만 때로는 클로저가 연결될 수 있다는 사실을 고려하지 않았습니다. 여기에 더 장황하고 추악한 버전이 있습니다.

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.