生成休眠挂接引用

时间:2015-10-04 作者:yonatron

似乎很多插件开发人员都会花时间添加过滤器/动作挂钩,让用户调整产品的功能。这很好,但他们通常不做的是提供一个钩子列表,以及它们接受了多少个参数。

是否有人找到了指向插件(或主题)目录并查看所有可用挂钩列表的最佳自动化方法?

我看到了一些可以扫描钩子的插件,但据我所知,它们会显示哪些插件实际上是被调用来呈现给定页面的。我得到的可能很方便。但有时,如果我知道我正在与一个特定的插件交互,我想知道它可能让我钩住一个动作或过滤器的每个地方。

因此,我真正想要的是,给定一个插件根目录,将创建一个列表,其中每个项目包括:

标记类型(操作或筛选器)

  • 参数数量(通过do_action()apply_filter()) 在源代码中,一个脚本会很棒,因为它可以很好地将整个事情HTML化,并在每个插件的管理UI中显示给我。但即使是一个输出有用静态文件的命令行脚本也会很好。

  • 3 个回复
    SO网友:Pieter Goosen

    据我所知,没有任何脚本或插件可以满足您的需要。如前所述,有一些脚本(甚至是全局变量)可用于打印当前使用的筛选器和操作。

    至于休眠过滤器和操作,我编写了两个非常基本的函数(,在这里和那里都有一些帮助),它在文件中查找所有的应用过滤器和执行操作实例,然后将其打印出来

    基础知识我们将使用递归目录迭代器、递归迭代器和正则迭代器PHP类来获取目录中的所有PHP文件。例如,在本地主机上,我使用了E:\\xammp\\htdocs\\wordpress\\wp includes

    然后,我们将遍历这些文件,搜索并返回(preg\\u match\\u all)所有应用过滤器和执行操作的实例。我已经将其设置为匹配括号的嵌套实例,还可以匹配应用过滤器和第一个括号之间可能的空格

    我们将简单地创建一个包含所有筛选器和操作的数组,然后遍历该数组并输出文件名、筛选器和操作。我们将跳过没有筛选器/操作的文件

    重要注意事项此功能非常昂贵。仅在本地测试安装上运行它们。

    根据需要修改功能。您可以决定将输出写入文件,为此创建一个特殊的后端页面,选项是无限的

    第一个选项功能非常简单,我们将使用file\\u get\\u contents以字符串形式返回文件内容,搜索应用过滤器实例,并简单地输出文件名和过滤器/操作名称

    我对代码进行了注释,以便于后续操作

    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;
    }
    
    您可以在后续模板、前端或后端使用

    echo get_all_filters_and_actions( \'E:\\xammp\\htdocs\\wordpress\\wp-includes\' );
    
    这将打印

    enter image description here

    选项2运行此选项的成本稍高。此函数返回可以找到筛选器/操作的行号。

    在这里,我们使用文件将文件分解为一个数组,然后搜索并返回过滤器/操作和行号

    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;
    }
    
    您可以在后续模板、前端或后端使用

    echo get_all_filters_and_actions2( \'E:\\xammp\\htdocs\\wordpress\\wp-includes\' );
    
    这将打印

    enter image description here

    编辑这基本上是我在没有脚本超时或内存不足的情况下所能做的。使用选项2中的代码,只需访问源代码中的所述文件和所述行,然后获取过滤器/操作的所有有效参数值,同样重要的是,获取使用过滤器/操作的函数和其他上下文

    SO网友:Jan Beck

    听起来像WP Parser 做你想做的事。用于生成官方developer reference. 它列出参数、@自标记和对源的引用。它适用于所有WordPress插件,可以通过命令行访问:

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

    SO网友:birgire

    速度和激情*nix 命令行总是很方便:

    # 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
    
    更多选项通过#man grep.

    然后我们甚至可以创建一个简单的bash脚本wp-search.sh:

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

     # bash wp-search.sh php "add_filter\\|do_action\\|apply_filters" /path/to/some-plugin
    
    漂亮的输出我们可以使用--color 属性为的输出着色grep, 但请注意,它不会与less.

    另一种选择是为搜索结果生成HTML表。

    这是一个awk 我构建的示例将搜索结果作为HTML表输出到results.html 文件:

      | 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
    
    我使用过的地方this trick 要删除所有前导空格,请执行以下操作:this one 打印除第一个字段外的所有字段。

    我使用sed 此处仅在第二个冒号后添加额外的空格(:), 以防万一那里没有空间。

    我们可以将此脚本添加到wp-search.sh 脚本:

    #!/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/directory/path/to/results.html 满足您的需求。

    示例-如果我们在wordpress-importer 插件具有:

    bash wp-search.sh php "add_filter\\|do_action" /path/to/wp-content/plugins/wordpress-importer/
    
    然后results.html 文件将显示为:

    results

    示例-搜索岩芯

    我对岩芯进行了时间测试:

    time bash wp-search.sh php "add_filter\\|do_action" /path/to/wordpress/core/
    
    real    0m0.083s
    user    0m0.067s
    sys     0m0.017s
    
    而且速度很快!

    注意:为了获得额外的上下文,我们可以使用-C NUMBER 格雷普的。

    我们可以用各种方式修改HTML输出,但希望您可以根据需要进一步调整。

    相关推荐

    更新页面(update-core.php)和插件页面(plugins.php)恢复到主页

    我在Wordpress网站的管理视图中收到通知,我有一个网站和插件的可用更新(在我的网络管理仪表板中,在“插件”和“更新”旁边的红色圆圈中有“1”)。。。但当我尝试同时转到“更新”页和;插件页面,是否显示主页?此时的URL为http:///wp-admin/network/update-core.php/和http:///wp-admin/plugins.php/分别地因此,我永远无法到达真正的更新页面,也无法更新我的Wordpress或插件。如何显示更新或插件页面?