WordPress kancalarının listesini nereden bulabilirim?


Yanıtlar:


45

@ Arlen: Keith S'ın işaret ettiği gibi Adam Brown Hooks List, WordPress için kanca kaynağıdır. Ancak, mükemmel değil:

  • Kancaları ne zaman arandıklarına göre göstermez.
  • Çalıştığı yerde dosya adı veya satır numarası sağlamaz,
  • Bir dizi argüman sağlamaz,
  • Tam bir liste değil çünkü bazı kancalar dinamik olarak adlandırılabilir,
  • Ve bu eklentileri gelen kanca göstermiyor.

Bu yüzden Adam'ın listesi, özellikle kancaların tarihsel olarak eklendiği zamanları anlamak için harika bir kaynak olsa da, kancaları kendi sitenizdeki herhangi bir sayfada enstrümanla çalmak kadar kolay değildir.

Bir süredir bu fikir ile oynuyordum, bu nedenle sorunuz , " WordPress için Enstrüman Kancaları " adlı bir eklenti yazmam için beni tetikledi . Sen bulabilirsiniz aşağıda tam kaynağını ekran görüntüsü ve ayrıca can özünden indirmek burada .

İşte enstrümantasyonun neye benzediğinin ekran görüntüsü:

Uygulamada WordPress Eklentisi için Enstrüman Kancalarının ekran görüntüsü

URL parametresini kullanarak enstrümantasyonu tetiklersiniz instrument=hooks, yani:

http://example.com?instrument=hooks

Ve söz verildiği gibi, işte kaynak (veya buradan indirin .):

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

Ben ... sadece bir veya iki kez kullanabileceğin şeylerden biri, ama onu kullandığında, yıldızlara teşekkür ediyorsun :)
Keith S.

1
Mike, bu çok havalı! Ama aslında her filtre / eylemin ne yaptığını anlamak için ne önerirsiniz? hepsinin 'etkinlikleri' ile birlikte listelendiği bir dosya var mı? Teşekkürler!
Amit

1
@Amit - Evet, bu zor bir soru. :) Sorduğunuz için teşekkürler. Ne yazık ki, yukarıdaki kancaları listelemek için yaptığım gibi otomatikleştirmenin bir yolunu göremiyorum, bu yüzden sizin için mükemmel bir cevabım yok. İdeal her kanca için birisi harika bir blog yazısı yazar (veya burada büyük cevabı olan bir soru sorar) ve sonra "Google bu" cevabınız olur. Olduğu gibi, bir hata ayıklama IDE (PhpStorm + XDEBUG, Eylül 2010'a kadar 49 ABD Doları) kullanıyorum ve sınır değerleri belirledim ve sadece yürütme kodunu izliyorum. Yine de daha iyi bir yol olabilir ve eğer başkası düşünmüşse, lütfen bize bildirin!
MikeSchinkel

Vay, bu şimdiye kadar gördüğüm en iyi cevap. Yine de burada.
Arlen Beiler

2
@Mike: Hızlı soru, neden bunu bellek veya geçici bir akış yerine veritabanına saklıyorsunuz?
hakre


2

Codex'in bir Eylem Referansı ve bir Filtre Referansı vardır . Adam Brown , kaynak kodunda tüm kancalara sahip bir kanca veritabanı oluşturdu ve belgeleri wiki sayfalarından, sürüm bilgilerinden ve kaynak koduna bağlantılar ekler. Kodeks içine belgeler yazarak geliştirebilirsiniz.

Tabii ki, bazı kancalar diğer verilere bağlı olarak dinamiktir. wp_transition_post_statusFonksiyonu al :

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

Özel bir gönderi türü eventve özel bir gönderi durumu kaydederseniz cancelled, bir cancelled_eventeylem kancanız olur.


Adam Browns veritabanı sadece bu 2 sayfanın bir birleşimi değildir, listelenen her bir eylem ve filtreye sahiptir. Yoksa demek istediğin bu değil miydi?
Arlen Beiler,

@Arlen: Evet, gerçekten, daha net olması için yeniden yazdım.
Jan Fabry,

1

İlkel olsa da, belki bu eklenti kodu yardımcı olabilir? Filtrelere bakmak istiyorsanız, "add_action" ı "add_filter" ile değiştirin. Eklentiyi yükleyin ve sitenin ana sayfasını yenileyin. Yüklendikten sonra devre dışı bırakmak ciddi bir acıdır, bu yüzden sadece eklentiler klasörünün altındaki eklenti dosyasını yeniden adlandırın ve siteyi tekrar yenileyin - otomatik olarak devre dışı bırakacaktır. Bu numarayı, sorunları gidermek ya da bir şeyler ekleyebileceğim bir yer bulmak için çok kullandım.

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

Güzel olmayabilir, ancak bazı senaryolarda en hızlı ve en kolay yol olabilir (küçük bir şeyi küçük bir notepad + komut satırı projesinde tam bir IDE kullanmak yerine düzeltmek için genellikle “printf debugging” kullanıyorum).
Synetech

0

Bunu kancaların sırasını bulmak için kullanıyorum. Almak için filterssadece değişimi add_actioniçin 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'in önerdiği gibi sadece linkler yayınlamıyorum, onu geliştiriyorum. ancak burada tüm kodu kullanmak mümkün değil, bu yüzden WordPress kancaları için her birini tanımlayan tam bir listenin nasıl olduğunu açıklamak için birkaç resim kullanıyorum. Eğer burada bulabilirsiniz kancalar , sınıflar , fonksiyonlar , eklentileri , görüntü tanımını buraya girin

her birini tarif etmek görüntü tanımını buraya girin


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.