专栏首页一丘一壑Genesis框架从入门到精通(2):什么是动作?

Genesis框架从入门到精通(2):什么是动作?

在本系列的前一篇文章中,我解释了Genesis框架和乐高之间的相似性。我列出了Genesis所有内置的“钩子”,把它们比喻成乐高里连接各个积木块的小凸点。

如果把钩子(hook)看作是积木上的小凸点,那么动作(action)就是积木块的操作指南。可以把积木块看成是函数,也就是一些代码块。操作动作(action)有两种方法, add_action()remove_action() 。对这两者,你完全可以望文生义。换句话说,他们的作用和名字完全相符。add_action()是指明把积木(函数)的添加到什么位置,而 remove_action()则是从某个地方移除积木(函数)的指令。一个操作指令由共5部分组成。

  1. 指令类型:添加或删除
  2. 要使用的钩子:函数(积木块)要放到哪里
  3. 回调函数:要添加或删除的函数
  4. 优先级:相对于其他操作的加载顺序
  5. 接受参数:函数可以接受几个的变量

够简单吧?好的,让我们看看如何在代码中使用。

添加一个动作(action)

添加动作(action)一般这样写:

add_action( 'hook', 'callback_function', 10, 1); 

第一部分告诉我们它正在添加一个动作(action),而不是删除动作。

第二部分告诉我们要挂载到哪个钩子上,在这里钩子的名字是“hook”。如果这个钩子不存在,那么要添加的动作(action)就不会执行。这很有用,因为你不需要在代码里考虑钩子是否存在的逻辑,这也意味着你不需要担心万一钩子没有挂载成功的时候就执行了代码。这在Genesis框架中被用于日志列表主循环和评论模板。如果主循环没有加载成功,那么用于加载余下的日志的钩子就不会加载,同样,如果评论模板没有加载,则用于显示评论的钩子就不会加载。

第三部分告诉我们回调函数的名称是“callback_function”。这是必须的,否则就会报错:“第二个参数应该是一个有效的回调函数。”这意味着你需要使用Genesis现有的内置函数(这些函数的作用非常酷,我将在下一篇文章中详细介绍),或者你需要创建一个自己的函数。要做的就是把你想执行的代码写入一个php文件中,该文件将在特定的动作(action)被执行时加载进来(可以在add_action()之前或之后)

function callback_function() {
//do something really cool
 
}

fucntion的意思是:“喂,记住了,这是一个函数。”后面是函数名称。在()中可以是任何可以传递的参数(稍后会详细介绍),{是函数的开头。之后的一切都是在函数内部运行的代码。 }是函数的结尾。真的很简单,但也很容易搞砸。拼错任何一个,使用错误的符号,或者顺序不对,你就会收到报错。学会阅读这些错误,你会知道如何解决它,但这是另一个教程。

第四部分是优先级。默认值是10。如果未设置,则WordPress会将其视为10。具有相同优先级的动作(action)将按出现的顺序来执行,WordPress核心代码,插件,框架文件,主题的fucntion文件,主题的模板文件加载。我将在下一篇文章中更详细地讨论这个问题。数字越小,优先级越高,换句话说,就会优先加载。数字越大优先级越低,加载顺序就越晚。你可以将多个动作(action)“勾”到同一个钩子上,并使用优先级来强行安排执行顺序。

add_action('hook', 'function_1');     // 第二个加载
add_action('hook', 'function_2', 15); //最后加载
add_action('hook', 'function_3', 5);  // 最先加载

注意这些都没有参数(我们将在下面讨论),只有后两个使用了优先级。第一个默认为“10”,因此介于第二个和第三个之间。

第五部分是接受的参数,默认为1,但你不必实际传递任何参数。通常是1,因为动作(action)实际上并没有传递任何可以使用的东西;但是,不过有时这可能非常有用。在我的插件“Genesis Featured Widget Amplified”中,我使用钩子函数获取$instance的值作为widget配置选项,并把值发送出去,使这个值可以在类之外获取。这意味着我可以在我的functions.php文件中编写代码,并在它执行任何操作之前检查widget的配置项。

add_action( 'gfwa_post_content', 'gfwa_do_post_content', 10, 1 );
 
/**
 * Outputs the selected content option if any
 *
 * @author Nick Croft
 * @since 0.1
 * @version 0.2
 * @param array $instance Values set in widget isntance
 */
function gfwa_do_post_content( $instance ) {
    if ( !empty( $instance['show_content'] ) ) {
 
        if ( $instance['show_content'] == 'excerpt' )
            the_excerpt();
        elseif ( $instance['show_content'] == 'content-limit' )
            the_content_limit( ( int ) $instance['content_limit'], esc_html( $instance['more_text'] ) );
        else
            the_content( esc_html( $instance['more_text'] ) );
    }
}

如您所见,这段代码的意思是,将通过检查$instance的值来决定是显摘要the_excerpt()、一部分内容the_content_limit()、全部内容the_content()或什么都不显示。如果你没看出来,主要是因为我把$instance值作为参数传递进去了。由于目前我们不会经常这样使用,所以现在我先继续,并在解释过滤器(filter)时深入讲解这个问题。

关于add_actions,还需要知道的是,重复添加会被忽略。如果动作(action)的名称完全匹配,那就什么都不做。如果优先级或接受参数不同,那么动作(action)就会被加载。

add_action('hook', 'function_1');
add_action('hook', 'function_1');    //  和上面的重复了,会被忽略
 
add_action('hook', 'function_1' ,5); // 这句会先于第一句执行
add_action('hook_2', 'function_1');  // 这句会把function_1() 挂到 "hook_2"钩子上

好了,所以现在你写一个简单的添加指令,说明要放在哪里,要放在那里的内容,以及放入的顺序和其他可能需要的部分。下一步是学习如何删除动作(action)。

删除一个动作(action)

删除动作(action)的操作和上面的添加指令大部分是相同的,最大的区别是删除动作(action)要取决于动作(action)的添加和钩子,而不是仅仅依赖于挂钩。请记住,如果钩子不存在,add_action()就会忽略没有任何影响,remove_action()则不同,如果要删除的动作(action)没有通过add_action()添加过,它也不会执行删除操作。不理解?举几个例子。

add_action('hook', 'function_1');
add_action('hook', 'function_1', 5);
 
remove_action('hook', 'function_1');
remove_action('hook', 'function_2');

这里我们先用add_action()添加了两个动作(action)。这两句都会加载同一个动作(action),但具有不同的优先级顺序。我还写了两个remove_action()

第一句删除操作remove_action,将会把第一个add_action删除,但不会删除第二个add_action,尽管这两个的钩子和函数名字都是一样的。因为添加的和删除的不是完全相同的两个东西的话,包括优先级或接受的参数值的不同,就删除操作就不会执行。

第二个remove_action()在这种情况下也不会执行任何操作,因为它要删除的function_2没有被添加过。如果删除指令里和添加指令里的任何一部分不是完全匹配的,那么删除操作就不会执行。但它不会返回任何错误信息,这会很有用,因为添加一个动作(action)的时候需要考虑符合某种条件,但是你不希望删除的时候也要符合相同的条件。例如,如果你不想在页面上显示评论表单,那么你尽可以执行移除评论表单的操作,不管这个网页是不是页面类型,即使这个表单只能在单个页面上加载。

还有一个需要注意的地方。add_action必须在remove操作之前存在。

remove_action('hook', 'function_3'); 
add_action('hook', 'function_3'); 

这样仍然会执行add_action,因为它是在删除指令之后出现的。

简而言之:如果remove_action与add_action完全匹配,并且是在add_action之后,那么它将告诉WordPress进行删除。

主循环中的动作(action)

上面一条规则看起来对remove_actions似乎不太公平,但也是有它存在原因的。看看我在Tapestry中Gallery Post Format mod上的教程。我不打算再次贴上所有代码,但如果你不想来回点击,我会在这里放一些相关的代码片段。

注意看下,代码将被添加到主循环内(genesis_before_post是主循环中的第一个钩子)。这意味着在循环中每次加载新帖子时都会重复这个操作。根据我们对动作(action)的了解,重复的add_actions会忽略,对于已被删除的动作(action),则remov_action不会执行。所以,下面的代码中处理了两个不同的可能会发生变化的场景,因此每次都需要执行一次添加/删除。

//within the loop
if( $foo == $bar ){
 
    add_action('hook', 'function_1');
    remove_action('hook_2', 'function_1');
 
}
else {
 
    add_action('hook_2', 'function_1');
    remove_action('hook', 'function_1');
 
}

在这段代码中,我们假设有一个循环,并且$foo$bar变量在不同时间发生变化,有时相同有时不同,因为我有两个选项。如果像个变量相同,条件为真,那么我将“hook”钩子被触发从而运行function_1的代码,但我不希望触发第二个钩子“hook_2”,所以我必须删除它,即使在function_1的代码没有被添加的情况下。在第二个条件中,变量不同,条件为假,那么“hook_2”钩子被触发,function_1会被添加,但必须将其从“hook”钩子中删掉,因为它可能在先前已经被添加过了或可能没有先添加过。

因为相同的动作并不会重复执行,并且因为remove_action依赖于已经存在的add_action,所以这让我可以使用非常简单的代码将我的函数从一个钩子移动到另一个钩子。

小结

但,知道只是成功的一半。本系列的下一部分将介绍如何在Genesis文件中查找需要的动作(action)并在子主题中更改它们。

译后记

原文链接:Genesis Explained Actions

hook,hooks,一个名叫hook的hook,一个名叫“钩子”的钩子。用钩子名为“钩子”的钩子去勾一个钩子,真尼玛够了。。。玩绕口令呢??咱就不能换个名字吗?翻完这个,已经快无法直视钩子了,脑子里全是钩子。

还有,我觉得作者写的什么乐高积木、积木上的小凸点这种比喻也不咋地,不是很形象,倒不如另一个老外写的比喻成工厂、工人和大吊钩更形象,WordPress Hooks, Actions, and Filters: What They Do and How They Work 。感兴趣的可以看看,改天也想翻译下这个文章,将的挺形象的

或者干脆改名叫wordpress之钟馗 钩子算了

能看明白和能说明白真不是一回事啊。今天给儿子讲题,怎么讲都不明白,无奈都用上实物(食物)教学了,真的是”食物”教学,瓜子、花生、核桃、开心果、奥利奥都出场了,结果东西都快吃完了还是没绕清楚。气得我是哭笑不得,也真是无奈了?

下午在咖啡馆里翻着这篇文章的时候,后面坐着一个调酒师正在和英语老师进行着1v1真人教学:

– 我很冷怎么说? – “I cold” – 错!中式英语!be动词呢?

????

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 骚操作!WordPress流氓主题利用户服务器做肉鸡发动DDos攻击

    WordPress主题供应商Pipdig被发现利用客户的服务器对竞争对手的网站发动DDoS攻击。安全研究人员jem分析了他们的代码后,找到了实锤进行了DDoS攻...

    丘壑
  • 在Genesis主题中手动添加WordPress相关文章

    “相关文章(Related posts )” 或者叫“你可能还感兴趣的文章”,是WordPress中呼声最高的需求之一。许多博客,新闻网站和企业网站都有这个需求...

    丘壑
  • Genesis框架从入门到精通(4):框架的内置动作(续)

    在本系列的前一篇 Genesis框架从入门到精通(3):框架的内置动作 ,我解释了在哪里找Genesis 的内置动作,以及如何使用钩子移除,移动或改变动作。在这...

    丘壑
  • 强化学习 9: 当 Action 的空间连续时

    之前骑自行车的例子中,action 可以是向左或者向右,现在的话可能是一个实数值的区间。

    杨熹
  • OVS中Action源码分析&自定义Action

    前言 在生产或是科研中,OpenFlow定义的Action有时候并不能完全满足需求,那么如何向OVS中添加一个自定义的action,本文对此做详细分析。 我们知...

    SDNLAB
  • 【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--控制器和处理函数的注册篇(4/8)【controller+action】

    前边的文章把一些基本的前置任务都完成了。接下就是比较重要的处理函数action是如何自动发现和注册的拉,也就是入口函数RouteHandler(也是我们的第一个...

    旺财的城堡
  • struts2-笔记

    文件下载http://struts.apache.org/download.cgi 第一步导入jar 包 在lib中有jar 包,不能把这些都导入到项目中 在a...

    用户1197315
  • React---Redux异步action

    (2).何时需要异步action:想要对状态进行操作,但是具体的数据靠异步任务返回。

    半指温柔乐
  • Q-learning 的 python 实现

    通过前面的几篇文章可以知道,当我们要用 Q-learning 解决一个问题时,首先需要知道这个问题有多少个 state,每个 state 有多少 action,...

    杨熹
  • 深入理解 tc ebpf 的 direct-action (da) 模式(2020)

    本文翻译自 2020 年 Quentin Monnet 的一篇英文博客:Understanding tc “direct action” mode for BP...

    米开朗基杨

扫码关注云+社区

领取腾讯云代金券