Где можно найти список хуков WordPress?

13 авг. 2010 г., 18:15:29
Просмотры: 19.3K
Голосов: 52

Где можно найти список всех хуков WordPress и переопределяемых функций (pluggable, scriptable и т.д.)?

Редактирование: Плагин указан здесь.

2
Комментарии

Это мой основной ресурс, когда мне нужна информация о хуках... База данных хуков WordPress

Keith S. Keith S.
13 авг. 2010 г. 18:25:35

WordPress наконец-то задокументировал все свои хуки. :D Вы можете просматривать и искать их там.

sam sam
21 нояб. 2014 г. 02:05:32
Все ответы на вопрос 7
9
47

@Arlen: Как указывает Keith S, Список хуков Адама Брауна является де-факто ресурсом по хукам для WordPress. Однако он не идеален:

  • Он не показывает хуки в порядке их вызова,
  • Не указывает имя файла или номер строки, где вызывается хук,
  • Не предоставляет количество передаваемых аргументов,
  • Это не полный список, так как некоторые хуки могут вызываться динамически,
  • И он не показывает хуки из плагинов.

Таким образом, хотя список Адама — это отличный ресурс, особенно для понимания того, когда хуки были исторически добавлены, он не так полезен, как если бы вы могли инструментировать хуки на любой странице вашего сайта самостоятельно.

Я размышлял над этой идеей некоторое время, и ваш вопрос побудил меня написать плагин под названием "Instrument Hooks for WordPress". Вы можете найти полный исходный код ниже скриншота, а также скачать его из gist здесь.

Вот скриншот того, как выглядит инструментирование:

Скриншот работы плагина Instrument Hooks for WordPress

Вы активируете инструментирование, используя URL-параметр instrument=hooks, например:

http://example.com?instrument=hooks

И, как обещал, вот исходный код (или загрузите его здесь):

<?php
/*
Plugin Name: Instrument Hooks for WordPress
Description: Инструментирование хуков для страницы. Вывод происходит во время хука Shutdown.
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>Первый вызов</th>
        <th>Имя хука</th>
        <th>Тип хука</th>
        <th>Кол-во аргументов</th>
        <th>Вызван</th>
        <th>Строка #</th>
        <th>Имя файла</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;
        }
    }
}
14 авг. 2010 г. 05:09:54
Комментарии

Я бы... это одна из тех вещей, которые можно использовать всего пару раз, но когда она действительно понадобится, будешь благодарен судьбе :)

Keith S. Keith S.
14 авг. 2010 г. 06:09:57

Майк, это очень круто! Но что ты посоветуешь для понимания, что именно делает каждый фильтр/экшен? Есть ли файл, где они все перечислены вместе с их "функционалом"? Спасибо!

Amit Amit
14 авг. 2010 г. 16:10:59

@Amit - Да, это сложный вопрос. :) Спасибо, что спросили. К сожалению, я не вижу способа автоматизировать это, как я сделал для списка хуков выше, поэтому у меня нет идеального ответа. В идеале для каждого хука кто-то должен написать отличный пост в блоге (или задать вопрос здесь, который получит хороший ответ), и тогда "погуглить" будет решением. Как есть, я использую IDE с отладкой (PhpStorm+XDEBUG, $49 до сентября 2010) и ставлю точки останова, просто отслеживая выполнение кода. Возможно, есть лучший способ, и если кто-то придумал его - дайте нам знать!

MikeSchinkel MikeSchinkel
15 авг. 2010 г. 01:44:49

Вау, это лучший ответ, который я когда-либо видел. Во всяком случае здесь.

Arlen Beiler Arlen Beiler
16 авг. 2010 г. 16:15:44

@Mike: Быстрый вопрос, почему вы храните это в базе данных, а не в памяти или временном потоке?

hakre hakre
18 авг. 2010 г. 11:31:03

@hakre - Хороший вопрос! Когда я начал писать плагин, я представлял, что он будет собирать информацию о хуках за несколько загрузок страниц. После завершения реализации я понял, что полезнее делать это только для каждой загрузки страницы, но у меня уже была реализация записи в таблицу базы данных. Я думал изменить это, но беспокоился, что это может занять слишком много памяти (вероятно, беспочвенно, но всё же...) Так что да, хранение в памяти было бы альтернативным и, вероятно, предпочтительным способом. Хочешь сделать это обновление за меня? WA - это про позитивное участие! :-)

MikeSchinkel MikeSchinkel
18 авг. 2010 г. 18:24:21

Можно ли это использовать в админке?

urok93 urok93
21 авг. 2012 г. 12:38:38

@drtanz - Это не связано с фронтендом или админкой. Должно работать при любой загрузке страницы.

MikeSchinkel MikeSchinkel
21 авг. 2012 г. 22:48:56

Небольшая подсказка. Плагин Debug Objects имеет список всех хуков и хуков текущей страницы в качестве функции.

bueltge bueltge
8 июл. 2015 г. 13:33:50
Показать остальные 4 комментариев
1

Плагин Debug Bar Action Hooks

Отображает список действий (actions), запущенных для текущего запроса. Требует наличия плагина Debug Bar.

Скриншот интерфейса плагина Debug Bar Action Hooks

22 мая 2012 г. 23:52:41
Комментарии

Также существуют дополнение Debug Bar Actions and Filters и Debug Bar Hook Log.

Synetech Synetech
28 июл. 2013 г. 20:24:27
2

В Codex есть Справочник действий (Action Reference) и Справочник фильтров (Filter Reference). Адам Браун создал базу данных хуков, которая содержит все хуки в исходном коде, а также включает документацию со страниц вики, информацию о версиях и ссылки на исходный код. Вы можете улучшить её, написав документацию в Codex.

Конечно, некоторые хуки являются динамическими и зависят от других данных. Возьмём, к примеру, функцию 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.

13 авг. 2010 г. 18:29:18
Комментарии

База данных Адама Брауна — это не просто комбинация этих двух страниц, в ней перечислены все возможные действия и фильтры в WordPress. Или вы имели в виду что-то другое?

Arlen Beiler Arlen Beiler
13 авг. 2010 г. 21:25:58

@Arlen: Да, действительно, я переписал это, чтобы было понятнее.

Jan Fabry Jan Fabry
13 авг. 2010 г. 21:56:34
1

Хотя этот код плагина примитивен, возможно, он сможет помочь? Замените "add_action" на "add_filter", если хотите просмотреть фильтры вместо действий. Загрузите плагин, а затем обновите главную страницу сайта. После загрузки его будет очень сложно деактивировать, поэтому просто переименуйте файл плагина в папке plugins и обновите сайт снова — он деактивируется автоматически. Я много раз использовал этот трюк для отладки или поиска места, куда можно вставить что-то.

<?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;
}
18 авг. 2010 г. 23:34:31
Комментарии

Возможно, это не самый красивый способ, но в некоторых ситуациях он может оказаться самым быстрым и простым (я часто использую "printf-отладку" для исправления мелких проблем в небольших проектах, работая просто в Notepad и командной строке, вместо того чтобы запускать целую IDE).

Synetech Synetech
28 июл. 2013 г. 20:02:37
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');
29 июл. 2014 г. 11:37:07
0

Как предложил @kaiser, не публикуйте только ссылки, я улучшаю это. Но разместить весь код здесь невозможно, поэтому я использую несколько изображений, чтобы объяснить, как получить полный список хуков WordPress с описанием каждого. Вы можете найти это здесь для хуков, классов, функций, плагинов, Полный список хуков WordPress с описанием

чтобы описать каждый Описание хуков WordPress

4 июн. 2015 г. 13:09:40
0

Вы можете просто использовать плагин Query Monitor: https://wordpress.org/plugins/query-monitor/

Мониторинг запросов в WordPress

12 авг. 2019 г. 08:54:00