Genesis教程:框架的内置动作

0 评论

Genesis在目录结构和文件组织方面做得很好。下面是Genesis目录中的文件和简要描述:

genesis :包含所有文件和目录。此目录中的文件是通用模板文件,主要是用于在框架中加载其他文件。header.php和footer.php是框架的核心文件,文件定义了各种钩子。

images: Genesis主题中用到的图片, 因为应该在子主题中进行开发,所以大多数时候用不到
lib :包含框架的核心文件,init.php文件用于加载所有其他文件,framework.php文件包含框架使用的核心钩子
admin :与后台管理相关的文件
images: 管理后台用到的图片

classes :每个PHP文件中都声明了一个主题要使用到的类
css :管理后台的样式文件
functions :主题和子主题中使用的通用函数或辅助函数。我将写一篇文章,详细说下这里的内容
js :主题的需要用到的js脚本,包括管理后台的,评论的和菜单的js脚本
languages: 多语言用的文件。(注:除了在主题中提供pot文件外,还可以通过Genesis Translations插件将主题一键翻译成中文,其中包括前台页面和后台选项)
shortcodes: 一些内置的wordpress短代码
structure: 用于管理前端输出, 本文将重点讲述的部分
tools: Genesis用来管理特殊函数的工具
widgets: 主题会用到的widgets

通过文件夹结构能明确的快速定位到你要查找的文件。针对每个目录上都可以写几个教程,但是这篇教程主要侧重于将动作(actions)与框架结合起来,所以主要涉及到的是structure文件夹。

structure中的文件包含了Genesis中要使用的所有动作。我经常被问到的一个问题是“你是怎么知道用什么代码可以删除网站上的特定元素?”因为我知道是哪个目录中包含了最基础的动作。如果我不能一下子就想出来,我可以很快找到它。我们来看看structure目录中的文件。

archive.php :包含操作归档页面的动作,如归档页面的标题输出
comments.php :包含操作评论的动作,如评论的提交表单
footer.php :用于页脚的动作,包括页脚上的widget
header.php :会被header.php中的钩子触发的动作,包括站点标题
layout.php :用于加载侧边栏的动作
loops.php :处理Genesis中可用的3种循环:标准循环(Standard loop),自定义循环( Custom loop)和网格化循环( grid loop )
menu.php :控制菜单的输出
post.php :基本上这是在循环内加载的所有东西
search.php :用于搜索页面的动作
sidebar.php :用于创建用于侧边栏的钩子和动作(仅在被layout.php文件调用了的情况下执行)
同样,可以看出根据文件结构找到需要的代码是多么容易。它们的名称实际上就是函数的意义,完全可以按图索骥。

如何使用Genesis的钩子( Hooks)
让我们看看如何使用钩子。我将分三个部分:删除动作,移动动作和修改动作。在每个部分中,我将从Genesis文件中给出一个具体示例,并解释发生的效果,还将告诉你如何举一反三。

删除动作

这是最简单的部分。在上一篇文章中,我解释了如何先添加然后再删除同一个动作。你要做的就是找到需要被删除的动作,将其复制到子主题functions.php文件中,然后将把”add_action()”更改为“remove_action()”。假设你需要从你的网站删除日志的描述信息部分。该怎么做?我们知道这个信息是在循环中,因为它在归档视图中的每个日志里都出现了。好的,现在看看文件,哪一个会处理循环动作?是的,post.php文件,所以打开它试着看看你是否能找到合适的代码位置。

add_filter( ‘genesis_post_info’, ‘do_shortcode’, 20 );
add_action( ‘genesis_entry_header’, ‘genesis_post_info’, 12 );
add_action( ‘genesis_before_post_content’, ‘genesis_post_info’ );
/**
* Echo the post info (byline) under the post title.
*
* By default, only does post info on posts.
*
* The post info makes use of several shortcodes by default, and the whole output
* is filtered via `genesis_post_info` before echoing.
*
* @since 1.0.0
*
* @return void Return early if post type lacks support for `genesis-entry-meta-before-content`.
*/
function genesis_post_info() {
}
好的,现在我们找到了所需的代码,有一个过滤器,一个动作和一个函数。过滤器会在另一个教程里讲,所以我们暂时忽略它。要移除或移动一个动作,可以不用依赖于函数,所以我们可以忽略上面的函数。我们所需要的只是一行。将其复制到子主题的functions.php中,并将“add”更改为“remove”。如下

remove_action(‘genesis_before_post_content’, ‘genesis_post_info’);

非常容易。

移动动作

要移动一个动作,第一步要做的是把这个动作删除。可以把它想象成Microsoft Word中的剪切和粘贴。如果你想移动一些代码,首先要剪切它,然后在你想要的地方添加。让我们试试如何移动导航菜单 。首先,我们需要知道要查看的文件。由于我们要处理的是菜单栏,所以,答案应该非常明显……是的,menu.php。因为我们想要移动的是导航菜单。没什么花头可以搞,我们只想把它从网站标题的下面移动到上面。你找到主导航菜单的代码了吗?我不打算在这里全部复制,这是相关部分

add_action( ‘genesis_after_header’, ‘genesis_do_nav’ );
/**
* Echo the “Primary Navigation” menu.
*
* Applies the `genesis_do_nav` filter.
*
* @since 1.0.0
*/
function genesis_do_nav() {

}
我们知道如何删除它,只需将动作复制到子主题functions.php文件中,并将“add”更改为“remove”,现在我们希望将它放在其他地方,所以再次粘贴代码并更改钩子名字。记住所有钩子的名字需要费一点功夫,可以在本系列的第一部分教程。由于我们想要在标题之前显示,所以将它从“genesis_after_header”更改为“genesis_before_header”。这是我们最终得到的代码

remove_action(‘genesis_after_header’, ‘genesis_do_nav’);
add_action(‘genesis_before_header’, ‘genesis_do_nav’);
这正是期望得到的效果。

修改动作

这是处理Genesis 动作时最难搞的部分。你必须删除现有动作,然后创建自己的函数来替换它。在子主题中最常见的修改之一是自定义循环。这可以通过多种方式完成,但是为了讲一下修改动作,我们将删除现有的循环并使用genesis_custom_loop()将其替换为自定义循环。

由于要处理的是循环,我们应该打开哪个文件?如果你觉得是footer.php那么你就还没搞懂。当然是loops.php。代码就在文件的顶部

add_action(‘genesis_loop’, ‘genesis_do_loop’);
很简单。这会加载一个函数来决定使用哪个循环,我们先绕过。先直接看下我们的最终代码,以便更好的解释将要添加到子主题中的内容,以及如何通过其他动作来达到目的

remove_action(‘genesis_loop’, ‘genesis_do_loop’);
add_action(‘genesis_loop’, ‘child_do_loop’);
function child_do_loop() {
global $query_string;

$args = array ( ‘cat’ => -1, ‘order’ => ‘ASC’ );

$args = wp_parse_args( $query_string, $args );

genesis_custom_loop( $args );
}
如果你从头开始认真看了的话,你就知道第一行只是删除现有的循环功能。第二行加入了自定义循环功能。它必须具有唯一的名称。我经常将“genesis”改为“chiild”,这样很好用。如果将它添加到archive.php文件中,我可能会改为使用“child_do_archive_loop”。另请注意,第3行定义了函数,它必须和add_action()中的函数名称完全一直,这一点也非常重要。

代码的内容就是为自定义循环创建了参数$args。首先是让已有的查询可以在函数内部使用。要在函数中使用未定义的变量,都需要声明为全局变量才可以使用。如果我想使用$ post-> ID,这是一个非常常见的需求,那么我还需要声明一个$post全局变量。你可以使用逗号分隔变量创建多个全局变量

global $post, $query_string;
继续,下一行定义我将定义用于自定义查询的$args。这些是WP_Query或query_posts()中使用的相同args。

由于我想保留已有查询,我需要将其与我定义的$args合并。wp_parse_args()函数就是这个作用。

使用我新合并的$args,我现在可以运行genesis_custom_loop(),基本上,它就是根据传递的参数来构建一个新查询,然后依据标准循环中的完全相同的钩子运行该循环。

 

相关软件
Genesis Architect 是 S2C 的架构设计产品,涉及系统设备、应用软件、半导体芯片、人工智能、网络通信、信号处理和控制系统等领域都可用此产品进行架构开发和优化设计。
相关阅读