Tôi có thể tìm danh sách các móc WordPress ở đâu?


48

Tôi có thể tìm thấy danh sách tất cả các hook WordPress và các hàm quá mức (có thể cắm, scriptable, v.v.) ở đâu?

Chỉnh sửa: Plugin được liệt kê ở đây .


Đây là trang web truy cập của tôi khi tôi đang tìm kiếm thông tin hook ... Cơ sở dữ liệu WordPress Hook
Keith S.

1
WordPress cuối cùng đã ghi lại tất cả các hook của nó . : D Bạn có thể duyệt và tìm kiếm ở đó.
sam

Câu trả lời:


45

@Arlen: Như Keith S chỉ ra Danh sách các móc của Adam Brown là tài nguyên chính xác của các hook cho WordPress. Tuy nhiên, nó không hoàn hảo:

  • Nó không hiển thị các móc theo thứ tự khi chúng được gọi,
  • Nó không cung cấp tên tệp hoặc số dòng nơi được gọi,
  • Nó không cung cấp một số đối số được thông qua,
  • Đây không phải là một danh sách đầy đủ vì một số hook có thể được gọi một cách linh hoạt,
  • Và nó không hiển thị móc từ plugin.

Vì vậy, trong khi danh sách của Adam là một tài nguyên tuyệt vời, đặc biệt là để hiểu khi các hook được thêm vào trong lịch sử, nó gần như không hữu ích như thể bạn có thể sử dụng các hook trên bất kỳ trang nào trên trang web của riêng bạn.

Tôi đã từng chơi đùa với ý tưởng này trong một thời gian vì vậy câu hỏi của bạn đã kích hoạt tôi viết một plugin có tên là " Công cụ móc cho WordPress ". Bạn có thể tìm thấy nguồn đầy đủ bên dưới ảnh chụp màn hình và bạn cũng có thể tải xuống từ ý chính tại đây .

Vì vậy, đây là một ảnh chụp màn hình của các thiết bị trông như thế nào:

Ảnh chụp màn hình của Công cụ móc cho Plugin WordPress đang hoạt động

Bạn kích hoạt thiết bị bằng cách sử dụng tham số URL instrument=hooks, nghĩa là:

http://example.com?instrument=hooks

Và như đã hứa, đây là nguồn (hoặc tải xuống ở đây .):

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

Tôi sẽ ... đó là một trong những thứ mà bạn chỉ có thể sử dụng một hoặc hai lần, nhưng khi bạn sử dụng nó, bạn cảm ơn các ngôi sao vì nó :)
Keith S.

1
Mike, thật tuyệt! Nhưng những gì bạn muốn giới thiệu để thực sự hiểu những gì mỗi bộ lọc / hành động làm gì? Có tập tin nào trong đó tất cả những thứ đó được liệt kê cùng với 'hoạt động' của chúng không? Cảm ơn!
Amit

1
@Amit - Vâng, đó là câu hỏi khó. :) Cam ơn vi đa hỏi. Thật không may, tôi không thể thấy bất kỳ cách nào để tự động hóa giống như tôi đã làm khi liệt kê các móc ở trên để tôi không có câu trả lời hoàn hảo cho bạn. Lý tưởng nhất cho mỗi hook, ai đó sẽ viết một bài đăng blog tuyệt vời (hoặc đặt câu hỏi ở đây có câu trả lời tuyệt vời) và sau đó "Google nó" sẽ là câu trả lời của bạn. Như tôi đã sử dụng một IDE gỡ lỗi (PhpStorm + XDEBUG, 49 đô la Mỹ cho đến tháng 9 năm 2010) và tôi đặt các điểm dừng và chỉ theo dõi thông qua mã thực thi. Có thể có một cách tốt hơn mặc dù, và nếu ai đó đã nghĩ về nó xin vui lòng cho chúng tôi biết!
MikeSchinkel

Wow, đây là câu trả lời tốt nhất tôi từng thấy. Dù sao ở đây.
Arlen Beiler

2
@Mike: Câu hỏi nhanh, tại sao bạn lưu nó vào cơ sở dữ liệu thay vì bộ nhớ hoặc luồng tạm thời?
hakre


2

Codex có Tham chiếu hành độngTham chiếu bộ lọc . Adam Brown đã tạo ra một cơ sở dữ liệu hook có tất cả các hook trong mã nguồn và thêm tài liệu từ các trang wiki, thông tin phiên bản và các liên kết đến mã nguồn. Bạn có thể cải thiện nó bằng cách viết tài liệu trong Codex.

Tất nhiên, một số hook là động, tùy thuộc vào dữ liệu khác. Lấy wp_transition_post_statuschức năng:

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);
}

Nếu bạn đăng ký loại bài đăng tùy chỉnh eventvà trạng thái bài đăng tùy chỉnh cancelled, bạn sẽ có một cancelled_eventhook hành động.


Cơ sở dữ liệu Adam Browns không chỉ là sự kết hợp của 2 trang đó, nó có mọi hành động và bộ lọc duy nhất trong WordPress được liệt kê. Hoặc đó không phải là những gì bạn có ý nghĩa.
Arlen Beiler

@Arlen: Vâng thực sự, tôi viết lại nó để rõ ràng hơn.
Jan Fabry

1

Mặc dù nguyên thủy, có lẽ mã plugin này có thể giúp đỡ? Chuyển "add_action" bằng "add_filter" nếu bạn muốn xem các bộ lọc thay thế. Tải plugin và sau đó làm mới trang chủ của trang web. Sau khi tải, việc tắt kích hoạt là một vấn đề nghiêm trọng, vì vậy chỉ cần đổi tên tệp plugin trong thư mục plugin và làm mới lại trang web - nó sẽ tự động hủy kích hoạt. Tôi đã sử dụng thủ thuật này nhiều lần để khắc phục sự cố hoặc tìm một nơi mà tôi có thể chèn một cái gì đó.

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

Nó có thể không đẹp, nhưng nó thực sự có thể là cách nhanh nhất và dễ nhất trong một số trường hợp (tôi thường sử dụng gỡ lỗi in printf để khắc phục những điều nhỏ nhặt trong các dự án dòng lệnh nhỏ của Notepad + thay vì sử dụng toàn bộ IDE).
Synetech

0

Tôi sử dụng cái này để tìm thứ tự của móc. Để có được sự filtersthay đổi chỉ 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

Vì @kaiser đề nghị không chỉ đăng các liên kết mà tôi đang cải thiện nó. nhưng không thể sử dụng toàn bộ mã ở đây vì vậy tôi đang sử dụng một vài hình ảnh ở đây để giải thích rằng làm thế nào nó có một danh sách đầy đủ cho các hook WordPress với mô tả từng cái. bạn có thể tìm thấy nó ở đây cho hook , class , function , plugin , nhập mô tả hình ảnh ở đây

để mô tả từng nhập mô tả hình ảnh ở đây


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.