在本系列的前一篇 Genesis框架从入门到精通(3):框架的内置动作 ,我解释了在哪里找Genesis 的内置动作,以及如何使用钩子移除,移动或改变动作。在这篇文章的中,我将继续讲解如何使用自定义的函数、在添加动作时使用既有函数的技巧,以及怎样使用Genesis函数。
Genesis的函数是很好用,但是如果当你想在网站上添加其他内容时呢?你要自己写一个函数,并使用add_action()
把它挂载到某一个钩子上。 (请记住,add_action()
, remove_action()
实际上只是指明了代码要在什么位置执行)。编写一个函数听起来好像复杂的样子,特别是对不熟悉php的人。不过它真的很容易。函数分为几个关键部分,可以看成是某种按顺序执行的任务模板。让我们看一下这个generic
函数
function generic( $arg='foo' ) {
echo $arg;
}
很简单。一个函数包括6个部分,第1行就包括了其中的4个基础部分。单词“function”是第一部分,它告诉php“记住这个函数,后面要用到”。“generic”是函数名,这样你就可以用这个名字来调用代码并执行,而不是每次都要写同样的一大啪啦的代码。当然,这个例子中没那么多代码,也不会节省太多打字量,但在实际开发中它可能会有很多代码。
说一下函数的名称。 “generic”是一个非常糟糕的可怕的名称。太短,没有描述性,而且……太通用了(generic的意思就是通用)。名称的长度不是问题。PHP的函数名字并不要求最少几个字符,名称太短问题是不好确定唯一性的,也不能很好的描述函数的作用。
函数名称必须是唯一的。你不能拥有两个具有相同名称的函数,否则你可能会收到报错并把网站搞崩溃。子主题里函数通常使用子主题名称或缩写作为前缀,这可以很大程度上避免函数重名导致的问题。
函数名字也应该是有意义的。虽然这不是强制要求。我可以随便写一个处理标题输出的函数叫child_function_a
,只要其他函数没有叫这个名字,它就可以用,但是当我需要调用它的时候,我可能记不住这个名字,而且很可能会忘记什么它是干什么用的了。 叫“child_do_title”要好得多,因为它告诉我它是子主题中的一个函数,它会去“处理标题”或输出标题。
第一行的下一部分($arg ='foo')
是函数的“参数”。函数可以不需要参数,也可以有多个参数。在这个例子里,我设置了一个参数的“默认”值,但是在调用该函数时可以用别的值来替换它。如果没有参数,就写成 function generic(){}
,可能大部分时候你都会这么用。再往下,只是把这个参数给打印(echo)出来。这意味着,函数在哪里执行,它就会把这个值打印输出到函数所在的位置,如果我想输出“bar”而不是默认的“foo”,那就写成 generic('bar')
。在配合钩子使用时,这个函数可能会更有意义。
在参数之后是左大括号 {
,开始写函数的代码, {}
之间的所有内容都是函数的“内脏”,在调用函数时,这里的代码都会运行(稍后将详细介绍)。函数部分以右大括号“}”结束,因此php引擎知道在哪里停止。
这就是一个完整的函数了,但是你可能会想“我又不懂php,就会点html和css,这玩意对我没啥用”,就像我刚开始学的时候一样。好消息是,如果你会写html并想使用html,也是可以的。
function generic_html() { ?>
Now I'm in html, this will print out using whatever
<strong>html</strong> markup I give it.
<?php }
你甚至可以混合使用html和php:
function generic_html_php() { ?>
<p>See, still in html, no need for any fancy php,
unless I need something dynamic,
like the date <?php echo date(); ?>.</p>
<p>Pretty easy, and that date function
loads inline just like it would in a template file</p>
<?php }
好,你现在可以编写一个简单的函数了,但你需要将它添加到Genesis吗?嗯,这是最简单的部分,只需写出来你想怎么用这个函数就行了。需要在标题之前执行代码吗?
add_action( 'genesis_before_header', 'generic' );
关于怎么使用其他钩子和动作来调整位置,可以看之前的两篇文章。
现在你已经了解了如何通过钩子向Genesis添加自己的代码,但是还有很多东西需要学习。
一个常见的需求就是是将插件与Genesis集成。通常,有的插件会包含一段使用说明:“打开模板文件并将此代码添加到您希望显示的位置”。这比较难搞,因为有的子主题中并没有这个文件,而在Genesis中这个文件可能只有一行genesis();
怎么办呢?用动作(action)就行。我们来看看Add to Any插件。正常情况下,这个插件很容易集成,可以自动运行,但是假设你想在文章信息旁边的位置显示。插件的安装说明说要通过编辑器将一些代码添加到模板文件中。
<?php if( function_exists('ADDTOANY_SHARE_SAVE_KIT') ) { ADDTOANY_SHARE_SAVE_KIT(); } ?>
你不能直接在Genesis的文件里修改,因此你需要把这段代码写成一个动作函数。可以这样做
add_action( 'genesis_after_post_content', 'child_do_add_to_any' );
/**add the add to any function after post content if the function exists*/
function child_do_add_to_any() {
if( function_exists('ADDTOANY_SHARE_SAVE_KIT') )
ADDTOANY_SHARE_SAVE_KIT();
}
足够简单明了,但我们可以通过结合函数和动作来更简化一点。请记住,在 add_action()
这条语句里,“回调函数”部分只是指明要使用的函数,只要这个函数存在,任何函数都可以,所以你可以改为
if( function_exists('ADDTOANY_SHARE_SAVE_KIT') )
add_action( 'genesis_after_post_content', 'ADDTOANY_SHARE_SAVE_KIT' );
“调用函数”这个说法的意思就是告诉函数开始运行。如果你以前编辑过模板,很可能在你不知道的时候就已经调用过函数。如果你在模板文件里添加了什么东西或者其他操作,你就是在调用该函数了。当你使用钩子时,你也是在调用一个函数,你就是告诉在函数运行之前告诉它要在哪里运行。这意味着钩子函数可以与“普通”函数互换。就像你可以在钩子中使用另一个函数一样,你可以在也不使用钩子的情况下调用Genesis函数。
一个很好的用法就是在自定义 home.php
文件中。你可能修改了一个子主题的 home.php
文件,加入了一些自定义的内容,但你希望在某些内容之后再把博客上的文章也显示出来。看看 genesis/lib/structure/loops.php
文件,你会发现是 genesis_do_loop()
调用了 genesis_standard_loop()
,所以你可以在home.php
文件中添加这个函数,你希望文章显示在哪里就添加在哪里
<?php genesis_standard_loop(); ?>
这适用于任何Genesis函数。如果你想将导航菜单放在主页上,可以像这样添加
<?php genesis_do_nav(); ?>
我希望通过这三篇文章把让钩子的实际意义讲明白了。
接下来是关于过滤器的教程,还有一些重要的Genesis函数需要关注。
原文链接:Genesis Explained Framework Actions Continued
如果你不了解php的函数,推荐你看看下面这个免费教程
简介:本教程结合实例形式分析了PHP关于自定义函数的创建、返回值、默认值、参数、值传递、作用域 以及可变函数、嵌套函数、递归函数、闭包函数的使用等相关技巧。