Buat referensi kait yang tidak aktif

10

Tampaknya banyak pengembang plugin meluangkan waktu untuk menambahkan filter / tindakan kait untuk membiarkan pengguna mengubah fungsi produk mereka. Itu bagus, tetapi yang sering tidak mereka lakukan adalah memberikan daftar kait dan berapa banyak argumen yang mereka ambil.

Adakah yang menemukan cara otomatis terbaik untuk menunjuk pada direktori plugin (atau tema) dan melihat daftar semua kait yang tersedia?

Saya telah melihat beberapa plugin yang memindai kait, tetapi sejauh yang saya tahu, mereka menunjukkan kepada Anda mana yang sebenarnya dipanggil untuk memberikan halaman tertentu. Yang saya dapatkan bisa berguna. Tetapi kadang-kadang jika saya tahu saya berinteraksi dengan plugin tertentu, saya ingin tahu setiap tempat yang memungkinkan saya menghubungkan tindakan atau filter.

Jadi yang saya cari sebenarnya adalah sesuatu yang diberi direktori root plugin akan membuat daftar di mana setiap item termasuk:

  • menandai
  • ketik (tindakan atau filter)
  • sejumlah argumen
  • tempat itu disebut (melalui do_action()atau apply_filter()) di sumber

Sebuah skrip akan menjadi hebat karena ini mungkin bisa dengan baik HTMLify semuanya dan menunjukkan kepada saya tepat di UI admin untuk setiap plugin. Tetapi bahkan skrip baris perintah yang menghasilkan file statis yang berguna akan bagus.

yonatron
sumber
jadi apa pertanyaannya? jika Anda mencari rekomendasi plugin maka itu di luar topik di sini
Mark Kaplun
Maaf, tidak ingin terlalu jauh ke dalam gulma Meta Development WordPress , tetapi a) Saya baru di sini jadi saya tidak menyadari bahwa meminta rekomendasi plugin adalah PL. Saya mungkin memiliki ... beberapa pendapat ... tentang itu, tetapi tetap saja, saya harus menyadarinya terlebih dahulu. b) OTOH, saya hanya mencoba mencari solusi untuk pertanyaan saya, apakah plugin atau skrip shell yang ada, atau sesuatu dari awal. Jadi pertanyaannya adalah ketat permintaan rekomendasi Plugin!
yonatron
well, sepertinya semua orang bersenang-senang jadi tidak ada salahnya dilakukan. "Keberatan" saya untuk pertanyaan itu sebenarnya lebih tentang itu menjadi pertanyaan penguraian teks yang menarik bagi orang-orang yang suka menulis perangkat lunak gaya kompiler tetapi sangat sedikit hubungannya dengan pengkodean wordpress yang sebenarnya. Sebagai catatan, pertanyaan yang berhubungan dengan wordpress.org seperti cara mengirim plugin biasanya akan dipilih sebagai di luar topik.
Mark Kaplun

Jawaban:

6

Tidak ada skrip atau plugin yang saya tahu melakukan apa yang Anda inginkan. Seperti yang telah Anda nyatakan, ada skrip ( bahkan variabel global ) yang dapat Anda gunakan untuk mencetak filter dan tindakan yang sedang digunakan.

Adapun filter dan tindakan aktif, saya telah menulis dua fungsi yang sangat mendasar ( dengan bantuan di sana-sini ) yang menemukan semua apply_filtersdan do_actioncontoh dalam file dan kemudian mencetaknya

DASAR-DASAR

  • Kami akan menggunakan RecursiveDirectoryIterator,, RecursiveIteratorIteratordan RegexIteratorkelas PHP untuk mendapatkan semua file PHP dalam direktori. Sebagai contoh, di localhost saya, saya telah menggunakanE:\xammp\htdocs\wordpress\wp-includes

  • Kami kemudian akan mengulang file, dan mencari dan mengembalikan ( preg_match_all) semua contoh dari apply_filtersdan do_action. Saya telah mengaturnya agar sesuai dengan instance kurung yang disarangkan dan juga untuk mencocokkan spasi putih yang mungkin antara apply_filters/ do_actiondan kurung pertama

Kami akan sederhana kemudian membuat array dengan semua filter dan tindakan dan kemudian loop melalui array dan menampilkan nama file dan filter dan tindakan. Kami akan melewati file tanpa filter / tindakan

CATATAN PENTING

  • Fungsi ini sangat mahal. Jalankan hanya pada instalasi tes lokal.

  • Ubah fungsi sesuai kebutuhan. Anda dapat memutuskan untuk menulis output ke file, membuat halaman backend khusus untuk itu, opsi tidak terbatas

PILIHAN 1

Fungsi opsi pertama sangat sederhana, kami akan mengembalikan konten file sebagai string menggunakan file_get_contents, mencari apply_filters/ do_actioninstance dan hanya menampilkan nama file dan nama filter / tindakan

Saya telah berkomentar kode untuk mudah diikuti

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

Anda dapat menggunakan follow pada templat, frontend atau backend

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

Ini akan dicetak

masukkan deskripsi gambar di sini

PILIHAN 2

Opsi ini sedikit lebih mahal untuk dijalankan. Fungsi ini mengembalikan nomor baris tempat filter / tindakan dapat ditemukan.

Di sini kita gunakan fileuntuk meledakkan file menjadi array, lalu kita mencari dan mengembalikan filter / tindakan dan nomor baris

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

Anda dapat menggunakan follow pada templat, frontend atau backend

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

Ini akan dicetak

masukkan deskripsi gambar di sini

EDIT

Ini pada dasarnya sebanyak yang saya bisa lakukan tanpa waktu skrip habis atau kehabisan memori. Dengan kode pada opsi 2, semudah pergi ke file tersebut dan mengatakan baris dalam kode sumber dan kemudian mendapatkan semua nilai parameter yang valid dari filter / action, juga, yang penting, dapatkan fungsi dan konteks lebih lanjut di mana filter / aksi digunakan

Pieter Goosen
sumber
1
Anda memiliki terlalu banyak waktu luang;) tetapi pada akhirnya tidak pernah cukup untuk mengetahui apa saja filter tetapi juga apa nilai parameter yang diharapkan dan hasil dan ini tidak dapat dicapai dari sumber tanpa bactracking untuk mendapatkan blok doc jika file inti dan mungkin tidak tersedia sama sekali dalam plugin dan tema non inti.
Mark Kaplun
1
@MarkKaplun ini hanya sesuatu yang saya cepat kerjakan :-). Fungsi-fungsi di atas setidaknya memberi tahu Anda di mana filter dan tindakan berada di direktori plugin / tema / inti tertentu. Tetap sangat penting untuk kembali ke sumber dan pastikan Anda memahami apa yang dilakukan filter spesifik secara spesifik. Beberapa plugin dan tema tidak terdokumentasi dengan baik, jadi Anda masih membutuhkan pengetahuan dan latar belakang untuk mengetahui atau mencari tahu apa yang dilakukan filter spesifik dalam fungsi tertentu ;-)
Pieter Goosen
@PieterGoosen Ya saya biasanya baik-baik saja dengan melompat kembali untuk melihat sumbernya. Jika saya melakukan ini di tempat pertama itu berarti plugin memiliki kait tetapi belum tentu blok doc untuk mereka. Tetapi jika saya melihat di mana mereka benar-benar digunakan itu membantu saya memahami apakah mereka berharga. Bagaimanapun ini terlihat seperti mereka bisa menjadi hebat. Saya bahkan mungkin memodifikasinya ke-2 untuk hanya menulis ke file HTML karena dengan begitu saya bisa menempelkan deklarasi fungsi di Plugin MU pada server lokal dan menjalankannya dari WP CLI.
yonatron
@yonatron Senang bahwa dua sen saya membantu dalam beberapa cara. Jika Anda pernah datang untuk menulis modifikasi Anda sendiri dari kode saya, Anda selalu dapat menambahkan kode dan penjelasan Anda sebagai jawaban ( yang akan luar biasa ) ;-). Selamat Menikmati
Pieter Goosen
1
@PieterGoosen, berapa banyak waktu yang Anda gunakan untuk menulis skrip ini dan juga untuk mendokumentasikan, ya ampun ***** :)
Webloper
6

Kedengarannya seperti WP Parser melakukan apa yang Anda cari. Ini digunakan untuk menghasilkan referensi pengembang resmi . Ini mencantumkan parameter, tag @since dan referensi ke sumber. Ini bekerja dengan semua plugin WordPress dan dapat diakses melalui baris perintah:

wp parser create /path/to/source/code --user=<id|login>
Jan Beck
sumber
1
Saya tidak terlalu terbiasa dengan skrip itu, tetapi sepertinya perlu filter atau tindakan untuk didokumentasikan dengan baik. Sangat menghargai umpan balik ini dari @Rarst ;-)
Pieter Goosen
Saya belum mencobanya, tetapi berdasarkan uraiannya, saya pikir kekhawatiran Pieter tepat sasaran. Saya ingin menemukan semua kait, bukan hanya yang didahului oleh blok dokumen yang diformat dengan baik. Saya pikir orang-orang yang meluangkan waktu untuk mengomentari kaitan / fungsi mereka menggunakan konvensi WordPress sudah menjalankan skrip semacam ini dan menerbitkan referensi API di situs dukungan mereka. Saya menyadari ada beberapa risiko yang melekat dalam hal ini, karena jika pengembang tidak secara publik mendokumentasikan filter, itu bisa diubah / ditinggalkan tanpa peringatan, tetapi untuk beberapa plugin yang saya gunakan, saya tidak bisa menunggu dokumen muncul secara online.
yonatron
Itu juga mem-parsing kait tidak berdokumen. Contoh: developer.wordpress.org/reference/hooks/graceful_fail
Jan Beck
4

Cepat dan geram

Baris *nixperintah yang baik selalu berguna:

# 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

Banyak lagi opsi via #man grep.

Kemudian kita bahkan dapat membuat skrip bash sederhana wp-search.sh:

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

dan jalankan dengan.

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

Output yang cantik

Kita dapat menggunakan --coloratribut untuk mewarnai keluaran grep, tetapi perhatikan bahwa itu tidak akan bekerja dengan less.

Pilihan lain adalah membuat tabel HTML untuk hasil pencarian.

Berikut adalah awkcontoh yang saya buat yang menampilkan hasil pencarian sebagai tabel HTML, ke dalam results.htmlfile:

  | 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

di mana saya menggunakan trik ini untuk menghapus semua spasi putih dan ini untuk mencetak semua bidang tetapi yang pertama.

Saya menggunakan di sedsini hanya untuk menambah ruang setelah kolon kedua ( :), kalau-kalau tidak ada ruang di sana.

Naskah

Kami dapat menambahkan ini ke wp-search.shskrip kami :

#!/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

di mana Anda harus menyesuaikan /path/to/some/directorydan /path/to/results.htmldengan kebutuhan Anda.

Contoh - Mencari plugin

Jika kami mencoba ini di wordpress-importerplugin dengan:

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

maka results.htmlfile tersebut akan ditampilkan sebagai:

hasil

Contoh - Mencari inti

Saya waktu mengujinya untuk intinya:

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

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

dan itu cepat!

Catatan

Untuk mendapatkan konteks tambahan, kita dapat menggunakan -C NUMBERgrep.

Kami dapat memodifikasi output HTML dengan berbagai cara, tetapi mudah-mudahan Anda dapat menyesuaikan ini lebih lanjut dengan kebutuhan Anda.

birgire
sumber
Terima kasih! Saya menggunakan grep dalam keadaan darurat, tetapi saya seorang pemula dalam hal-hal shell yang saya bahkan tidak pernah bisa menggunakan pipa untuk OR. Hal lain yang ingin saya tambahkan adalah pilihan untuk mencetaknya sedikit. Output dari garis grep di atas masih akan cukup sulit untuk skim.
yonatron
2
Saya memperbarui jawabannya dengan contoh print cantik @yonatron
birgire