development

워드 프레스 : 'the_content'필터에 등록 된 모든 기능을 가져 오는 방법

big-blog 2021. 1. 5. 21:04
반응형

워드 프레스 : 'the_content'필터에 등록 된 모든 기능을 가져 오는 방법


WordPress, 특히 버전 3.0 이상에 대한 질문이 있습니다.

누구든지 the_content 필터에 적용되거나 '등록'되는 모든 함수의 배열 또는 목록을 얻는 방법을 알고 있습니까?

아이디어는 wpautop와 같이 필터에서 제거 할 수있는 기능의 확인란 목록을 생성하는 것입니다. 하드 코딩 된 레이블로 필터에서 함수를 제거하는 방법을 알고 있지만보다 동적 인 솔루션을 만들고 싶습니다.

이것이 가능하고 어떻게 할 수 있는지 누구든지 아이디어가 있다면 나는 매우 관심이있을 것입니다. 감사.


필터 배열에서 인쇄하는 간단한 기능?

function print_filters_for( $hook = '' ) {
    global $wp_filter;
    if( empty( $hook ) || !isset( $wp_filter[$hook] ) )
        return;

    print '<pre>';
    print_r( $wp_filter[$hook] );
    print '</pre>';
}

필요한 곳에 전화하십시오.

print_filters_for( 'the_content' );

이것은 $wp_filter배열의 데이터 외에도 후크가 연결된 파일의 경로와 함수가 정의 된 코드의 행을 표시 하는 좀 더 고급 예제 입니다.

특정 작업 (또는 필터)에 연결된 함수의 기본 목록을 얻으려면 필터 배열에서 항목을 가져 오는 것으로 충분하지만 함수는 다양한 방법 (클래스 메서드 또는 클로저)으로 첨부 될 수 있으므로 해당 목록에는 문자열로 표시되는 객체를 포함하는 수많은 비정상적인 데이터. 이 예는 우선 순위에 따라 관련 데이터 만 표시합니다.

  • 함수 이름 (콜백 구문에 따라 다름) :
    • 함수 콜백 : 'function_name'
    • 개체 방법 : array( $object, 'function_name' )
    • 정적 클래스 메서드 : array( 'class_name', 'function_name' )'class_name::function_name'
    • 폐쇄: function() {}
    • 상대 정적 클래스 메서드 : array( 'class_name', 'parent::function_name' )
  • 허용되는 인수
  • 파일 이름
  • 출발 선
  • 신분증
  • 우선 순위

function list_hooks( $hook = '' ) {
    global $wp_filter;

    if ( isset( $wp_filter[$hook]->callbacks ) ) {      
        array_walk( $wp_filter[$hook]->callbacks, function( $callbacks, $priority ) use ( &$hooks ) {           
            foreach ( $callbacks as $id => $callback )
                $hooks[] = array_merge( [ 'id' => $id, 'priority' => $priority ], $callback );
        });         
    } else {
        return [];
    }

    foreach( $hooks as &$item ) {
        // skip if callback does not exist
        if ( !is_callable( $item['function'] ) ) continue;

        // function name as string or static class method eg. 'Foo::Bar'
        if ( is_string( $item['function'] ) ) {
            $ref = strpos( $item['function'], '::' ) ? new ReflectionClass( strstr( $item['function'], '::', true ) ) : new ReflectionFunction( $item['function'] );
            $item['file'] = $ref->getFileName();
            $item['line'] = get_class( $ref ) == 'ReflectionFunction' 
                ? $ref->getStartLine() 
                : $ref->getMethod( substr( $item['function'], strpos( $item['function'], '::' ) + 2 ) )->getStartLine();

        // array( object, method ), array( string object, method ), array( string object, string 'parent::method' )
        } elseif ( is_array( $item['function'] ) ) {

            $ref = new ReflectionClass( $item['function'][0] );

            // $item['function'][0] is a reference to existing object
            $item['function'] = array(
                is_object( $item['function'][0] ) ? get_class( $item['function'][0] ) : $item['function'][0],
                $item['function'][1]
            );
            $item['file'] = $ref->getFileName();
            $item['line'] = strpos( $item['function'][1], '::' )
                ? $ref->getParentClass()->getMethod( substr( $item['function'][1], strpos( $item['function'][1], '::' ) + 2 ) )->getStartLine()
                : $ref->getMethod( $item['function'][1] )->getStartLine();

        // closures
        } elseif ( is_callable( $item['function'] ) ) {     
            $ref = new ReflectionFunction( $item['function'] );         
            $item['function'] = get_class( $item['function'] );
            $item['file'] = $ref->getFileName();
            $item['line'] = $ref->getStartLine();

        }       
    }

    return $hooks;
}

Since hooks can be added and removed throughout the entire runtime, the output depends on at what point the function is called ( wp_footer action is a good place to get the complete list )

print_r example for the_content filter:

Array
(
    [0] => Array
        (
            [id] => 000000004c8a4a660000000011808a14run_shortcode
            [priority] => 8
            [function] => Array
                (
                    [0] => WP_Embed
                    [1] => run_shortcode
                )

            [accepted_args] => 1
            [file] => C:\xampp\htdocs\wordpress\wp-includes\class-wp-embed.php
            [line] => 58
        )

    [1] => Array
        (
            [id] => wptexturize
            [priority] => 10
            [function] => wptexturize
            [accepted_args] => 1
            [file] => C:\xampp\htdocs\wordpress\wp-includes\formatting.php
            [line] => 41
        )

    [2] => Array
        (
            [id] => 0000000006c5dc6d0000000064b1bc8e
            [priority] => 10
            [function] => Closure
            [accepted_args] => 1
            [file] => C:\xampp\htdocs\wordpress\wp-content\plugins\plugin\plugin.php
            [line] => 16
        )

    .....

Edit: 2017-05-05

  • adapted for WP_Hook class
  • added priority
  • fixed: error raised if callback does not exists, although WordPress also raises a warning for that
  • fixed: hook with the same id but different priority overwrites the previous one

ReferenceURL : https://stackoverflow.com/questions/5224209/wordpress-how-do-i-get-all-the-registered-functions-for-the-content-filter

반응형