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

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

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

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

原文地址:Genesis Explained Framework Actions

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Genesis框架从入门到精通(1):什么是框架?

    WordPress主题框架Genesis的工作原理可能会让很多人感到困惑不解,这导致开发者在开始用Genesis框架时可能会一脸蒙逼,无所适从。

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

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

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

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

    丘壑
  • Zabbix前端源码分析 -- 主机可用性(Availability)图标

    某大型企业云计算架构师,多年Zabbix,Python,Linux使用经验,社区群活跃核心成员之一

    Zabbix
  • VMware tools详细安装过程

    在VMware下安装完Ubuntu的虚拟机后,界面总是很小,使用起来非常的不方便而且不美观,但是该工作对于小白而言有事比较困难的事情(ps:真的挺费劲的),进过...

    昱良
  • Sublime 究极技巧4 - 构建Python,php运行及调试环境

    白墨石
  • 从生到死, 人皆为货币

    当区块链技术以摧枯拉朽之势呼啸而来,曾经以为2140年(比特币被挖完的那一天)才会到来的场景触手可及,矩阵已成,三体降临,这一切并不遥远。

    区块链大本营
  • 腾讯云+kodexplorer可道云搭建私有云盘

    KodExplorer可道云,原名芒果云,是基于Web技术的私有云和在线文件管理系统。致力于为用户提供安全可控、可靠易用、高扩展性的私有云解决方案。用户只需通过...

    之至top
  • DT时代,你需要知道的数据报告网站

    链接:https://www.zhihu.com/question/19766160/answer/92693568?from=profile_answer_c...

    华章科技
  • 百万现金悬赏,一起来给腾讯会议挖洞!

    受疫情影响,远程办公软件在全球范围内需求激增,当线上会议成为越来越多企业和用户选择的同时,也面临着新的安全风险和挑战。 

    腾讯安全

扫码关注云+社区

领取腾讯云代金券

,,