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

48

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

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

Арлен Бейлер
источник
Это мой сайт, когда я ищу информацию о хуках ... База данных WordPress Hooks
Кейт С.
1
WordPress наконец-то задокументировал все свои хуки . : D Вы можете просматривать и искать там.
Сэм

Ответы:

45

@Arlen: Как указывает Кит С. Список зацепок Адама Брауна - это фактический ресурс хуков для WordPress. Тем не менее, это не идеально:

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

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

Некоторое время я играл с этой идеей, поэтому ваш вопрос заставил меня написать плагин под названием « Инструментальные хуки для WordPress ». Вы можете найти полный исходный код под снимком экрана, а также скачать его здесь .

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

Снимок экрана: инструментальные зацепки для плагина 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;
        }
    }
}
MikeSchinkel
источник
Я бы ... это одна из тех вещей, которую вы могли бы использовать только один или два раза, но когда вы ее используете, вы благодарите ее за это звезды :)
Кит С.
1
Майк, это очень круто! Но что бы вы порекомендовали для понимания того, что делает каждый фильтр / действие? есть ли файл, в котором все они перечислены вместе с их «активностью»? Спасибо!
Амит
1
@Amit - Да, это сложный вопрос. :) Спасибо за вопрос. К сожалению, я не вижу никакого способа автоматизировать это, как я сделал для перечисления крючков выше, поэтому у меня нет идеального ответа для вас. В идеале для каждого хука кто-то написал бы отличное сообщение в блоге (или задал вопрос, который получил хороший ответ), и тогда «Google it» был бы вашим ответом. Я использую IDE для отладки (PhpStorm + XDEBUG, 49 долларов США до сентября 2010 года), и я устанавливаю точки останова и просто отслеживаю выполняемый код. Хотя может быть лучший способ, и если кто-то еще подумал об этом, пожалуйста, дайте нам знать!
MikeSchinkel
Вау, это лучший ответ, который я когда-либо видел. Здесь все равно.
Арлен Бейлер
2
@Mike: Быстрый вопрос, почему вы храните это в базе данных вместо памяти или временного потока?
2010 г.,
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ловушка действий.

Ян Фабри
источник
База данных Адама Браунса - это не просто комбинация этих двух страниц, в ней есть все действия и фильтры в WordPress. Или это не то, что вы имели в виду.
Арлен Бейлер
@ Арлен: Да, действительно, я переписал это так, чтобы было понятнее.
Ян Фабри
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;
}
Volomike
источник
Это может быть не красиво, но на самом деле это может быть самый быстрый и простой способ в некоторых сценариях (я часто использую «отладку 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');
Wadde
источник
0

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

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

Сохан
источник