前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Genesis框架从入门到精通(3):框架的内置动作

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

作者头像
丘壑
发布2019-03-13 10:55:41
8650
发布2019-03-13 10:55:41
举报
文章被收录于专栏:一丘一壑一丘一壑

在本系列的第一部分, Genesis框架从入门到精通(1):什么是框架? ,从总体上解释了Genesis框架是如何工作的,并展示了文件中的钩子长什么样子。在第二部分, Genesis框架从入门到精通(2):什么是动作? ,我解释了如何添加/删除动作,以及它们的技术细则。本篇教程旨在将这之前的两篇文章融合一下,把Wordpress的动作与Genesis框架结合起来。

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文件,所以打开它试着看看你是否能找到合适的代码位置。

代码语言:javascript
复制
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”。如下

代码语言:javascript
复制
remove_action('genesis_before_post_content', 'genesis_post_info');

非常容易。

移动动作

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

代码语言:javascript
复制
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”。这是我们最终得到的代码

代码语言:javascript
复制
remove_action('genesis_after_header', 'genesis_do_nav');
add_action('genesis_before_header', 'genesis_do_nav');

回顾一下前文,我们会发现这正是期望得到的效果。

修改动作

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

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

代码语言:javascript
复制
add_action('genesis_loop', 'genesis_do_loop');

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

代码语言:javascript
复制
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全局变量。你可以使用逗号分隔变量创建多个全局变量

代码语言:javascript
复制
global $post, $query_string;

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

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

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

要更改某些函数,最好先复制现有函数,为其指定新名称,然后根据需要对其进行编辑。正如我之前所说,还有其他方式可以修改函数。在本系列的接下来的教程中,我将解释什么是过滤器,它可以让你在不用对动作进行删除,添加,修改操作的情况下做出更大的更改。

现在,你可以在Genesis文件中找到需要的动作,然后删除,移动或修改它们。这是一个非常好的开始。在本系列的下一部分中,我将讨论一些其他很酷的用于处理动作的技巧,包括如何添加新操作,使用现有函数以及在动作的外部使用函数。

原文地址:Genesis Explained Framework Actions

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何使用Genesis的钩子( Hooks)
    • 删除动作
      • 移动动作
        • 修改动作
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档