Де можна знайти список гачків WordPress?


48

Де я можу знайти список усіх гачків WordPress та функцій перезавантаження (підключений, сценарій тощо)?

Edit: Плагін перераховані тут .


Це мій сайт, коли я шукаю інформацію про гачок ... База даних WordPress Hooks
Keith S.

1
Нарешті WordPress задокументував усі свої гачки . : D Ви можете переглядати та шукати там.
сам

Відповіді:


45

@Arlen: Як вказує Кіт S , список гачків Адама Брауна - це фактичний ресурс гачків для WordPress. Однак це не ідеально:

  • Він не показує гачки в порядку, коли їх викликають,
  • У ньому не вказано ім'я файлу чи номер рядка, коли викликається,
  • Він не надає низки переданих аргументів,
  • Це не повний список, оскільки деякі гачки можна викликати динамічно,
  • І на ньому не відображаються гачки плагінів.

Тож перелік Адама - це чудовий ресурс, особливо для розуміння того, коли історично додавали гачки, він не настільки корисний, як якщо б ви змогли зафіксувати гачки на будь-якій сторінці на вашому власному сайті.

Я деякий час бавився з цією ідеєю, тому ваше запитання спонукало мене написати плагін під назвою " Інструментальні гачки для WordPress ". Ви можете знайти повне джерело під знімком екрана, а також можете завантажити його з gist тут .

Ось ось скріншот того, як виглядає інструментарій:

Знімок екрана з гачками інструментів для 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;
        }
    }
}

Я б… це одна з тих речей, якими ви можете скористатися лише один раз або двічі, але коли ви цим користуєтеся, ви дякуєте зіркам за це :)
Кіт С.

1
Майк, це дуже круто! Але що б ви порадили для розуміння того, що робить кожен фільтр / дія? чи є файл, де перераховані всі перелічені разом із їх 'діяльністю'? Дякую!
Аміт

1
@Amit - Так, це важке питання. :) Спасибі за питання. На жаль, я не бачу жодного способу автоматизувати це, як я робив для перерахування гачків вище, тому я не маю ідеальної відповіді для вас. В ідеалі на кожен гачок хтось написав би чудову публікацію в блозі (або задав би тут питання, на яке отримав чудову відповідь), і тоді "Google це" буде вашою відповіддю. Як і я, я використовую налагоджувальний IDE (PhpStorm + XDEBUG, 49 доларів США до вересня 2010 року) і встановлюю точки прориву та просто простежую код виконання. Хоча може бути і кращий спосіб, і якщо хтось ще подумав про це, будь ласка, повідомте нас!
MikeSchinkel

Ого, це найкраща відповідь, яку я коли-небудь бачив. Тут все одно.
Арлен Білер

2
@Mike: Швидке запитання, чому ви зберігаєте це в базі даних замість пам'яті чи тимчасового потоку?
hakre


2

Кодекс має посилання на дію та посилання на фільтр . Адам Браун створив базу даних гаків, яка містить усі гачки у вихідному коді, і додає документацію зі сторінок вікі, інформацію про версії та посилання до вихідного коду. Ви можете покращити його, написавши документацію в Кодекс.

Звичайно, деякі гачки є динамічними, залежно від інших даних. Візьміть 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гак дій.


База даних Адама Браунса - це не просто поєднання цих 2 сторінок, вона має кожну окрему дію та фільтр у списку WordPress. Або це не те, що ви мали на увазі.
Арлен Бейлер

@Arlen: Так, я переписав це, щоб було зрозуміліше.
Ян Фабрі

1

Хоча примітивний, можливо, цей плагін може допомогти? Перемкніть "Додати запуск" на "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" для виправлення дрібниць у невеликих проектах командного рядка Notepad + замість використання цілого IDE).
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 з описом кожного. ви можете знайти його тут для гачків , класів , функцій , плагінів , введіть тут опис зображення

описати кожен введіть тут опис зображення


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.