WordPress 후크 목록은 어디에서 찾을 수 있습니까?


48

모든 WordPress 후크 및 오버라이드 가능 기능 (플러그 가능, 스크립트 가능 등) 목록을 어디에서 찾을 수 있습니까?

편집 : 플러그인이 여기나열됩니다 .


이것은 후크 정보를 찾을 때 내 이동 사이트입니다 ... WordPress Hooks Database
Keith S.

1
워드 프레스는 마침내 모든 후크를 문서화했다 . : D 찾아 보거나 검색 할 수 있습니다.
sam

답변:


45

@Arlen : Keith S가 지적한 것처럼 Adam Brown의 후크 목록은 WordPress에 대한 후크의 사실상의 자원입니다. 그러나 완벽하지는 않습니다.

  • 호출되는 순서대로 후크를 표시하지 않습니다.
  • 호출 된 파일 이름이나 줄 번호는 제공하지 않습니다.
  • 전달 된 많은 인수를 제공하지는 않습니다.
  • 일부 후크는 동적으로 호출 될 수 있기 때문에 전체 목록이 아닙니다.
  • 그리고 플러그인의 후크를 표시하지 않습니다.

따라서 Adam의 목록은 특히 과거에 후크가 추가 된 시점을 이해하는 데 유용한 리소스이지만 사이트의 특정 페이지에서 후크를 계측 할 수있는 것만 큼 유용하지는 않습니다.

나는이 아이디어를 잠시 동안 놀아 왔기 때문에 귀하의 질문으로 인해 " WordPress 용 기기 후크 "라는 플러그인 을 작성하게 되었습니다 . 스크린 샷 아래 에서 전체 소스를 찾을 수 있으며 여기 에서 요점 에서 다운로드 할 수도 있습니다 .

인스 트루먼 테이션의 스크린 샷은 다음과 같습니다.

작동중인 WordPress 플러그인 용 기기 후크의 스크린 샷

URL 매개 변수를 사용하여 인스 트루먼 테이션을 트리거하십시오 instrument=hooks.

http://example.com?instrument=hooks

약속 한대로 여기 소스가 있습니다 (또는 여기에서 다운로드 하십시오 ).

<?php
/*
Plugin Name: Instrument Hooks for WordPress
Description: Instruments Hooks for a Page. Outputs during the Shutdown Hook.
Version: 0.1
Author: Mike Schinkel
Author URI: http://mikeschinkel.com
*/

if ($_GET['instrument']=='hooks') {

    add_action('shutdown','instrument_hooks');
    function instrument_hooks() {
        global $wpdb;
        $hooks = $wpdb->get_results("SELECT * FROM wp_hook_list ORDER BY first_call");
        $html = array();
        $html[] = '<style>#instrumented-hook-list table,#instrumented-hook-list th,#instrumented-hook-list td {border:1px solid gray;padding:2px 5px;}</style>
<div align="center" id="instrumented-hook-list">
    <table>
        <tr>
        <th>First Call</th>
        <th>Hook Name</th>
        <th>Hook Type</th>
        <th>Arg Count</th>
        <th>Called By</th>
        <th>Line #</th>
        <th>File Name</th>
        </tr>';
        foreach($hooks as $hook) {
            $html[] = "<tr>
            <td>{$hook->first_call}</td>
            <td>{$hook->hook_name}</td>
            <td>{$hook->hook_type}</td>
            <td>{$hook->arg_count}</td>
            <td>{$hook->called_by}</td>
            <td>{$hook->line_num}</td>
            <td>{$hook->file_name}</td>
            </tr>";
        }
        $html[] = '</table></div>';
        echo implode("\n",$html);
    }

    add_action('all','record_hook_usage');
    function record_hook_usage($hook){
        global $wpdb;
        static $in_hook = false;
        static $first_call = 1;
        static $doc_root;
        $callstack = debug_backtrace();
        if (!$in_hook) {
            $in_hook = true;
            if ($first_call==1) {
                $doc_root = $_SERVER['DOCUMENT_ROOT'];
                $results = $wpdb->get_results("SHOW TABLE STATUS LIKE 'wp_hook_list'");
                if (count($results)==1) {
                    $wpdb->query("TRUNCATE TABLE wp_hook_list");
                } else {
                    $wpdb->query("CREATE TABLE wp_hook_list (
                    called_by varchar(96) NOT NULL,
                    hook_name varchar(96) NOT NULL,
                    hook_type varchar(15) NOT NULL,
                    first_call int(11) NOT NULL,
                    arg_count tinyint(4) NOT NULL,
                    file_name varchar(128) NOT NULL,
                    line_num smallint NOT NULL,
                    PRIMARY KEY (first_call,hook_name))"
                    );
                }
            }
            $args = func_get_args();
            $arg_count = count($args)-1;
            $hook_type = str_replace('do_','',
                str_replace('apply_filters','filter',
                    str_replace('_ref_array','[]',
                        $callstack[3]['function'])));
            $file_name = str_replace($doc_root,'',$callstack[3]['file']);
            $line_num = $callstack[3]['line'];
            $called_by = $callstack[4]['function'];
            $wpdb->query("INSERT wp_hook_list
                (first_call,called_by,hook_name,hook_type,arg_count,file_name,line_num)
                VALUES ($first_call,'$called_by()','$hook','$hook_type',$arg_count,'$file_name',$line_num)");
            $first_call++;
            $in_hook = false;
        }
    }
}

나는 ... 한두 번만 사용할 수있는 것들 중 하나이지만, 그것을 사용할 때 별에 감사드립니다 :)
Keith S.

1
마이크, 정말 멋지다! 그러나 각 필터 / 조치의 기능을 실제로 이해하기 위해 권장하는 것은 무엇입니까? 모든 파일이 '활동'과 함께 나열되는 파일이 있습니까? 감사!
13:14에

1
@Amit-그렇습니다. 어려운 질문입니다. :) 질문 주셔서 감사합니다. 불행히도, 위의 후크를 나열하는 것처럼 자동화 할 수있는 방법을 알 수 없으므로 완벽한 답변을 얻지 못합니다. 각 후크마다 이상적으로 누군가가 훌륭한 블로그 게시물을 작성하거나 (또는 ​​여기에 질문을하여 큰 답변을 얻음) "Google it"이 귀하의 답변이됩니다. 그대로 디버깅 IDE (PhpStorm + XDEBUG, 2010 년 9 월까지 US $ 49)를 사용하고 중단 점을 설정하고 실행 코드를 추적합니다. 더 좋은 방법이있을 수 있습니다. 다른 사람이 생각한 경우 알려주십시오!
MikeSchinkel

와우, 이것은 내가 본 것 중 가장 좋은 대답입니다. 어쨌든
Arlen Beiler

2
@ Mike : 빠른 질문, 왜 메모리 나 임시 스트림 대신 데이터베이스에 저장합니까?
hakre


2

코덱스에는 액션 레퍼런스필터 레퍼런스가 있습니다. Adam Brown 은 소스 코드에 모든 후크가 포함 된 후크 데이터베이스 를 작성 했으며 위키 페이지의 문서, 버전 정보 및 소스 코드 링크를 추가합니다. 코덱스에 문서를 작성하여 개선 할 수 있습니다.

물론 다른 데이터에 따라 일부 후크는 동적입니다. 테이크 wp_transition_post_status기능 :

function wp_transition_post_status($new_status, $old_status, $post) {
    do_action('transition_post_status', $new_status, $old_status, $post);
    do_action("${old_status}_to_$new_status", $post);
    do_action("${new_status}_$post->post_type", $post->ID, $post);
}

사용자 정의 게시물 유형 event및 사용자 정의 게시물 상태 를 등록 cancelled하면 cancelled_event작업 후크가 있습니다.


Adam Browns 데이터베이스는이 두 페이지의 조합 일뿐 아니라 WordPress의 모든 단일 작업 및 필터를 나열합니다. 아니면 그것은 당신이 의미하는 것이 아닙니다.
Arlen Beiler

@ Arlen : 예, 실제로는 더 분명해졌습니다.
Jan Fabry

1

원시적이지만이 플러그인 코드가 도움이 될 수 있습니까? 대신 필터를 보려면 "add_filter"로 "add_action"을 전환하십시오. 플러그인을로드 한 다음 사이트 홈페이지를 새로 고칩니다. 일단로드되면 비활성화하기가 매우 어려우므로 플러그인 폴더에서 플러그인 파일 이름을 바꾸고 사이트를 다시 새로 고치면 자동으로 비활성화됩니다. 이 트릭을 사용하여 문제를 해결하거나 무언가를 삽입 할 수있는 장소를 찾았습니다.

<?php
/*
Plugin Name: Hooks
Plugin URI: http://example.com/
Description: Hooks
Version: 1.00
Author: Hooks
Author URI: http://example.com/
*/

add_action('all','hook_catchall');
function hook_catchall(&$s1 = '', &$s2 = '', &$s3 = '', &$s4 = '') {
    echo "<h1>1</h1>\n";
    print_r($s1);
    echo "<br />\n";
    echo "<h1>2</h1>\n";
    print_r($s2);
    echo "<br />\n";
    echo "<h1>3</h1>\n";    
    print_r($s3);
    echo "<br />\n";
    echo "<h1>4</h1>\n";    
    print_r($s4);
    echo "<br />\n";
    return $s1;
}

예쁘지 않지만 실제로는 일부 시나리오에서 가장 빠르고 쉬운 방법 일 수 있습니다 (전체 IDE를 사용하는 대신 작은 메모장 + 명령 줄 프로젝트에서 작은 것을 고치기 위해“printf 디버깅”을 사용하는 경우가 많습니다).
Synetech

0

나는 이것을 사용하여 후크의 순서를 찾습니다. 에 대한 filters변경 사항 add_action을 받으려면 add_filter.

function echo_all_hooks() {
$not_arr = array('gettext','sanitize_key','gettext_with_context','attribute_escape');
if(!in_array(current_filter(),$not_arr)) echo current_filter()."<br/>";
}
add_action('all','echo_all_hooks');

0

@kaiser는 링크 만 게시하지 말 것을 제안하지만 개선하고 있습니다. 그러나 여기에 전체 코드를 사용할 수 없으므로 여기에 약간의 이미지를 사용하여 WordPress 후크에 대한 전체 목록이 어떻게 설명되어 있는지 설명합니다. 후크 , 클래스 , 함수 , 플러그인 , 여기에서 찾을 수 있습니다 . 여기에 이미지 설명을 입력하십시오

각각을 설명하기 위해 여기에 이미지 설명을 입력하십시오


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.