Gdzie mogę znaleźć listę haków WordPress?


Odpowiedzi:


45

@Arlen: Jak zauważa Keith S. Lista haków Adama Browna jest zasobem defacto haków dla WordPress. Nie jest to jednak idealne:

  • Nie pokazuje haczyków w kolejności, w której są wywoływane,
  • Nie podaje nazwy pliku ani numeru wiersza, w którym został wywołany,
  • Nie zapewnia liczby przekazanych argumentów,
  • To nie jest pełna lista, ponieważ niektóre haki można wywoływać dynamicznie,
  • I nie pokazuje haków z wtyczek.

Tak więc chociaż lista Adama jest świetnym źródłem informacji, szczególnie dla zrozumienia, kiedy haczyki były historycznie dodawane, nie jest to tak przydatne, jakbyś był w stanie instrumentować haczyki na dowolnej stronie w swojej witrynie.

Przez jakiś czas bawiłem się tym pomysłem, więc twoje pytanie skłoniło mnie do napisania wtyczki o nazwie „ Haki na instrumenty dla WordPressa ”. Pełne źródło możesz znaleźć pod zrzutem ekranu i możesz go również pobrać z Gist tutaj .

Oto zrzut ekranu tego, jak wygląda instrumentacja:

Zrzut ekranu z hakami instrumentów dla wtyczki WordPress w akcji

Instrumentacja jest uruchamiana przy użyciu parametru adresu URL instrument=hooks, tj .:

http://example.com?instrument=hooks

I zgodnie z obietnicą, oto źródło (lub pobierz tutaj .):

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

Chciałbym ... to jedna z tych rzeczy, których możesz użyć tylko raz lub dwa razy, ale kiedy z niej korzystasz, dziękujesz gwiazdom za to :)
Keith S.,

1
Mike, to bardzo fajnie! Ale co byś polecił, aby właściwie zrozumieć, co robi każdy filtr / akcja? czy istnieje plik, w którym wymienione są wszystkie z nich wraz z ich „aktywnością”? Dzięki!
Amit,

1
@Amit - Tak, to trudne pytanie. :) Dzięki, że pytasz. Niestety nie widzę żadnego sposobu na zautomatyzowanie tego, co zrobiłem w przypadku powyższych haczyków, więc nie mam dla ciebie idealnej odpowiedzi. Idealnie dla każdego haka ktoś napisałby świetny post na blogu (lub zadałby tutaj pytanie, które uzyskało świetną odpowiedź), a następnie „Google it” będzie Twoją odpowiedzią. W tej chwili używam debugowania IDE (PhpStorm + XDEBUG, 49 USD do września 2010 r.) I ustawiam punkty przerwania i po prostu śledzę wykonywany kod. Może być jednak lepszy sposób, a jeśli ktoś pomyślał o tym, daj nam znać!
MikeSchinkel,

Wow, to najlepsza odpowiedź, jaką kiedykolwiek widziałem. W każdym razie tutaj.
Arlen Beiler,

2
@ Mike: Szybkie pytanie, dlaczego przechowujesz to w bazie danych zamiast w pamięci lub tymczasowym strumieniu?
hakre


2

Kodeks ma Action Action i Filter Reference . Adam Brown utworzył bazę danych hooków, która zawiera wszystkie hooki w kodzie źródłowym, i dodaje dokumentację ze stron wiki, informacje o wersji i linki do kodu źródłowego. Możesz to poprawić, pisząc dokumentację w Kodeksie.

Oczywiście niektóre haki są dynamiczne, w zależności od innych danych. Weź wp_transition_post_statusfunkcję:

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

Jeśli zarejestrujesz niestandardowy typ posta eventi niestandardowy status posta cancelled, będziesz mieć cancelled_eventhak akcji.


Baza danych Adama Browna to nie tylko połączenie tych 2 stron, ma na liście każdą akcję i filtr w WordPress. A może nie to miałeś na myśli.
Arlen Beiler,

@Arlen: Tak, przepisałem to, aby było bardziej jasne.
Jan Fabry,

1

Chociaż prymitywny, może ten kod wtyczki może pomóc? Jeśli chcesz spojrzeć na filtry, zmień „add działań” za pomocą „add_filter”. Załaduj wtyczkę, a następnie odśwież stronę główną witryny. Po załadowaniu dezaktywacja jest poważnym problemem, więc po prostu zmień nazwę pliku wtyczki w folderze wtyczek i odśwież stronę ponownie - automatycznie się dezaktywuje. Użyłem tej sztuczki wiele razy, aby rozwiązać problemy lub znaleźć miejsce, w którym mogę coś wstawić.

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

To może nie być ładne, ale w rzeczywistości może być najszybszym i najłatwiejszym sposobem (często używam „debugowania printf”, aby naprawić małe rzeczy w małych projektach wiersza poleceń Notepad + zamiast używać całego IDE).
Synetech

0

Używam tego, aby znaleźć kolejność haków. Aby uzyskać filterssprawiedliwą zmianę add_actionna 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

Ponieważ @kaiser sugeruje, aby nie publikować tylko linków, poprawiam to. ale nie jest możliwe użycie całego kodu tutaj, dlatego używam tutaj kilku obrazków, aby wyjaśnić, w jaki sposób ma pełną listę haków WordPress z opisem każdego z nich. znajdziesz go tutaj dla haków , klas , funkcji , wtyczek , wprowadź opis zdjęcia tutaj

opisać każdego wprowadź opis zdjęcia tutaj


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.