专栏首页一丘一壑Genesis框架从入门到精通(4):框架的内置动作(续)

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

在本系列的前一篇 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框架从入门到精通(2):什么是动作? Genesis框架从入门到精通(3):框架的内置动作

现在你已经了解了如何通过钩子向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函数

“调用函数”这个说法的意思就是告诉函数开始运行。如果你以前编辑过模板,很可能在你不知道的时候就已经调用过函数。如果你在模板文件里添加了什么东西或者其他操作,你就是在调用该函数了。当你使用钩子时,你也是在调用一个函数,你就是告诉在函数运行之前告诉它要在哪里运行。这意味着钩子函数可以与“普通”函数互换。就像你可以在钩子中使用另一个函数一样,你可以在也不使用钩子的情况下调用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入门-函数篇

简介:本教程结合实例形式分析了PHP关于自定义函数的创建、返回值、默认值、参数、值传递、作用域 以及可变函数、嵌套函数、递归函数、闭包函数的使用等相关技巧。

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Genesis框架从入门到精通(9): 函数介绍

    In previous parts of the Genesis Explained series I talked about actions and fil...

    丘壑
  • 神级WordPress主题框架Genesis 2.8发布:容易引起极大舒适感

    根本毛病在哪呢?那是因为,当你安装了一个新主题时,这个主题的演示内容不会自动导入进来(译注:这就好比方便面包装上的图,“图片仅供参考”)。这就导致用户需要在文档...

    丘壑
  • Genesis框架从入门到精通(8): 框架过滤器和数组

    Genesis Explained Framework Filters with Arrays

    丘壑
  • 【玩转腾讯云】那些天,我学习的腾讯云函数

    腾讯家的产品我用很久了,而腾讯云函数是让我印象最深刻的,可以说,我见证了腾讯云函数的诞生、成长和发展。

    浅墨233
  • js的回调函数详解

    在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用。既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递...

    java达人
  • Python进阶教程笔记(七)函数式编程

    由于参数 x, y 和 f 都可以任意传入,如果 f 传入其他函数,就可以得到不同的返回值。

    Lemon黄
  • kotlin Standard中的内联函数示例详解

    let、with、run、apply、also、takeIf、takeUnless、repeat函数的使用

    砸漏
  • Python 3 函数

    函数能提高应用的模块性,和代码的重复利用率Python提供了许多内建函数,比如print()。但也可以自己创建函数,这被叫做用户自定义函数。

    用户6184845
  • C语言之函数

      结构化程序设计主张按功能来分析需求,主要原则自顶向下,逐步求精,模块化等。 主张按功能把软件系统逐步细分,每个功能都负责对数据进行一次处理,每个功能接收一些...

    互联网金融打杂
  • 一文读懂支持向量积核函数(附公式)

    来源:jerrylead 本文通过多个例子为你介绍支持向量积核函数,助你更好地理解。 核函数(Kernels) 考虑我们最初在“线性回归”中提出的问题,特征是房...

    数据派THU

扫码关注云+社区

领取腾讯云代金券