Hareketsiz kanca referansları oluşturun


10

Birçok eklenti geliştiricisi, kullanıcıların ürünlerinin işlevselliğini değiştirmesine izin vermek için filtre / eylem kancaları eklemek için zaman ayırıyor gibi görünüyor. Bu harika, ama genellikle yapmadıkları kancalar listesi ve kaç argüman aldıklarını.

Herkes bir eklenti (veya tema) dizinine işaret etmek ve mevcut tüm kancaların listesini görmek için en iyi otomatik yolu buldu mu?

Kancaları tarayan bazı eklentiler gibi görünüyorum, ancak söyleyebildiğim kadarıyla, size belirli bir sayfayı oluşturmak için hangilerinin arandığını gösteriyorlar. Hangi olsun kullanışlı olabilir. Ancak bazen belirli bir eklenti ile etkileşime girdiğimi bilirsem, bir eylemi veya filtreyi bağlamama izin verebilecek her yeri bilmek istiyorum.

Yani gerçekten aradığım şey, bir eklenti kök dizini göz önüne alındığında her öğenin yer aldığı bir liste oluşturacağı şeydir:

  • etiket
  • tür (eylem veya filtre)
  • tartışma sayısı
  • kaynakta ( do_action()veya aracılığıyla apply_filter()) çağrıldığı yer

Bir komut dosyası harika olurdu, çünkü bu her şeyi güzelce HTMLify ve her eklenti için yönetici arayüzünde bana gösterebilir. Ancak, yararlı bir statik dosya çıkaran bir komut satırı betiği bile harika olurdu.


soru ne? bir eklenti önerisi arıyorsanız o zaman konu dışı
Mark Kaplun

Maalesef, WordPress Geliştirme Meta yabani otlarına çok fazla girmek istemiyorum , ama a) Burada yeniyim, bu yüzden eklenti önerileri istemenin OT olduğunu fark etmedim. Bununla ilgili ... bazı görüşlerim olabilir ... ama yine de, önce bunu fark etmiş olmalıydım. b) OTOH, sadece mevcut bir eklenti veya kabuk komut dosyası ya da sıfırdan bir şey olsun, soruma herhangi bir çözüm bulmaya çalışıyorum. Yani soru kesinlikle bir eklenti öneri isteği!
yonatron

herkes eğleniyor gibi gözüküyor, zararı yok. Soruya "itirazım" aslında daha çok derleyici tarzı yazılım yazmaktan hoşlanan ama gerçek wordpress kodlamasıyla ilgisi olmayan insanlar için ilginç olan bir metin ayrıştırma sorusu olmaktı. Kayıt için wordpress.org ile ilgili bir eklentinin nasıl gönderileceği gibi sorular bile genellikle konu dışı olarak oylanacaktır.
Mark Kaplun

Yanıtlar:


6

İstediğinizi yapmak için bildiğim komut dosyası veya eklenti yok. Belirttiğiniz gibi, şu anda kullanılmakta olan filtreleri ve eylemleri yazdırmak için kullanabileceğiniz komut dosyaları ( genel değişkenler bile ) vardır.

Hareketsiz filtreler ve eylemlere gelince , bir dosyadaki tüm ve örnekleri bulan ve daha sonra yazdırılan iki çok temel işlev ( burada ve orada bazı yardımlarla ) yazdımapply_filtersdo_action

TEMELLERİ

  • Bir dizindeki tüm PHP dosyalarını almak için RecursiveDirectoryIterator, RecursiveIteratorIteratorve RegexIteratorPHP sınıflarını kullanacağız. Örneğin, yerel ana bilgisayarımda,E:\xammp\htdocs\wordpress\wp-includes

  • Daha sonra dosyalar arasında döngü ve arama ve dönüş (edecek preg_match_all) tüm örneklerini apply_filtersve do_action. Yuvalanmış parantez örneklerini eşleştirmek ve apply_filters/ do_actionve ilk parantez arasındaki olası boşlukları eşleştirmek için ayarladım

Daha sonra tüm filtreleri ve eylemleri içeren bir dizi oluşturacağız ve sonra dizi boyunca döngüye gireceğiz ve dosya adını, filtreleri ve eylemleri çıktılayacağız. Filtreleri / işlemleri olmayan dosyaları atlayacağız

ÖNEMLİ NOTLAR

  • Bu işlevler çok pahalıdır. Bunları yalnızca yerel bir test yüklemesinde çalıştırın.

  • İşlevleri gerektiği gibi değiştirin. Çıktıyı bir dosyaya yazmaya karar verebilir, bunun için özel bir arka uç sayfası oluşturabilirsiniz, seçenekler sınırsızdır

SEÇENEK 1

İlk seçenekler işlevi çok basittir, bir dosyanın içeriğini kullanarak dize olarak döndüreceğiz file_get_contents, apply_filters/ do_actionörnekleri arayacağız ve sadece dosya adını ve filtre / eylem adlarını çıktılayacağız

Kolay takip için kodu yorumladım

function get_all_filters_and_actions( $path = '' )
{
    //Check if we have a path, if not, return false
    if ( !$path ) 
        return false;

    // Validate and sanitize path
    $path = filter_var( $path, FILTER_SANITIZE_URL );
    /**
     * If valiadtion fails, return false
     *
     * You can add an error message of something here to tell
     * the user that the URL validation failed
     */
    if ( !$path ) 
        return false;

    // Get each php file from the directory or URL  
    $dir   = new RecursiveDirectoryIterator( $path );
    $flat  = new RecursiveIteratorIterator( $dir );
    $files = new RegexIterator( $flat, '/\.php$/i' );

    if ( $files ) {

        $output = '';
        foreach($files as $name=>$file) {
            /**
             * Match and return all instances of apply_filters(**) or do_action(**)
             * The regex will match the following
             * - Any depth of nesting of parentheses, so apply_filters( 'filter_name', parameter( 1,2 ) ) will be matched
             * - Whitespaces that might exist between apply_filters or do_action and the first parentheses
             */
            // Use file_get_contents to get contents of the php file
            $get_file_content =  file_get_contents( $file );
            // Use htmlspecialchars() to avoid HTML in filters from rendering in page
            $save_content = htmlspecialchars( $get_file_content );
            preg_match_all( '/(apply_filters|do_action)\s*(\([^()]*(?:(?-1)[^()]*)*+\))/', $save_content, $matches );

            // Build an array to hold the file name as key and apply_filters/do_action values as value
            if ( $matches[0] )
                $array[$name] = $matches[0];
        }
        foreach ( $array as $file_name=>$value ) {

            $output .= '<ul>';
                $output .= '<strong>File Path: ' . $file_name .'</strong></br>';
                $output .= 'The following filters and/or actions are available';
                foreach ( $value as $k=>$v ) {
                    $output .= '<li>' . $v . '</li>';
                }
            $output .= '</ul>';
        }
        return $output;
    }

    return false;
}

Takipte bir şablon, ön uç veya arka uçta kullanabilirsiniz

echo get_all_filters_and_actions( 'E:\xammp\htdocs\wordpress\wp-includes' );

Bu yazdırılacak

resim açıklamasını buraya girin

SEÇENEK 2

Bu seçeneğin çalışması biraz daha pahalıdır. Bu işlev, filtrenin / eylemin bulunabileceği satır numarasını döndürür.

Burada filedosyayı bir diziye patlatmak için kullanırız , ardından filtreyi / işlemi ve satır numarasını arar ve döndürürüz

function get_all_filters_and_actions2( $path = '' )
{
    //Check if we have a path, if not, return false
    if ( !$path ) 
        return false;

    // Validate and sanitize path
    $path = filter_var( $path, FILTER_SANITIZE_URL );
    /**
     * If valiadtion fails, return false
     *
     * You can add an error message of something here to tell
     * the user that the URL validation failed
     */
    if ( !$path ) 
        return false;

    // Get each php file from the directory or URL  
    $dir   = new RecursiveDirectoryIterator( $path );
    $flat  = new RecursiveIteratorIterator( $dir );
    $files = new RegexIterator( $flat, '/\.php$/i' );

    if ( $files ) {

        $output = '';
        $array  = [];
        foreach($files as $name=>$file) {
            /**
             * Match and return all instances of apply_filters(**) or do_action(**)
             * The regex will match the following
             * - Any depth of nesting of parentheses, so apply_filters( 'filter_name', parameter( 1,2 ) ) will be matched
             * - Whitespaces that might exist between apply_filters or do_action and the first parentheses
             */
            // Use file_get_contents to get contents of the php file
            $get_file_contents =  file( $file );
            foreach ( $get_file_contents as  $key=>$get_file_content ) {
                preg_match_all( '/(apply_filters|do_action)\s*(\([^()]*(?:(?-1)[^()]*)*+\))/', $get_file_content, $matches );

                if ( $matches[0] )
                    $array[$name][$key+1] = $matches[0];
            }
        }

        if ( $array ) {
            foreach ( $array as $file_name=>$values ) {
                $output .= '<ul>';
                    $output .= '<strong>File Path: ' . $file_name .'</strong></br>';
                    $output .= 'The following filters and/or actions are available';

                    foreach ( $values as $line_number=>$string ) {
                        $whitespaces = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
                        $output .= '<li>Line reference ' . $line_number . $whitespaces . $string[0] . '</li>';
                    }
                $output .= '</ul>';
            }
        }
        return $output;

    }

    return false;
}

Takipte bir şablon, ön uç veya arka uçta kullanabilirsiniz

echo get_all_filters_and_actions2( 'E:\xammp\htdocs\wordpress\wp-includes' );

Bu yazdırılacak

resim açıklamasını buraya girin

DÜZENLE

Bu temelde komut dosyaları zaman aşımına uğramadan ya da bellek tükenmeden yapabildiğim kadarıyla. Seçenek 2'deki kodla, kaynak koddaki adı geçen dosyaya ve adı geçen satıra gitmek kadar kolaydır ve daha sonra filtrenin / eylemin tüm geçerli parametre değerlerini almak, ayrıca, filtre / eylem kullanılır


1
çok fazla boş zamanınız var;) ama sonunda filtrelerin ne olduğunu bilmek değil, aynı zamanda beklenen parametre değerlerinin ve sonuçlarının ne olduğunu bilmek asla yeterli değildir ve bu durumda doc bloğunu almak için kısıtlama olmadan kaynaktan elde edilemez. ve muhtemelen çekirdek olmayan eklentiler ve temalarda kullanılamaz.
Mark Kaplun

1
@ MarkKaplun bu sadece hızlı bir şekilde üzerinde çalıştım :-). Yukarıdaki işlevler en azından filtrelerin ve işlemlerin belirli eklenti / tema / çekirdek dizinlerinde nerede olduğunu gösterir. Kaynağa geri dönmek ve belirli bir filtrenin özellikle ne yaptığını anladığınızdan emin olmak hala çok önemlidir. Bazı eklentiler ve temalar kötü bir şekilde belgelenmiştir, bu nedenle belirli bir filtrenin belirli bir işlevde ne yaptığını bilmek veya anlamak için hala bir çeşit bilgi ve arka plana ihtiyacınız olacaktır ;-)
Pieter Goosen

@PieterGoosen Evet kaynağa bakmak için içeri atlamakta genellikle iyiyim. Bunu ilk etapta yapıyorsam, eklentinin kancaları var ama onlar için doktor blokları olması gerekmez. Ama gerçekte nerede kullanıldıklarına bir göz atarsam değerli olup olmadıklarını anlamama yardımcı olur. Her neyse, bunlar harika olabilir gibi görünüyor. Hatta sadece bir HTML dosyasına yazmak için onları değiştirebilirim, çünkü o zaman sadece yerel sunucudaki bir MU Eklentisinde işlev bildirimini yapıştırabilir ve WP CLI'den çalıştırabilirim.
yonatron

@yonatron İki sentimin bir şekilde yardım ettiğine sevindim. Kendi modifikasyonumu kodumdan yazmak için gelirseniz, kodunuzu ve açıklamanızı her zaman cevap olarak ekleyebilirsiniz ( ki bu harika olacak ) ;-). Keyfini çıkarın
Pieter Goosen

1
@PieterGoosen Bu senaryoyu yazmak ve belgelemek için ne kadar zaman harcadığınızı, müthiş ***** gosh :)
Webloper

6

Gibi Sesler WP Ayrıştırıcı aradığınız yapar. Resmi geliştirici referansını oluşturmak için kullanılır . Parametreleri, since etiketlerini ve kaynağa referansları listeler. Tüm WordPress eklentileri ile çalışır ve komut satırı üzerinden erişilebilir:

wp parser create /path/to/source/code --user=<id|login>

1
Bu komut dosyasına çok aşina değilim, ancak iyi belgelenmesi için bir filtreye veya eyleme ihtiyacı var gibi görünüyor. @Rarst ;-)
Pieter Goosen

Henüz denemedim, ancak açıklamaya dayanarak, Pieter'in endişesinin hedef olduğunu düşünüyorum. Tüm kancaları bulmak istiyorum, sadece iyi biçimlendirilmiş doktor bloklarından önce olanları değil. WordPress kurallarını kullanarak kancalarını / işlevlerini yorumlamak için zaman ayıran insanlar zaten bu tür komut dosyalarını çalıştırıyor ve destek sitelerinde API referansları yayınlıyorlar. Bir geliştiricinin bir filtreyi herkese açık bir şekilde dokümante etmediği takdirde, uyarı vermeden değiştirilebileceği / kullanımdan kaldırılabileceği için bunun bazı riskleri olduğunu biliyorum, ancak kullandığım bazı eklentiler için dokümanların çevrimiçi görünmesini bekleyemiyorum.
yonatron

Ayrıca belgelenmemiş kancaları ayrıştırır. Örnek: developer.wordpress.org/reference/hooks/graceful_fail
Jan Beck

4

Hızlı ve Öfkeli

İyi ol ' *nixkomut satırı her zaman kullanışlıdır:

# grep  --line-number                                         \
        --exclude-dir=/path/to/some/directory                 \
        --include=*.php                                       \ 
        --recursive                                           \
        "add_filter\|do_action\|apply_filters"                \
        /path/to/wp-content/plugins/some-plugin               \ 
 | less

Üzerinden çok daha fazla seçenek #man grep.

Sonra basit bir bash betiği bile oluşturabiliriz wp-search.sh:

#!/bash/bin
grep --line-number                            \
    --exclude-dir=/path/to/some/directory     \
    --include=*.$1                            \
    --recursive $2 $3

ve ile çalıştırın.

 # bash wp-search.sh php "add_filter\|do_action\|apply_filters" /path/to/some-plugin

Güzel çıktı

--colorÖzniteliğini çıktısını renklendirmek için kullanabiliriz grep, ancak bununla çalışmayacağını unutmayın less.

Başka bir seçenek, arama sonuçları için bir HTML tablosu oluşturmak olacaktır.

İşte awkarama sonuçlarını bir HTML tablosu olarak results.htmldosyaya çıkaran bir örnek oluşturdum :

  | sed 's/:/: /2' \
  | awk ' \
        BEGIN { \
            print "<table><tr><th>Results</th><th>Location</th></tr>"  \
        } \
        { \
            $1=$1; location=$1; $1=""; print "<tr><td>" $0 "</td><td>" location "</td><tr>" \
        } \
        END {  \
           print "</table>" \
       }' \
 > results.html

Kullandığım nerede bu hileyi tüm önde gelen beyaz boşluk kaldırmak için ve bu bir tüm alanları ancak ilkini yazdırmak için.

sedBurada, ikinci boşluktan ( :) sonra fazladan boşluk eklemek için kullanıyorum .

Senaryo

Bunu wp-search.shsenaryomuza ekleyebiliriz :

#!/bash/bin
grep   --with-filename \
       --line-number \
       --exclude-dir=/path/to/some/directory \
       --include=*.$1 \
       --recursive $2 $3 \
| sed 's/:/: /2' \
| awk ' BEGIN { \
        print "<table><tr><th>Results</th><th>Location</th></tr>"  \
    } \
    { \
        $1=$1; location=$1; $1=""; print "<tr><td>" $0 "</td><td>" location "</td><tr>" \
    } \
    END {  \
        print "</table>" \
    }' \
> /path/to/results.html

/path/to/some/directoryve /path/to/results.htmlihtiyaçlarınıza göre ayarlamanız gerekir.

Örnek - Eklenti arama

Bunu wordpress-importereklentide şu şekilde denersek:

bash wp-search.sh php "add_filter\|do_action" /path/to/wp-content/plugins/wordpress-importer/

Daha sonra results.htmldosya olarak görüntüler:

Sonuçlar

Örnek - Çekirdeğin aranması

Ben çekirdek için zaman test:

time bash wp-search.sh php "add_filter\|do_action" /path/to/wordpress/core/

real    0m0.083s
user    0m0.067s
sys     0m0.017s

ve hızlı!

notlar

Ekstra bağlam elde etmek için -C NUMBERgrep'i kullanabiliriz .

HTML çıktısını çeşitli şekillerde değiştirebiliriz, ancak umarım bunu ihtiyaçlarınıza göre daha fazla ayarlayabilirsiniz.


Teşekkürler! Grep'i bir tutamda kullanıyorum, ancak kabuklu şeylerde o kadar acemi oldum ki OR için boruları kullanmak için hiç yuvarlak olmadım. Eklemek istediğim diğer bir şey de, onu biraz yazdırmak için seçenekler. Yukarıdaki grep hattının çıktısının hala kayması oldukça zor olacak.
yonatron

2
Cevabı oldukça güzel bir baskı @yonatron örneği ile güncelledim
Birgire
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.