Tạo tham chiếu hook không hoạt động


10

Có vẻ như rất nhiều nhà phát triển plugin dành thời gian để thêm các móc lọc / hành động để cho phép người dùng điều chỉnh chức năng của sản phẩm. Điều này thật tuyệt, nhưng những gì họ thường không làm là cung cấp một danh sách các hook và số lượng đối số họ đưa ra.

Có ai tìm thấy cách tự động tốt nhất để trỏ vào thư mục plugin (hoặc chủ đề) và xem danh sách tất cả các hook có sẵn không?

Tôi dường như có một số plugin quét các hook, nhưng theo như tôi có thể nói, chúng cho bạn thấy những plugin nào thực sự được gọi để hiển thị một trang nhất định. Mà tôi nhận được có thể có ích. Nhưng đôi khi nếu tôi biết tôi đang tương tác với một plugin cụ thể, tôi muốn biết mọi nơi nó có thể cho phép tôi thực hiện một hành động hoặc bộ lọc.

Vì vậy, những gì tôi thực sự tìm kiếm là một cái gì đó, được cung cấp một thư mục gốc plugin sẽ tạo ra một danh sách trong đó mỗi mục bao gồm:

  • nhãn
  • loại (hành động hoặc bộ lọc)
  • số lượng đối số
  • nơi nó được gọi (thông qua do_action()hoặc apply_filter()) trong nguồn

Một tập lệnh sẽ rất tuyệt vì điều này có lẽ có thể HTMLify toàn bộ nội dung và hiển thị nó cho tôi ngay trong giao diện người dùng quản trị cho mọi plugin. Nhưng ngay cả một tập lệnh dòng lệnh xuất ra một tệp tĩnh hữu ích cũng sẽ rất tuyệt.


vậy câu hỏi là gì? nếu bạn tìm kiếm một đề xuất plugin thì nó không có chủ đề ở đây
Mark Kaplun 6/10/2015

Xin lỗi, không muốn đi quá xa vào cỏ dại Phát triển WordPress , nhưng a) Tôi mới ở đây vì vậy tôi không nhận ra rằng việc yêu cầu các đề xuất plugin là OT. Tôi có thể có một số ý kiến ​​về vấn đề đó, nhưng tôi vẫn nên nhận ra điều đó trước tiên. b) OTOH, tôi chỉ đang cố gắng tìm bất kỳ giải pháp nào cho câu hỏi của mình, cho dù là một plugin hoặc tập lệnh shell hiện có, hoặc một cái gì đó từ đầu. Vì vậy, câu hỏi hoàn toàn là một yêu cầu đề xuất plugin!
yonatron 7/10/2015

tốt, có vẻ như mọi người khác đang vui vẻ nên không có hại gì. "Sự phản đối" của tôi đối với câu hỏi thực ra là về câu hỏi phân tích văn bản gây khó chịu cho những người thích viết phần mềm kiểu trình biên dịch nhưng rất ít liên quan đến mã hóa wordpress thực tế. Đối với hồ sơ, ngay cả những câu hỏi về wordpress.org như cách gửi plugin thường sẽ được bình chọn là ngoài chủ đề.
Đánh dấu Kaplun

Câu trả lời:


6

Không có kịch bản hoặc plugin mà tôi biết để làm những gì bạn muốn. Như bạn đã nêu, có các tập lệnh ( thậm chí là các biến toàn cục ) mà bạn có thể sử dụng để in các bộ lọc và hành động hiện đang được sử dụng.

Đối với các bộ lọc và hành động không hoạt động, tôi đã viết hai hàm rất cơ bản ( với một số trợ giúp ở đây và ở đó ) để tìm tất cả apply_filtersvà các do_actionthể hiện trong một tệp và sau đó in ra

CƠ BẢN

  • Chúng tôi sẽ sử dụng RecursiveDirectoryIterator, RecursiveIteratorIteratorRegexIteratorcác lớp học PHP để có được tất cả các file PHP trong một thư mục. Ví dụ, trên localhost của tôi, tôi đã sử dụngE:\xammp\htdocs\wordpress\wp-includes

  • Sau đó chúng tôi sẽ lặp qua các tệp, và tìm kiếm và trả về ( preg_match_all) tất cả các phiên bản của apply_filtersdo_action. Tôi đã thiết lập nó để khớp với các trường hợp dấu ngoặc đơn lồng nhau và cũng để khớp với các khoảng trắng có thể có giữa apply_filters/ do_actionvà dấu ngoặc đơn đầu tiên

Chúng tôi sẽ đơn giản sau đó tạo một mảng với tất cả các bộ lọc và hành động, sau đó lặp qua mảng đó và xuất tên tệp cũng như các bộ lọc và hành động. Chúng tôi sẽ bỏ qua các tệp mà không có bộ lọc / hành động

THÔNG BÁO QUAN TRỌNG

  • Chức năng này rất tốn kém. Chạy chúng chỉ trên một cài đặt thử nghiệm cục bộ.

  • Sửa đổi các chức năng khi cần thiết. Bạn có thể quyết định ghi đầu ra vào một tệp, tạo một trang phụ trợ đặc biệt cho điều đó, các tùy chọn là không giới hạn

LỰA CHỌN 1

Hàm tùy chọn đầu tiên rất đơn giản, chúng tôi sẽ trả về nội dung của tệp dưới dạng chuỗi bằng cách sử dụng file_get_contents, tìm kiếm apply_filters/ do_actionthể hiện và chỉ cần xuất tên tệp và tên bộ lọc / hành động

Tôi đã nhận xét mã để dễ theo dõi

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

Bạn có thể sử dụng theo dõi trên một mẫu, frontend hoặc phụ trợ

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

Cái này sẽ in

nhập mô tả hình ảnh ở đây

LỰA CHỌN 2

Tùy chọn này đắt hơn một chút để chạy. Hàm này trả về số dòng nơi bộ lọc / hành động có thể được tìm thấy.

Ở đây chúng tôi sử dụng fileđể phát nổ tệp thành một mảng, sau đó chúng tôi tìm kiếm và trả về bộ lọc / hành động và số dòng

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

Bạn có thể sử dụng theo dõi trên một mẫu, frontend hoặc phụ trợ

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

Cái này sẽ in

nhập mô tả hình ảnh ở đây

BIÊN TẬP

Điều này về cơ bản là nhiều như tôi có thể làm mà không có kịch bản hết thời gian hoặc hết bộ nhớ. Với mã trong tùy chọn 2, thật dễ dàng như đi đến tệp đã nói và dòng đã nói trong mã nguồn và sau đó nhận tất cả các giá trị tham số hợp lệ của bộ lọc / hành động, quan trọng là, có được hàm và ngữ cảnh xa hơn trong đó bộ lọc / hành động được sử dụng


1
bạn có quá nhiều thời gian rảnh;) nhưng cuối cùng không bao giờ đủ để biết các bộ lọc là gì mà còn các giá trị và kết quả tham số dự kiến ​​là gì và điều này không thể đạt được từ nguồn mà không cần bactracking để có được khối tài liệu trong trường hợp các tệp cốt lõi và có lẽ hoàn toàn không có trong các plugin và chủ đề không phải lõi.
Đánh dấu Kaplun

1
@MarkKaplun đây chỉ là thứ tôi đã nhanh chóng làm việc trên :-). Các chức năng trên ít nhất cho bạn biết các bộ lọc và hành động nằm trong các thư mục plugin / theme / core cụ thể. Việc quay lại nguồn vẫn rất quan trọng và đảm bảo bạn hiểu những gì một bộ lọc cụ thể làm cụ thể. Một số plugin và chủ đề được ghi lại kém, vì vậy bạn vẫn sẽ cần một số loại kiến ​​thức và nền tảng để biết hoặc tìm hiểu xem bộ lọc cụ thể làm gì trong một chức năng cụ thể ;-)
Pieter Goosen 7/10/2015

@PieterGoosen Vâng, tôi thường ổn khi quay lại để xem nguồn. Nếu tôi đang làm điều này ở nơi đầu tiên, điều đó có nghĩa là plugin có các hook nhưng không nhất thiết phải là khối tài liệu cho chúng. Nhưng nếu tôi nhìn vào nơi chúng thực sự được sử dụng, nó sẽ giúp tôi hiểu được liệu chúng có giá trị hay không. Dù sao những thứ này trông giống như chúng có thể là tuyệt vời. Tôi thậm chí có thể sửa đổi chúng lần thứ 2 để chỉ ghi vào tệp HTML vì sau đó tôi có thể chỉ cần dán khai báo hàm trong Plugin MU trên máy chủ cục bộ và chạy nó từ WP CLI.
yonatron 7/10/2015

@yonatron Vui mừng vì hai xu của tôi giúp theo một cách nào đó. Nếu bạn từng đến để viết sửa đổi của riêng bạn từ mã của tôi, bạn luôn có thể thêm mã và giải thích của mình dưới dạng câu trả lời ( sẽ rất tuyệt ) ;-). Thưởng thức
Pieter Goosen 7/10/2015

1
@PieterGoosen bạn đã mất bao nhiêu thời gian để viết kịch bản này cũng như viết tài liệu, thật tuyệt vời ***** :)
Webloper 7/10/2015

6

Âm thanh như WP Parser làm những gì bạn đang tìm kiếm. Nó được sử dụng để tạo tài liệu tham khảo chính thức cho nhà phát triển . Nó liệt kê các tham số, thẻ @since và tham chiếu đến nguồn. Nó hoạt động với tất cả các plugin WordPress và có thể được truy cập thông qua dòng lệnh:

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

1
Tôi không quen thuộc với kịch bản đó, nhưng có vẻ như nó cần một bộ lọc hoặc hành động để được ghi lại tốt. Sẽ đánh giá cao phản hồi về điều này từ @Rarst ;-)
Pieter Goosen 7/10/2015

Tôi chưa thử, nhưng dựa trên mô tả, tôi nghĩ rằng mối quan tâm của Peter là mục tiêu. Tôi muốn tìm tất cả các hook, không chỉ các hook trước các khối doc được định dạng tốt. Tôi nghĩ rằng những người dành thời gian để nhận xét các hook / hàm của họ bằng cách sử dụng các quy ước WordPress đã chạy loại tập lệnh này và xuất bản các tài liệu tham khảo API trên các trang web hỗ trợ của họ. Tôi nhận thấy có một số rủi ro cố hữu trong việc này, vì nếu nhà phát triển không công khai tài liệu bộ lọc, nó có thể bị thay đổi / không được cảnh báo, nhưng đối với một số plugin tôi sử dụng, tôi không thể chờ đợi các tài liệu xuất hiện trực tuyến.
yonatron

Nó cũng phân tích các móc không có giấy tờ. Ví dụ: developer.wordpress.org/reference/hooks/graceful_fail
Jan Beck

4

Nhanh và tức giận

Dòng *nixlệnh ol 'tốt luôn tiện dụng:

# 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

Nhiều lựa chọn hơn thông qua #man grep.

Sau đó, chúng ta thậm chí có thể tạo một tập lệnh bash đơn giản wp-search.sh:

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

và chạy nó với.

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

Sản lượng khá

Chúng ta có thể sử dụng --colorthuộc tính để tô màu đầu ra của grep, nhưng lưu ý rằng nó sẽ không hoạt động less.

Một tùy chọn khác là tạo bảng HTML cho kết quả tìm kiếm.

Dưới đây là một awkví dụ tôi đã xây dựng để đưa ra kết quả tìm kiếm dưới dạng bảng HTML vào results.htmltệp:

  | 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

trong đó tôi đã sử dụng thủ thuật này để loại bỏ tất cả khoảng trắng hàng đầu và cái này để in tất cả các trường trừ trường đầu tiên.

Tôi sử dụng sedở đây chỉ để thêm không gian sau dấu hai chấm ( :), trong trường hợp không có khoảng trống ở đó.

Kịch bản

Chúng tôi có thể thêm điều này vào wp-search.shkịch bản của chúng tôi :

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

nơi bạn phải điều chỉnh /path/to/some/directory/path/to/results.htmltheo nhu cầu của bạn.

Ví dụ - Tìm kiếm plugin

Nếu chúng tôi thử điều này trên wordpress-importerplugin với:

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

sau đó results.htmltệp sẽ hiển thị dưới dạng:

các kết quả

Ví dụ - Tìm kiếm lõi

Tôi đã thử nghiệm nó cho lõi:

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

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

và nó rất nhanh!

Ghi chú

Để có thêm bối cảnh, chúng tôi có thể sử dụng -C NUMBERgrep.

Chúng tôi có thể sửa đổi đầu ra HTML theo nhiều cách khác nhau, nhưng hy vọng bạn có thể điều chỉnh điều này hơn nữa theo nhu cầu của mình.


Cảm ơn! Tôi sử dụng grep trong một nhúm nhưng tôi là một người mới làm quen với công cụ vỏ mà tôi thậm chí không bao giờ có thể sử dụng các đường ống cho OR. Một điều khác tôi muốn thêm mặc dù là các tùy chọn để in nó một chút. Đầu ra của dòng grep trên vẫn còn khá khó để lướt qua.
yonatron 7/10/2015

2
Tôi đã cập nhật câu trả lời với một ví dụ về bản in đẹp @yonatron
birgire
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.