ฉันจะหารายการของ WordPress hooks ได้ที่ไหน


48

ฉันจะหารายการของตะขอ WordPress และฟังก์ชั่นที่ลบล้างได้ทั้งหมด (pluggable, scriptable, etc)

แก้ไข:ปลั๊กอินไว้ที่นี่


นี่คือเว็บไซต์ที่ไปสู่เมื่อฉันกำลังมองหาข้อมูลเกี่ยวกับตะขอ ... WordPress Hooks ฐานข้อมูล
Keith S.

1
WordPress ได้ทำเอกสารเกี่ยวกับ hooks ทั้งหมดแล้ว : D คุณสามารถค้นหาและค้นหาได้ที่นี่
sam

คำตอบ:


45

@Arlen: ดังที่ Keith S ชี้ให้เห็นรายการ List of Hooks ของ Adam Brownนั้นเป็นทรัพยากรของ hooks สำหรับ WordPress อย่างไรก็ตามมันไม่สมบูรณ์แบบ:

  • มันไม่แสดง hooks ตามลำดับเวลาที่มันถูกเรียก
  • ไม่มีชื่อไฟล์หรือหมายเลขบรรทัดที่เรียกใช้
  • มันไม่ได้ให้ข้อโต้แย้งจำนวนมาก
  • มันไม่ใช่รายการที่สมบูรณ์เพราะบาง hooks สามารถเรียกได้ว่าเป็นแบบไดนามิก
  • และมันจะไม่แสดง hooks จากปลั๊กอิน

ดังนั้นในขณะที่รายการของอดัมเป็นทรัพยากรที่ดีโดยเฉพาะอย่างยิ่งสำหรับการทำความเข้าใจเมื่อมีการเพิ่ม hooks ในอดีตมันแทบไม่เป็นประโยชน์เหมือนกับคุณสามารถใช้ hooks บนหน้าเว็บใด ๆ ในเว็บไซต์ของคุณเอง

ฉันเล่นกับแนวคิดนี้มาระยะหนึ่งแล้วคำถามของคุณก็ทำให้ฉันเขียนปลั๊กอินชื่อ " Instrument Hooks สำหรับ WordPress " คุณสามารถหาแหล่งที่มาเต็มรูปแบบด้านล่างภาพหน้าจอและสามารถคุณยังสามารถดาวน์โหลดได้จากส่วนสำคัญที่นี่

ดังนั้นนี่คือภาพหน้าจอของเครื่องมือที่มีลักษณะ:

สกรีนช็อตของ Instrument Hooks สำหรับปลั๊กอิน 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
ไมค์มันเจ๋งมาก! แต่คุณอยากแนะนำอะไรให้เข้าใจจริง ๆ ว่าตัวกรอง / การกระทำแต่ละรายการทำอะไร มีไฟล์ที่แสดงทั้งหมดพร้อมกับ 'กิจกรรม' ของพวกเขาหรือไม่ ขอบคุณ!
Amit

1
@ ยอมรับ - ใช่นั่นเป็นคำถามที่ยาก :) ขอบคุณที่ถาม. น่าเสียดายที่ฉันไม่เห็นวิธีใดที่จะทำให้เป็นแบบอัตโนมัติเหมือนที่ฉันทำไว้กับรายชื่อ hooks ด้านบนดังนั้นฉันจึงไม่มีคำตอบที่สมบูรณ์แบบสำหรับคุณ เป็นการดีสำหรับแต่ละตะขอบางคนจะเขียนโพสต์บล็อกที่ดี (หรือถามคำถามที่นี่ซึ่งได้คำตอบที่ดี) แล้ว "Google มัน" จะเป็นคำตอบของคุณ ตามที่เป็นอยู่ฉันใช้ดีบัก IDE (PhpStorm + XDEBUG, US $ 49 ถึง ก.ย. 2010) และฉันตั้งค่าเบรกพอยต์และเพียงแค่ติดตามผ่านรหัสการดำเนินการ อาจมีวิธีที่ดีกว่าและถ้ามีคนอื่นคิดโปรดแจ้งให้เราทราบ!
MikeSchinkel

ว้าวนี่เป็นคำตอบที่ดีที่สุดที่ฉันเคยเห็น ที่นี่อยู่ดี
Arlen Beiler

2
@ ไมค์: คำถามด่วนทำไมคุณเก็บไว้ในฐานข้อมูลแทนหน่วยความจำหรือกระแสข้อมูลชั่วคราว
hakre

4

Debug Bar Action hooks plugin

แสดงรายการการกระทำที่เรียกใช้สำหรับคำขอปัจจุบัน ต้องใช้ปลั๊กอินแถบดีบัก


2
นอกจากนี้ยังตรวจแก้จุดบกพร่องการกระทำบาร์และกรอง AddonและDebug บาร์ตะขอเข้าสู่ระบบ
Synetech

2

Codex มีการอ้างอิงการดำเนินการและการอ้างอิงกรอง Adam Brown สร้างฐานข้อมูล hookที่มี hooks ทั้งหมดในซอร์สโค้ดและเพิ่มเอกสารจากหน้า wiki ข้อมูลรุ่นและลิงก์ไปยังซอร์สโค้ด คุณสามารถปรับปรุงได้โดยการเขียนเอกสารใน Codex

แน่นอนว่า hooks บางตัวเป็นแบบไดนามิกขึ้นอยู่กับข้อมูลอื่น ๆ ใช้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_action" ด้วย "add_filter" หากคุณต้องการดูตัวกรองแทน โหลดปลั๊กอินจากนั้นรีเฟรชหน้าแรกของเว็บไซต์ เมื่อโหลดแล้วจะเป็นการยากที่จะปิดการใช้งานดังนั้นเพียงแค่เปลี่ยนชื่อไฟล์ปลั๊กอินภายใต้โฟลเดอร์ปลั๊กอินและรีเฟรชไซต์อีกครั้ง - มันจะปิดการใช้งานโดยอัตโนมัติ ฉันใช้เคล็ดลับนี้หลายครั้งเพื่อแก้ไขปัญหาหรือค้นหาสถานที่ที่ฉันสามารถแทรกบางสิ่งได้

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

อาจไม่สวย แต่จริง ๆ แล้วอาจเป็นวิธีที่เร็วและง่ายที่สุดในบางสถานการณ์ (ฉันมักใช้“ printf debugging” เพื่อแก้ไขสิ่งเล็ก ๆ ในโครงการ Notepad + บรรทัดคำสั่งแทนที่จะใช้ IDE ทั้งหมด)
Synetech

0

ฉันใช้สิ่งนี้เพื่อค้นหาลำดับของ hooks ที่จะได้รับการfiltersเปลี่ยนแปลงเพียงเพื่อadd_actionadd_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 hooks ที่มีคำอธิบายแต่ละข้อได้อย่างไร คุณสามารถหาได้ที่นี่สำหรับhooks , คลาส , ฟังก์ชั่น , ปลั๊กอิน , ป้อนคำอธิบายรูปภาพที่นี่

เพื่ออธิบายแต่ละรายการ ป้อนคำอธิบายรูปภาพที่นี่


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.