过滤器和挂钩在PHP中到底是如何工作的

时间:2013-08-13 作者:Aaron Lee

过滤器和挂钩在WordPress中实际是如何工作的?

我在问一些高级的问题。它是如何在PHP中实现的?E、 g如何从不同插件收集所有挂钩,并将其“连接”到核心挂钩等。

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

概述Plugin API,“调用过滤器和挂钩,由以下功能组成:

  1. apply_filters() - 执行do_action - 执行
  2. apply_filters_ref_array() - 执行do_action_ref_array() - 执行add_filter() - 添加到堆栈add_action() - 添加到堆栈中

基本内部

总体而言,涉及到几个全局(WordPress世界中的其他内容):

global $wp_filter, $wp_actions, $wp_current_filter, $merged_filters;
第一个$wp_filter 是一个全球性的Array 将所有过滤器名称保存为子阵列的。然后,这些子数组中的每一个子数组都包含更多的子数组,这些子数组是在优先级数组下调用的回调。

因此,当调用execute函数时,WordPress会在这些全局数组中搜索具有该名称的键。然后,附加的回调在优先级之后获得执行优先级。前面发生的唯一事情是连接到all 滤器

当您使用add_actionadd_filter, 然后WordPress首先计算一个“唯一”ID,以不覆盖已附加的回调。

$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);
然后将您的回调添加到global $wp_filter 堆栈:

$wp_filter[ $tag ][ $priority ][ $idx ] = array(
    \'function\'      => $function_to_add,
    \'accepted_args\' => $accepted_args
);
正如您所看到的,主子数组是$tag (或操作/筛选器名称),然后在特定优先级下调用所有内容,然后将“唯一”回调/ID字符串用作键。

稍后,当调用筛选器时-发生在$tag/操作-/filter name-搜索数组并调用回调。因为它正在使用call_user_func_array 附加多少个参数并不重要。WordPress自己解决了这个问题。

foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
    call_user_func_array(
        $the_[\'function\'], 
        array_slice(
            $args, 
            0, 
            (int) $the_[\'accepted_args\']
        )
    );
}

SO网友:Brad Dalton

Hooks 包含在WordPress核心文件和一些父主题文件中。它们使您能够将内容挂接到文件中的特定位置。

WordPress中的wp\\u head hook就是一个例子。您可以在子主题中使用此挂钩在该位置添加内容\'

示例:

add_action(\'wp_head\', \'add_content_to_head\');
function add_content_to_head() {
echo \'Your Content\';
}
一些高级主题还包括action hooks 您可以在子主题中使用它来执行相同的操作。这里有一个visual map 其中包括所有动作挂钩以及它们在Genesis主题框架中输出内容的位置。

示例:

add_action(\'genesis_header\', \'add_content_to_header\');
function add_content_to_header() {
echo \'Your Content\';
}
以下是打开收割台时挂钩的样子。Genesis主题框架中的php文件:

do_action( \'genesis_header\' );
这里有一个list of WordPress hooks 您可以通过多种方式使用。

Filters 允许您修改现有函数的输出,它包含在WordPress核心文件和一些父主题框架(如Genesis)中。

这里有一个list of the filters 您可以与Genesis设计框架一起使用

以下是filters included in WordPress

下面是一个如何在Genesis这样的主题框架中使用过滤器的示例:

add_filter( \'comment_author_says_text\', \'custom_comment_author_says_text\' );
function custom_comment_author_says_text() {
return \'author says\';
}
上面的代码可以在子主题中使用,以修改作者在您的评论中所说的文本。它适用于任何主题。

下面是另一个将摘录长度定制为50个单词的示例:

add_filter( \'excerpt_length\', \'change_excerpt_length\' );
function change_excerpt_length($length) {
return 50; 
}
您可以在wp-includes/post-template.php file.

下面是它的样子:

  function the_excerpt() {
        echo apply_filters(\'the_excerpt\', get_the_excerpt());
}
您还可以在插件中使用挂钩和过滤器来完成完全相同的事情,并且在更新父主题或WordPress时,代码不会丢失。

基本上,挂钩和过滤器允许您自定义和修改WordPress和父主题,而无需编辑核心WordPress文件或父主题文件。

当父主题框架包含挂钩和过滤器时,自定义子主题要容易得多,因为您不需要编辑父主题模板文件。这样,您也可以安全地更改主题。

结束

相关推荐

About Hooks and Filters

嗯,我很难理解动作和过滤器之间的区别。我确实在代码中使用动作,但我是一个新手,甚至连一点过滤器都不知道。我去过codex,以及NickTheGeek、BillErickson、GaryJones等的多个网站,但没有去过vein。如果你能用简单的话告诉我,并举例说明动作、过滤器和挂钩的基本内容和区别。非常感谢。