使用 WordPress 钩子(Hooks)功能示例

WordPress 挂钩可以通过扩展网站的功能来帮助您实现业务目标。Hooks 允许您在特定位置进行交互和修改代码,而无需修改 WordPress 核心本身。它们使用户可以轻松修改WordPress 插件和主题并添加各种功能。

WordPress 以其强大的功能和可定制性而闻名,主题使大多数用户更容易获得这种功能。然而,主题受到开发人员内置的功能的限制。找到一款完全满足您需求的产品并不总是那么容易。

在本教程中,我们将介绍 WordPress 挂钩及其用途。此外,我们还将提供实用的 WordPress 挂钩示例,向您展示如何在您的网站上使用它们。

Hook 钩子简单介绍

Hook 钩子分为两类:

  • 操作– 允许用户添加数据或更改其网站的工作方式。操作挂钩将在 WordPress 核心、插件和主题执行时的特定时间运行。
  • 过滤器– 可以在 WordPress 核心、插件和主题执行期间更改数据。

简而言之,操作 Hook 挂钩接收信息,根据信息执行操作,并且不向用户返回任何内容。相反,过滤器挂钩获取信息,修改它,然后将其返回给用户。

挂钩对于将自定义代码合并到网站中至关重要。例如,您可以使用它们将JavaScript 添加到 WordPress。

下面是将mytheme_script函数与wp_enqueue_scripts操作连接起来的操作挂钩示例。

function mytheme_script() 
{
wp_enqueue_script( 'my-custom-js', 'custom.js', false );
}
add_action( 'wp_enqueue_scripts', 'mytheme_script' );

如何使用 WordPress Hook 挂钩

使用 Hook 钩子需要一些 HTML 和 PHP 知识。幸运的是,即使对于WordPress 初学者来说,创建操作和过滤器挂钩也相对容易。

创建 Action Hook 挂钩

WordPress 中的操作挂钩是一种挂钩,允许开发人员在整个 WordPress 代码库的特定点执行自定义任务。

与过滤器挂钩(在将数据发送到浏览器或存储在数据库之前修改数据)不同,操作挂钩用于在特定事件期间触发自定义函数,例如保存帖子、用户登录或加载页面时。

操作挂钩可用于添加 WordPress 中不存在的开箱即用的自定义功能。

例如,开发人员可以使用操作挂钩向管理屏幕添加其他字段、在新博客文章上发送自动电子邮件或创建自定义小部件。

使用操作挂钩需要了解 PHP 和 WordPress 的工作原理。但通过正确的理解和工具,操作挂钩可以为 WordPress 网站添加强大的功能。

要添加动作 Hook 钩子,您必须激活WordPress 插件中的add_action ()函数。为此,请将以下代码添加到您的WordPress function.php 文件中:

add_action( $target_hook, $the_name_of_function_you_want_to_use, $priority, $accepted_args );

Hooks 使用优先级来正常运行。该范围是基于 1 到 999 范围的自动序数值。它定义与该特定钩子关联的函数的顺序。较低的优先级值意味着该函数将较早运行,而较高的优先级值则意味着该函数将较晚运行。

当使用相同的target_hook时,比例尺将显示函数的输出顺序。priority_scale的默认值为10。您可以根据您的target_hook的数量来安排比例。

$accepted_args负责定义函数接受的参数数量。默认情况下,系统会将其设置为1以下是添加到functions.php文件末尾的 Twenty Twenty-Three WordPress 主题的操作挂钩示例:

<?php
function hook_javascript() {
?>
    <script>
        alert('Hello world...');
    </script>
<?php
}
add_action('wp_head', 'hook_javascript');
?>

请注意上面示例中的模式:

  • <?php – 让钩子发挥作用的地方。
  • function hook_javascript() – 一个会影响初始值的函数,从而向用户显示弹窗。
  • <script> – 表示要在target_hook上显示的文本。
  • alert(‘Hello world…’); – 将向用户显示带有“Hello World”短语的弹窗。
  • add_action – 用于创建操作挂钩的命令。
  • ‘ wp_head ‘ –函数将修改的目标钩子。

实际上,它看起来像这样:

WordPress Hook功能

创建过滤器 Filter Hooks 钩子

例如,开发人员可以使用过滤器在帖子标题中添加对 HTML 标签的支持,更改日期在页面上的显示方式,或者用同义词替换单词。过滤器挂钩对于只需几行代码即可快速自定义网站非常有用。它们允许开发人员动态操作内容,而无需直接修改核心文件。

您可以使用add_filter()函数创建过滤器挂钩。过滤器挂钩修改、过滤某个值或用新值替换某个值。

与操作钩子类似,它使用关联的过滤器钩子函数(如apply_filter )过滤值。

以下是我们将添加到Twenty Twenty-Three WordPress 主题的functions.php文件中的过滤器挂钩示例:

add_filter( 'the_content', 'change_content' );
function change_content ( $content ) {
$content = 'Filter hooks are amazing!';
return $content;
}

让我们更详细地分析一下代码片段:

  • ‘ the_content ‘ – 函数将修改的目标 Hooks 钩子。
  • ‘ change_content ‘ – 影响初始值,从而改变实际内容。
  • $content = ‘Filter hooks are amazing!’; – 用书面短语替换所有文章的内容。
  • return $content;– 后返回新值。

现在,如果我们在使用“二十二十三”主题时打开任何帖子,我们将看到如下内容:

过滤器 Hooks 钩子

从示例中可以看出,过滤功能将整个内容替换为短语“Filter hooks are Amazing!”。

取消指定的 Hook 功能

如果您想在 WordPress 代码中禁用add_action()add_filter()的命令,请使用remove_action()remove_filter()

这些函数可以排除某些操作或过滤器。使用它们允许用户修改带有太多不必要的挂钩的插件,这可能会破坏网站的优化。

也可以删除这些不必要的代码行。但是,我们仅建议您使用自己的插件或主题。这是因为如果您删除了不正确的行,那么使用其他人的插件或主题的做法可能会引发致命错误。

以下是 WordPress 中的 remove_action() 的示例:

remove_action( 'wp_print_footer_scripts', 'hostinger_custom_footer_scripts');
add_action( 'wp_print_footer_scripts', 'hostinger_custom_footer_scripts_theme');
function hostinger_custom_footer_scripts_theme()
{
?>
<script>//example of output by theme</script>
<?php
}

上面的示例显示,remove_action()删除了默认的 WordPress 页脚脚本,并将其替换为 Hostinger 的自定义页脚脚本主题。

该命令适用于 WordPress 中的各种操作挂钩。此外,这里是remove_filter()的一个例子:

remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
add_filter( 'tiny_mce_plugins', 'disable_emojis_tinymce' );
}

上面的示例显示了如何停用 wp_staticize_emoji_for_email,它将表情符号转换为静态图像。

然后它用disable_emojis_tinymce替换它们,这将停用WordPress中的表情符号功能。这可以帮助加快您的网站速度,因为表情符号必须发出额外的 HTTP 请求。

此外,您可以使用remove_filter()命令按顺序禁用多个过滤器。这是一个例子:

function disable_emojis() {
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
remove_action( 'wp_print_styles', 'print_emoji_styles' );
remove_action( 'admin_print_styles', 'print_emoji_styles' );
remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
add_filter( 'tiny_mce_plugins', 'disable_emojis_tinymce' );
add_action( 'init', 'disable_emojis' );
}

上面的代码旨在消除WordPress中的表情符号功能。它说明用户可以在functions.php文件中嵌入多少个remove_filter命令没有限制。

实用的 WordPress Filter Hook 和 Action Hook 示例

用户可以使用很多钩子来创建自定义 WordPress 函数。以下是一些受欢迎的:

示例1:admin_post_thumbnail_size

此过滤器挂钩在“特色图像”部分中显示您文章的缩略图。连接该函数的三个参数:$size、$thumbnail_id$post

Hook 钩子应该看起来像这样:

$size = apply_filters( 'admin_post_thumbnail_size', $size, $thumbnail_id, $post );

请记住,您可以根据需要更改$size参数。例如,如果要将缩略图大小设置为 240 x 240 像素,请使用以下代码:

$size = apply_filters( 'admin_post_thumbnail_size', 240, $thumbnail_id, $post);

还可以通过添加array()函数来设置缩略图的自定义大小。代码如下所示:

$size = apply_filters( 'admin_post_thumbnail_size', array(240, 400), $thumbnail_id, $post);

上面的array ()函数设置缩略图以 240 x 400 像素显示。

示例2:after_password_reset

当用户重置密码时,此操作挂钩将被激活。该钩子由两个参数组成:$user$new_pass,如下所示:

do_action( 'after_password_reset', $user, $new_pass );

例如,WordPress 将此钩子与reset_password()函数结合使用。

示例3:customize_loaded_components

这个钩子是一个过滤器,用于从核心进程中排除一些 WordPress 组件。这些函数适用于核心文件,例如wp-activate.phpwp-config-sample.phpwp-settings.php

然而,需要注意的是,customize_loaded_components不能添加到主题中,因为它仅在plugins_loaded阶段激活。

该钩子由两个参数组成:$components$this,如下所示:

$components = apply_filters( 'customize_loaded_components', array( 'widgets', 'nav_menus' ), $this );

components参数是要加载的一批核心函数,而$this指的是现有类中的对象。

可以自定义array()函数来确定要排除哪些组件。上面的示例显示小部件和nav_menus被排除在核心进程之外。

示例4:the_title

/**
 * Custom function to modify the title of a post before it's displayed.(自定义标题显示)
 *
 * @param string $title The current post title.(默认标题)
 * @return string The modified post title.(修改后标题)
 */
function custom_modify_post_title($title) {
// 在原标题前添加:Custom Prefix: 
$modified_title = 'Custom Prefix: ' . $title;
return $modified_title;
}

// Add a filter hook to modify the post title.
add_filter('the_title', 'custom_modify_post_title');

在此示例中,我们定义了一个自定义函数custom_modify_post_title,它通过添加自定义前缀来修改帖子的标题。

然后,我们使用add_filter函数将此函数挂钩到the_title过滤器挂钩,该挂钩在显示帖子标题时调用。

因此,每当显示帖子标题时,WordPress 都会调用我们的custom_modify_post_title函数并将当前帖子标题作为参数传递。

然后,我们的函数通过添加自定义前缀来修改帖子标题并返回修改后的标题,然后将其显示在页面上。

示例5:使用 Hook 检测访问者的浏览器

问题。跨浏览器兼容性可能是 Web 开发中常见的问题。如果您能够检测人们用来访问您网站的浏览器,然后创建一个包含在标记中的自定义类,您将为自己省去很多麻烦body。很少有人意识到这一点,但 WordPress 已经可以检测浏览器,并且有一些全局变量可供我们使用。

解决方案。这里没什么难的:只需将下面的代码粘贴到您的functions.php文件中,然后保存文件即可完成!

<?php
add_filter('body_class','browser_body_class');
function browser_body_class($classes) {
  global $is_lynx, $is_gecko, $is_IE, $is_opera, $is_NS4, $is_safari, $is_chrome, $is_iphone;

  if($is_lynx) $classes[] = 'lynx';
  elseif($is_gecko) $classes[] = 'gecko';
  elseif($is_opera) $classes[] = 'opera';
  elseif($is_NS4) $classes[] = 'ns4';
  elseif($is_safari) $classes[] = 'safari';
  elseif($is_chrome) $classes[] = 'chrome';
  elseif($is_IE) $classes[] = 'ie';
  else $classes[] = 'unknown';

  if($is_iphone) $classes[] = 'iphone';
  return $classes;
}
?>

保存文件后,该函数会自动向标签添加 CSS 类body,如下例所示:

<body class="home blog logged-in safari">

代码解释。WordPress 具有全局变量,true如果访问者使用特定浏览器,则会返回这些变量。如果访问者的浏览器是 Google Chrome,则该$is_chrome变量将返回true。这就是我们创建该browser_body_class()函数的原因,该函数返回访问者浏览器的名称。完成后,我们只需将该函数挂接到 WordPress 的body_class()函数即可。

示例6:在每个帖子后自动插入内容

问题。大多数博客使用single.php模板在帖子后插入一些文本、图像或广告。当然,这可以通过打开single.php并在函数后面粘贴所需的文本来完成the_content()。但文本不会显示在您的 RSS 源中?钩子和下面描述的技术解决了这个问题。

解决方案。再次,只需将下面的代码粘贴到主题的functions.php文件中即可。就是这样。

function insertFootNote($content) {
    if(!is_feed() && !is_home()) {
            $content.= "<div class='subscribe'>";
            $content.= "<h4>Enjoyed this article?</h4>";
            $content.= "<p>Subscribe to our  <a href='https://feeds2.feedburner.com/WpRecipes'>RSS feed</a> and never miss a recipe!</p>";
            $content.= "</div>";
    }
    return $content;
}
add_filter ('the_content', 'insertFootNote');

代码解释。该函数的目的insertFootNote()非常简单:它只是将您选择的文本连接到$content包含帖子内容的变量。

然后,我们的insertFootNote()函数就钩住了该the_content()函数,每次调用的时候都会自动调用the_content。使用此功能与在每篇文章末尾输入文本基本相同。

请注意(!is_feed)第 2 行的条件,它阻止文本插入到 RSS 提要中。如果您希望文本出现在 RSS 源中,请将第 2 行替换为以下内容:

if (!is_home()) {

结论

WordPress Hook 挂钩可以使任何网站所有者受益。它们允许您添加自定义功能或禁用进程,而无需更改 WordPress 核心文件。在本教程中,我们创建了操作和过滤器 WordPress 挂钩,并展示了一些实际示例。

滚动至顶部