The Technology database of Duke Yin

Hooks简介2:自定义挂钩和可插拔功能简介

如果您已经阅读了WordPress Hooks简介的第1部分 ,则应该清楚地了解什么构成“动作”或“过滤器”钩子以及可以在何处使用它们。 今天,我们将深入探讨“兔子洞”,讨论可插拔功能以及创建自己的“动作”和“过滤器”挂钩点的概念,以及如何利用它们并在主题和主题之间建立关系。使用各种WordPress Hooks的插件。

注意:本教程不适合胆小的人(有一些高级知识)。 如果您还没有阅读第1部分,我强烈建议您在继续阅读之前阅读。

什么是自定义动作和过滤点?

如前所述,可以在WordPress页面加载过程中使用操作在关键点运行您自己的代码,以及使用过滤器修改文本,设置或几乎所有带有过滤器的内容,以量身定制WordPress安装完全符合您的要求。 那主题和插件呢? 我该如何在其中注入自己的定制特效? 这就是自定义操作和过滤点的来源。

使用WordPress核心本身内置的相同功能,我们可以在主题和插件中创建我们自己的动作点(例如“ wp_head”或“ wp_footer”)。 从本质上讲,这是相对简单的,可以以标准方式或更高级的方式使用。 假设我们正在开发一个名为“ WPCandy News”的插件,则可以在显示最新新闻的小部件的顶部添加以下内容:

<?php do_action( 'wpcandy_news_widget_before' ); ?>

这是构成WordPress操作点的核心。 do_action()函数指示WordPress查找附加到指定标签的钩子(在我们的示例中为“ wpcandy_news_widget_before”)并运行该函数。 简单吧?

等一下,这还不是全部。 do_action()函数还可以接受多个参数(参数),然后根据需要将其传递给我们所连接的函数。 听起来很复杂,对吧? 并不是的。 让我们使用上面相同的示例,但将其扩展一点。

<?php do_action( 'wpcandy_news_widget_before', $limit, $id ); ?>

在代码段中,我添加了两个额外的参数。 $ limit和$ id变量。 这些是由插件创建的示例变量,分别包含要显示的文章数和我们分配给窗口小部件中元素的ID。 如果我们正确设置了add_action()调用,则应该在函数中接收这些值,以备使用。

等等,add_action()在哪里出现?

没有add_action() ,`do_action()`毫无意义。 `add_action()`函数允许我们以及其他主题或插件分配要在WordPress达到我们的操作后运行的功能。 从根本上讲,我们如何抓住新的行动要点的一个例子是:

<?php add_action( 'wpcandy_news_widget_before', 'wpcandy_news_widget_before_content' ); 
function wpcandy_news_widget_before_content () { 
     echo '<p>' . __( ' This is our custom text.', 'wpcandy' ) . </p>'; 
} // End wpcandy_news_widget_before_content() ?>

现在一切都很好,但是$ limit和$ id呢? 输入我们的最后两个参数; “优先”和“可接受的论点”。

如果将多个动作分配给同一个`do_action()`调用,则优先级使我们可以选择指定执行动作的顺序。 这对于控制主题或插件的流程非常有用。 此外,接受的参数编号使我们可以选择指定将多个参数传递给我们的操作。 默认值为1,因此,如果只有1个自变量,则无需指定任何内容。

这就是我们修改后的代码:

<?php add_action( 'wpcandy_news_widget_before', 'wpcandy_news_widget_before_content', 1, 2 ); 
function wpcandy_news_widget_before_content ( $limit, $id ) { 
     if ( $limit > 5 ) { 
          echo '<p>' . __( ' This is our custom text.', 'wpcandy' ) . </p>'; 
     } 
} // End wpcandy_news_widget_before_content() ?>

我们在这里做了一些小的更改,如下所示:

  1. 添加了“优先级”和“可接受的参数”参数值,分别设置为1和2。
  2. 在我们的函数中增加了$limit 和 $id 值,以通过do_action()传递。
  3. 使用函数内部的$limit变量的示例。

通常,出于可伸缩性的考虑,并保持功能整洁和面向未来,开发人员通常将这些`do_action()`调用包含在函数中。 一个例子是`wp_head()`函数,它被添加到绝大多数WordPress主题中(以至于它被认为是必需的)。 本质上,此函数运行`do_action(’wp_head’)`,如上所述。 神奇吧?

好的,但是过滤器呢?

定制过滤器点的概念与定制动作点几乎相同,只是它与过滤器有关。 正如我们在第1部分中讨论的那样,有可能对几乎所有内容都放置一个过滤器,从内容片段到设置或选项数组。 除了两个方面,这里的要求与do_action()几乎相同。 第一个是我们正在使用apply_filters()函数,第二个是我们需要两个参数,而不仅仅是标签。 涉及的第二个参数是使`apply_filters()`函数成为必需要素的核心- 数据本身 。

让我们深入研究一个如何将其付诸实践的例子。 继续我们“ WPCandy News”插件的示例,让我们在小部件的标题上放置一个过滤器。 用于此的代码如下所示:

<?php $title = apply_filters( 'widget_title', $title ); ?>

这段代码说: “获取`$ title`变量的值,应用附加到’widget_title’钩子的所有过滤器,并将过滤后的值分配回`$ title`变量”。 简单吧?

如果您熟悉PHP,则在解释过滤器的工作原理时,我想做一个基本比较,就是将它们与PHP中与字符串相关的函数(例如str_replace())进行比较。 我们将以类似于上述代码段的方式使用str_replace()函数,如下所示:

<?php $title = str_replace( 'one', 'two', $title ); ?>

概念是我们正在将一个值传递给我们的函数并取回一个值。 这是过滤器功能的核心。

就像do_action()一样,apply_filters()函数也可以接受其他参数。 这些功能与do_action()完​​全相同,并且可以通过add_filter()函数上的“ priority”和“ accepted arguments”参数使用,其作用方式与对add​​_action()的使用方式相同)`。 可以看出,“动作”和“过滤器”挂钩之间的区别以及它们的创建方式是微不足道的(它们都在同一主干代码的基础上起作用)。

即使您不想创建自己的动作和过滤器点,也必须了解它们如何工作的全部范围以及“ add_action()”和“ add_filter()”函数如何适合所有事物。 例如,如果您使用诸如Canvas之类的主题,则会注意到正在使用这些类型的自定义钩子,这些钩子可以最大程度地提高灵活性并控制您希望主题显示和起作用的方式。

足够的钩子,这些“可插入功能”是什么?

“可插拔功能”的概念已在WordPress社区中流行,特别是在父主题和主题框架领域。 这些功能可以通过简单地在子主题中或在该主题的原始位置(通常是`functions.php`文件的根目录)之前触发的主题的一部分中创建该函数的新实例来覆盖。 此概念是用于生成通常自定义主题区域的功能的选项,例如主题博客文章存档标题下方的文章元数据,或单个博客文章屏幕上文章内容下方的区域。 与“动作”和“过滤器”挂钩一样,可插拔功能实际上有无限的用途。

知道了 如何创建这些?

这部分非常简单。 它涉及两个技能; 第一个是知道主题中的哪些功能是可插拔的(因此也知道主题),第二个是知道如何进行您想要的修改。

查找主题中哪些功能可插入的简单方法是搜索以下代码:

if ( ! function_exists( 'insert_function_name_here' ) ) {

该行是条件语句的开始,该条件语句通常会包装名称为“ insert_function_name_here”的函数。 这只是说该函数仅应在尚不存在的情况下创建,这为重写该函数留下了空间。 让我们创建一个例子。

这将是我们的原始功能,并附有条件语句:

<?php if ( ! function_exists( 'wpcandy_display_recent_news' ) ) { 
     function wpcandy_display_recent_news ( $limit = 5 ) { 
          // This is where we'd run the meat of the function. 
     } // End wpcandy_display_recent_news() 
} ?>

在我们的子主题中覆盖此主题很简单,只需复制代码并删除条件语句(第一行和结尾处的括号),然后将其放在我们的子主题中,然后我们就可以对其进行所需的任何修改,而无需修改父主题。

挂钩和可插拔功能很棒,但是什么时候使用?

我喜欢坚持的一般经验法则是:如果某个功能未附加到“动作”或“过滤器”钩子上,则应使其可插入。 这样做的原因是可以从钩子中删除函数 ,也可以使用上面介绍的“优先级”设置覆盖它们,这使得函数的可插入性变得多余。 这也使得更容易理解一个函数的性质(如果它是可插拔的,则没有连接到一个钩子上),这可以加快开发时间,并使初次看代码的开发人员更容易理解。解读幕后情况。

Credit: http://wpcandy.com/teaches/custom-hooks-and-pluggable-functions/#.XcduSFUza70

# #

评论关闭