过滤钩子

WordPress 钩子有两种类型:动作钩子和过滤器钩子。

在本课中,我们将重点介绍过滤器,但关于动作钩子的更多信息,请查看动作钩子课程。

什么是过滤器钩子?

过滤器允许你在特定时间点修改或过滤某些数据,这些数据将在后续被使用。

要使用过滤器,你需要在代码中将一个函数注册到已有的过滤器钩子上,这个函数被称为回调函数。

为了更好地解释这一点,我们来看一个名为 the_content 的过滤器。

这个过滤器定义在 wp-includes/post-template.php 文件中,位于一个函数内部。当主题模板需要渲染任何文章或页面内容时,就会调用这个函数。

在该函数内部,我们可以看到以下代码:

$content = apply_filters( 'the_content', $content );

这里,apply_filters 函数定义了一个过滤器钩子,钩子名称为 the_content。

你会注意到,一个 $content 变量作为 apply_filters 的参数传递,并且 apply_filters 的返回值被重新赋值给一个变量,在这里仍然是 $content 变量。

如果我们在这个函数中向上看一点,会发现 $content 变量被赋值为 get_the_content 函数的返回值。这是一个 WordPress 核心函数,用于从文章表中检索当前文章或页面的 post_content 字段值。

因此,apply_filters 函数注册了过滤器钩子,将代码执行到此时 $content 的值传递给注册在该钩子上的所有回调函数,并要求返回更新后的值。

使用过滤器钩子

要将回调函数注册到过滤器上,你需要使用 WordPress 的 add_filter 函数。

你需要将钩子名称和回调函数的名称作为参数传递给 add_filter 函数。

让我们看看在主题的 functions.php 文件中如何实现。

在本课中,你将在当前激活的主题中编写一些代码。请注意,这仅用于演示目的。除非你自己正在开发该主题,否则不建议直接编辑现有主题的文件。

在代码编辑器中,导航到当前激活主题的 functions.php 文件,并打开它。

如果你的主题没有 functions.php 文件,你可以在主题目录的根目录下创建一个。确保它命名为 functions.php,并且在文件顶部包含 PHP 开始标签。

然后,将以下代码添加到你的 functions.php 文件中,以便将一个回调函数挂载到 the_content 过滤器钩子上。

add_filter( 'the_content', 'wp_learn_amend_content' );

然后,使用 PHP 函数语法创建回调函数,该函数接受来自过滤器的相关参数。

function wp_learn_amend_content( $content ) {
    // 执行一些更新 $content 的操作
    return $content;
}

你不必让参数名称与过滤器传递的变量名称相同,但这样做会让代码更易读。

注意,你必须返回更新后的数据。这样,从 apply_filters 调用中更新的原始变量才能获取到更新后的数据。

例如,假设你想在每篇文章内容的末尾添加一些内容,你可以像这样将其追加到 $content 变量中。

add_filter( 'the_content', 'wp_learn_amend_content' );
function wp_learn_amend_content( $content ) {
    $additional_content = '<!-- wp:paragraph --><p>通过 <i>the_content</i> 过滤</p><!-- /wp:paragraph -->';
    $content            = $content . $additional_content;

    return $content;
}

在这个例子中,你添加了一些文本到一个段落块中,这些文本会在前端每篇文章的底部显示。

始终从过滤器回调中返回某些内容非常重要,理想情况下是返回传递给过滤器的变量修改后的内容。如果不返回任何内容,会导致你的 WordPress 网站出现致命错误。

让我们看看这在我们的 WordPress 网站中是什么效果。

如果你在前端查看任何文章或页面,你会看到内容底部显示“通过 the_content 过滤”的文本。

所以,从这个例子可以看出,过滤器钩子允许你在代码执行的特定节点修改特定的数据片段。