问题描述

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

我在问一些先进的事情。如何在 PHP 中实现?例如,它如何从不同的插件和”attach” 中收集所有钩子到核心钩子等。

最佳解决方案

Overview

基本上 「过滤器和钩子」 的 「Plugin API」 由以下功能组成:

  1. apply_filters() – 执行

  2. do_action – 执行

  3. apply_filters_ref_array() – 执行

  4. do_action_ref_array() – 执行

  5. add_filter() – 添加到堆栈

  6. add_action() – 添加到堆栈

基本内部

总的来说,有几个全局变量 (WordPress 世界还有什么):

global $wp_filter, $wp_actions, $wp_current_filter, $merged_filters;

第一个 $wp_filter 是一个全局 Array,它将所有过滤器名称作为子数组。然后,这些子阵列中的每个子阵列将保存更多的子阵列,这些子阵列是在优先级数组下召集的回调。

简介 in-depth

所以当一个执行函数被调用时,WordPress 搜索这些全局变量数组的密钥与该名称。然后附加的回调优先执行优先级。发生的唯一事情是附加到 all 过滤器的回调。

当您使用 add_actionadd_filter 添加回调时,WordPress 首先计算”unique” 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(或动作/过滤器名称),那么所有的东西都以特定的优先级召集,然后”unique” 回调/ID 字符串被用作关键。

之后,当一个过滤器被调用时,会发生 $tag /action- /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']
        )
    );
}

次佳解决方案

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

一个例子是 WordPress 中的 wp_head 钩子。你可以使用这个钩子在你的孩子主题中添加该地点的内容’

例:

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 主题框架中打开了 header.php 文件,那么这个钩子就是这样的:

do_action( 'genesis_header' );

这是一个 list of WordPress hooks,您可以在许多方面使用。

过滤器使您能够修改现有功能的输出,并包含在 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. 中找到 the_excerpt() 功能

这是它的样子:

  function the_excerpt() {
        echo apply_filters('the_excerpt', get_the_excerpt());
}

您还可以使用插件中的钩子和过滤器来完成相同的操作,并且当您更新父主题或 WordPress 时,代码不会丢失。

基本上,钩子和过滤器使您能够自定义和修改 WordPress 和您的父主题,而无需编辑核心 WordPress 文件或您的父主题文件。

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

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。