查找添加到挂钩和筛选器的实际函数

时间:2012-12-20 作者:Josh

我试图找出如何找到分配给挂钩和过滤器的实际函数。

我一直在研究这里提出的其他问题,并找到了一些插件,它们有助于发现显示回调函数名称的add\\u操作和add\\u过滤器。。。但我很难找到实际的函数,所以我可以看到它的功能。它们并不总是与add\\u操作或add\\u筛选器位于同一文件中。

我只是想这样做,以便更好地理解挂钩和过滤器的概念。

例如,这里有一个在短代码中的add\\u操作。php在线335:

add_filter(\'the_content\', \'do_shortcode\', 11); // AFTER wpautop()
这是第144行的实际函数,我希望能够轻松找到这些函数:

function do_shortcode($content) {
    global $shortcode_tags;

    if (empty($shortcode_tags) || !is_array($shortcode_tags))
        return $content;

    $pattern = get_shortcode_regex();
    return preg_replace_callback( "/$pattern/s", \'do_shortcode_tag\', $content );
}
有什么建议吗?

3 个回复
最合适的回答,由SO网友:Rarst 整理而成

这更多的是PHP编程问题,而不是WordPress

如果您对探索WordPress core的功能感兴趣,可以通过多种方式来实现:

食品法典委员会function reference 这是人为维护的-因此它不全面,但可以包含重要功能的附加信息

  • xref 是代码引用,由来自WP源中信息的代码构建QueryPosts (披露-我做到了:)
  • 但如果(当)你开始对一般代码(包括主题和插件)感兴趣,你也需要更多的通用工具:

    编程编辑器/IDE非常善于搜索代码ack;另外,由于您现在对一些非常具体的内容(函数的文件和行)感兴趣,这里是我想到的一段代码(它非常基本,不会向您显示挂钩类和对象方法之类的内容,但对初学者来说可以):

    function show_hook_function_locations( $tag ) {
    
        global $wp_filter;
    
        if ( empty( $wp_filter[$tag] ) )
            return;
    
        foreach ( $wp_filter[$tag] as $priority => $functions ) {
            foreach ( $functions as $function ) {
    
                if ( is_string( $function[\'function\'] ) ) {
    
                    $reflect = new ReflectionFunction( $function[\'function\'] );
                    echo \'Function \' . $function[\'function\'] . \' is in file \' . $reflect->getFileName() . \' on line \' . $reflect->getStartLine() . \'<br />\';
                }
            }
        }
    }
    
    
    // Example use
    show_hook_function_locations( \'the_content\' );
    
    输出示例:

    函数capital\\u P\\u dangit位于文件C:\\server\\www\\dev\\wp includes\\formatting中。php在线3263

    函数do\\u shortcode位于文件C:\\server\\www\\dev\\wp includes\\shortcode中。php在线144

    函数wptexturize位于文件C:\\server\\www\\dev\\wp includes\\formatting中。php第29行

    函数convert\\u smilies位于文件C:\\server\\www\\dev\\wp includes\\formatting中。php在线1756

    函数convert\\u chars位于文件C:\\server\\www\\dev\\wp includes\\formatting中。php在线1077

    函数wpautop位于文件C:\\server\\www\\dev\\wp includes\\formatting中。php在线188

    函数shortcode\\u unautop位于文件C:\\server\\www\\dev\\wp includes\\formatting中。php在线282

    函数prepend\\u附件位于文件C:\\server\\www\\dev\\wp includes\\post template中。php在线1195

    SO网友:s_ha_dum

    你可以做几件事。

    谷歌或the Codex 会让你走很长的路。Adam R. Brown\'s database 是有用的。

    但这些通常不是我喜欢的机制。

    下面将从运行文件的任何目录递归向下搜索文件。

    grep -Rni "function callback_function_name" *

    我就是这样做的。grep 是一个*nix应用程序,几乎可以在任何BSD/Linux设备上找到或安装,如果打开终端,包括Mac。也有Windows克隆/接近版本,但我从未使用过它们。

    SO网友:fuxia

    要查看为特定挂钩注册的回调,请检查$GLOBALS[\'wp_filter\']. 我为此编写了一个小插件:T5 Debug Hook.

    安装完成后,如果使用?hook=NAME.

    实例example.com/?hook=the_content:

    array (
      8 => 
      array (
        \'000000001b2c775b000000006f220833run_shortcode\' => 
        array (
          \'function\' => 
          array (
            0 => 
            WP_Embed::__set_state(array(
               \'handlers\' => 
              array (
                10 => 
                array (
                  \'googlevideo\' => 
                  array (
                    \'regex\' => \'#http://video\\\\.google\\\\.([A-Za-z.]{2,5})/videoplay\\\\?docid=([\\\\d-]+)(.*?)#i\',
                    \'callback\' => \'wp_embed_handler_googlevideo\',
                  ),
                ),
              ),
               \'post_ID\' => NULL,
               \'usecache\' => true,
               \'linkifunknown\' => true,
            )),
            1 => \'run_shortcode\',
          ),
          \'accepted_args\' => 1,
        ),
        \'000000001b2c775b000000006f220833autoembed\' => 
        array (
          \'function\' => 
          array (
            0 => 
            WP_Embed::__set_state(array(
               \'handlers\' => 
              array (
                10 => 
                array (
                  \'googlevideo\' => 
                  array (
                    \'regex\' => \'#http://video\\\\.google\\\\.([A-Za-z.]{2,5})/videoplay\\\\?docid=([\\\\d-]+)(.*?)#i\',
                    \'callback\' => \'wp_embed_handler_googlevideo\',
                  ),
                ),
              ),
               \'post_ID\' => NULL,
               \'usecache\' => true,
               \'linkifunknown\' => true,
            )),
            1 => \'autoembed\',
          ),
          \'accepted_args\' => 1,
        ),
      ),
      10 => 
      array (
        \'wptexturize\' => 
        array (
          \'function\' => \'wptexturize\',
          \'accepted_args\' => 1,
        ),
        \'convert_smilies\' => 
        array (
          \'function\' => \'convert_smilies\',
          \'accepted_args\' => 1,
        ),
        \'convert_chars\' => 
        array (
          \'function\' => \'convert_chars\',
          \'accepted_args\' => 1,
        ),
        \'wpautop\' => 
        array (
          \'function\' => \'wpautop\',
          \'accepted_args\' => 1,
        ),
        \'shortcode_unautop\' => 
        array (
          \'function\' => \'shortcode_unautop\',
          \'accepted_args\' => 1,
        ),
        \'prepend_attachment\' => 
        array (
          \'function\' => \'prepend_attachment\',
          \'accepted_args\' => 1,
        ),
      ),
      11 => 
      array (
        \'capital_P_dangit\' => 
        array (
          \'function\' => \'capital_P_dangit\',
          \'accepted_args\' => 1,
        ),
        \'do_shortcode\' => 
        array (
          \'function\' => \'do_shortcode\',
          \'accepted_args\' => 1,
        ),
      ),
    )
    

    结束

    相关推荐

    向函数添加APPLY_FILTERS有什么不利影响吗?

    我将回顾我以前的WordPress主题,使函数可过滤,并添加函数\\u exists检查。我有没有想过这会导致现有代码出现问题?// Dummy function if ( ! function_exists( \'custom_func\' )) { function custom_func() { $output = \"Something Awesome\"; return apply_filters(\'custom_func