Di mana saya dapat menemukan daftar pengait WordPress?

Jawaban:

45

@Arlen: Seperti yang ditunjukkan Keith S , Daftar Hooks dari Adam Brown adalah sumber defacto dari kait untuk WordPress. Namun, itu tidak sempurna:

  • Itu tidak menunjukkan kait dalam urutan ketika mereka dipanggil,
  • Itu tidak memberikan nama file atau nomor baris di mana dipanggil,
  • Itu tidak memberikan sejumlah argumen yang berlalu,
  • Ini bukan daftar lengkap karena beberapa kait dapat disebut secara dinamis,
  • Dan itu tidak menunjukkan kait dari plugin.

Jadi, sementara daftar Adam adalah sumber yang bagus terutama untuk memahami kapan kait ditambahkan secara historis, itu hampir tidak berguna seolah-olah Anda dapat memasukkan kait pada halaman tertentu di situs Anda sendiri.

Saya telah mempermainkan ide ini untuk sementara waktu sehingga pertanyaan Anda memicu saya untuk menulis sebuah plugin yang disebut " Instrument Hooks for WordPress ." Anda dapat menemukan sumber lengkap di bawah tangkapan layar dan dapat juga mengunduhnya dari intisari di sini .

Jadi, inilah tangkapan layar seperti apa instrumentasi itu:

Cuplikan layar Hook Instrumen untuk Plugin WordPress beraksi

Anda memicu instrumentasi dengan menggunakan parameter URL instrument=hooks, yaitu:

http://example.com?instrument=hooks

Dan seperti yang dijanjikan, inilah sumbernya (atau unduh di sini .):

<?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;
        }
    }
}
MikeSchinkel
sumber
Saya akan ... itu salah satu dari hal-hal yang hanya dapat Anda gunakan sekali atau dua kali, tetapi ketika Anda menggunakannya, Anda berterima kasih kepada bintang-bintang untuk itu :)
Keith S.
1
Mike, itu sangat keren! Tetapi apa yang akan Anda rekomendasikan untuk benar-benar memahami apa yang dilakukan setiap filter / tindakan? apakah ada file di mana semua itu terdaftar bersama dengan 'aktivitas' mereka? Terima kasih!
Amit
1
@Amit - Ya, itu pertanyaan yang sulit. :) Terima kasih untuk bertanya. Sayangnya, saya tidak dapat melihat cara untuk mengotomatisasi seperti yang saya lakukan untuk mendaftarkan kait di atas sehingga saya tidak memiliki jawaban yang sempurna untuk Anda. Idealnya untuk setiap kait seseorang akan menulis posting blog yang bagus (atau mengajukan pertanyaan di sini yang mendapat jawaban bagus) dan kemudian "Google it" akan menjadi jawaban Anda. Seperti halnya, saya menggunakan debugging IDE (PhpStorm + XDEBUG, US $ 49 hingga September 2010) dan saya mengatur breakpoints dan hanya melacak melalui kode yang mengeksekusi. Mungkin ada cara yang lebih baik, dan jika orang lain memikirkannya, beri tahu kami!
MikeSchinkel
Wow, ini jawaban terbaik yang pernah saya lihat. Lagi pula di sini.
Arlen Beiler
2
@ Mike: Pertanyaan singkat, mengapa Anda menyimpannya ke dalam basis data alih-alih memori atau aliran sementara?
hakre
2

Codex memiliki Referensi Tindakan dan Referensi Filter . Adam Brown membuat basis data pengait yang memiliki semua pengait dalam kode sumber, dan menambahkan dokumentasi dari halaman wiki, informasi versi, dan tautan ke kode sumber. Anda dapat memperbaikinya dengan menulis dokumentasi di Codex.

Tentu saja, beberapa pengait bersifat dinamis, tergantung pada data lainnya. Ambil wp_transition_post_statusfungsinya:

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

Jika Anda mendaftarkan jenis kiriman khusus eventdan status kiriman khusus cancelled, Anda akan memiliki cancelled_eventhook tindakan.

Jan Fabry
sumber
Basis data Adam Browns bukan hanya kombinasi dari 2 halaman itu, ia memiliki setiap tindakan dan filter di WordPress terdaftar. Atau bukan itu yang Anda maksudkan.
Arlen Beiler
@ Andre: Ya, saya menulis ulang supaya lebih jelas.
Jan Fabry
1

Meski primitif, mungkin kode plugin ini dapat membantu? Alihkan "add_action" dengan "add_filter" jika Anda ingin melihat filter sebagai gantinya. Muat plugin, lalu segarkan beranda situs tersebut. Setelah dimuat, itu adalah rasa sakit yang serius untuk dinonaktifkan, jadi cukup ganti nama file plugin di bawah folder plugins dan segarkan situs lagi - itu akan dinonaktifkan secara otomatis. Saya telah menggunakan trik ini berkali-kali untuk memecahkan masalah atau menemukan tempat di mana saya dapat memasukkan sesuatu.

<?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;
}
Volomike
sumber
Ini mungkin tidak cantik, tetapi mungkin sebenarnya cara tercepat dan termudah dalam beberapa skenario (saya sering menggunakan "printf debugging" untuk memperbaiki hal-hal kecil dalam proyek-proyek kecil, Notepad + command-line alih-alih menggunakan seluruh IDE).
Synetech
0

Saya menggunakan ini untuk menemukan urutan kait. Untuk mendapatkan yang filtersperubahan hanya add_actionuntuk 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');
Wadde
sumber
0

Karena @kaiser menyarankan jangan memposting tautan saja, saya memperbaikinya. tetapi tidak mungkin untuk menggunakan seluruh kode di sini jadi saya menggunakan beberapa gambar di sini untuk menjelaskan bahwa bagaimana ia memiliki daftar lengkap untuk kait WordPress dengan menjelaskan masing-masing. Anda dapat menemukannya di sini untuk kait , kelas , fungsi , plugin , masukkan deskripsi gambar di sini

untuk menggambarkan masing-masing masukkan deskripsi gambar di sini

sohan
sumber