之前建立的主题框架将用作所开发网站的父主题。这意味着,在每一种情况下,你都需要去创建一个子主题,并运用自己的设计以及更多的其他的函数创建一个网站,而这个网站也是唯一的。

最显而易见的方式是全身心地投入,并开始在你的子主题中创建模板文件,用来覆盖框架中的那些原文件,但由于你已经给你的框架添加了动作挂钩和过滤挂钩, 所以这未必就是最好的一种方法。

在这篇文章中,我将重点介绍你可以运用在子主题中的一些技术,从而让你充分地利用好自己的框架,并能根据需要随时改善工作流程。

我将介绍的主题如下:

  • 创建初始子 WordPress 主题
  • 通过该框架的过滤挂钩修改代码
  • 通过该框架的行动挂钩添加代码
  • 在你的子主题中建立新的模板文件
  • 何时使用插件

创建初始子主题

开发主题框架的主要目的是为了运用 DRY(切勿重复自己) 原则,这也同样适用于你的子主题。

为框架创建一个或多个 「初始」 子主题会让你变得更有效率。子主题中包含有你需要在新项目中使用的一些核心代码。

在决定如何去创建的同时,有一些关于工作方式和建立网站的问题需要加以考虑:

  • 你是否是在为同一个部门有类似需求的客户创建网站?
  • 你是否是想给小客户提供低成本的基于模板的网站?
  • 你是否有能为大多数新项目服务的具体模板文件?
  • 你的某些网站是否需要具有一些独特的功能 (例如,我使用的两个初始子主题,一个有评论功能,另一个就没有)?
  • 是否有适用于大多数项目的样式?你能否使用面向对象的样式或一个 CSS 预处理器来处理大多数项目?
  • 是否有适用于大多数 (或占有一定显著比例的) 新项目的代码库或者其他资源?
  • 是否有两个或三个主要范畴,你可以将一些项目放置于其下,而每个范畴都涉及到类似的开发工作?

如果你对上述某一个问题的回答是肯定的话,那么创建一个或多个初始子主题就可以节省你的时间。你可以使用一些基本代码创建一整套子主题,这些代码你在所有项目中都会重复用到,那样你就不需要为每一个新项目去重写代码 (或创建文件) 。

注意:如果你要为每一个新项目添加一些代码的话,也许你只是想将它添加到你的框架之中,而不是子主题内,将来如果另有需要的话,使用一个挂钩你就可以将其覆盖。

即使你对以上问题的回答都是否定的,用空样式表和函数文件创建一个非常基本的初始主题,并在样式表中添加 WordPress 相关说明,来访问框架父主题,也是很有必要的:

  1. /*
  2.  Theme Name:   My Theme Framework Child
  3.  Theme URI:    
  4.  Description:  Starter Child Theme
  5.  Author:       Rachel McCollin
  6.  Author URI:   http://rachelmccollin.co.uk
  7.  Template:     wptutsplus-theme-framework-part6
  8.  Version:      1.0.0
  9.  Tags:         
  10.  Text Domain:  tutsplus
  11. */
  12.  
  13.  
  14. @import url("../wptutsplus-theme-framework-part6/style.css");

以上必填的字段是 Theme Name(主题名称) 和 Template(模板),其余的都是可填可不填。要确保 Template 使用的是框架主题的地址,而不是它的命名。这也将有助于完成与主题相关的其他字段。

如果你要加载架构样式表单的话,那么该 @import 声明也很重要。只要你把这个声明放在任何其他的 CSS 上,它就会在子主题样式表单的任何样式之前加载父主题样式表单,这意味着你可以在子主题框架内根据需要添加或覆盖样式。

您可能还需要使用你在子主题中最常用到的函数建立一个初始 functions.php 文件。然后,您可以选择将这些函数全部删除和/或根据具体项目将它们添加到主题中。

通过该框架的过滤挂钩修改代码

在给你的子主题添加样式之外,你很可能还想要更改由框架输出的代码。最轻巧的方式是通过过滤挂钩来实现,所以首先要确认你能否使用其中任何一个挂钩。

为新代码创建一个函数,再附上一个过滤挂钩,这比建立一个全新的模板文件更加有效;但是,如果你需要使用相同的过滤挂钩不断反复这样做时,你可能要考虑一下改变钩连一个动作挂钩的过滤挂钩,并为由该行动挂钩激活的每一个项目重写一个新函数。

为了更有效率,你可以创建一整套相关函数,放置在不同初始主题的函数文件中,或者使用一些函数创建一个插件,这些函数可以根据需要来激活。我将在之后的课程中更加详细地介绍到这个插件。

我在前面的课程中已经介绍过创建过滤挂钩的流程。简单说来,就是使用 add_filter() 函数给一个过滤挂钩附加一个函数。例如,在修改网站版权标记的链接和名称时,我创建了两个函数,如下所示:

  1. function wptp_amend_colophon_name() {
  2.  
  3.     $name = 'Rachel McCollin';
  4.     return $name;
  5.  
  6. }
  7. add_filter( 'wptp_colophon_name', 'wptp_amend_colophon_name' );
  8.  
  9. function wptp_amend_colophon_link() {
  10.  
  11.     $link = 'http://rachelmccollin.co.uk';
  12.     return $link;
  13.  
  14. }
  15. add_filter( 'wptp_colophon_link', 'wptp_amend_colophon_link' );

主题框架中的两个过滤挂钩分别是:wptp_colophon_name 和 wptp_colophon_link,它们都可以改变输出内容。

通过该框架的动作挂钩添加代码

你可以使用主题框架中的动作挂钩在网站的各个地方插入内容。

如果你是一直跟着本系列教程使用代码文件的,你目前就会有七个行动挂钩:

  • 在网页标题之前
  • 在网页标题之中
  • 在网页内容之前
  • 在网页内容之后
  • 在网页侧边栏中
  • 在网页页脚中
  • 在网页页脚后

例如,你想调用行动按钮添加到侧边栏,就可以新建一个 sidebar.php 文件,但是如果使用 wptp_sidebar 挂钩的话会更高效。

要做到这一点,就得在你的子主题中建立一个 functions.php 文件并添加以下内容:

  1. function wptp_cta() {?>
  2.  
  3.     <div >
  4.         <p>Email us on <a href="mailto:mail@example.com">mail@example.com</a></p>
  5.     </div>
  6.  
  7. <?php
  8. }
  9. add_action( 'wptp_sidebar', 'wptp_cta', 1 )

该 wptp_cta() 函数为调用行动挂钩创建了一个标记,并通过 wptp_sidebar 挂钩由 add_action() 函数激活,因为这个挂钩优先级为 1,所以它会出现在其他任何内容被触发之前。

使用动作挂钩你还可以添加大量其他的内容,比如页面内容之前/后的共享按钮、页脚中的其他内容、标题中的搜索框等等。

你可能只是想给特定的网页类型添加一些内容,比如单博客文章 (single blog posts) 。在这种情况下,最显而易见的方式是先新建一个 single.php 模板。其实,你仍然可以使用行动挂钩,外加一个条件标签就行了:

  1. function wptp_after_single_posts() {
  2.  
  3.     if( is_singular( 'post' ) ) { ?>
  4.  
  5.         <h3>Enjoyed this? Try reading more!</h3>
  6.  
  7.         <?php
  8.         // query to list latest blog posts here
  9.  
  10.     }
  11.  
  12. }
  13. add_action( 'wptp_after_content', 'wptp_after_single_posts' );

这会创建一个新的查询 (使用 WP_Query)——输出最新的博客文章列表,这是为了鼓励访客在阅读完一篇博客文章后再读点别的东西。该 is_singular( 'post' ) 条件标签确保了只能输出一篇文章,并将其连接到 wptp_after_content 挂钩上,它会显示在主体文章的内容之后。

在你的子主题中建立新的模板文件

有时,仅仅使用过滤挂钩或动作挂钩并不能达到目的,在这种情况下,你需要在你的子主题中创建新的模板文件。

这些文件可能和存储在你的框架中的模板文件是相同的,这种情况下,在子主题中的文件将会覆盖它们。但也有可能它们是新的模板文件,例如一个新的范畴、分类或文章类型。

如果在一开始,你就在子主题中创建并使用了模板文件,事情就会变得容易得多。我遵循的步骤是:

  1. 确定你需要创建的模板文件,参照 WordPress 模板层次结构 (WordPress template hierarchy)
  2. 在你的子主题中建立一个有相应名称的空白文件
  3. 确定框架中的文件,该文件与新文件关系最紧密 (请再次参照模板层次结构)
  4. 将内容复制到你的新文件中
  5. 按要求修改新文件

这样做就不用复制任何代码,而这些代码在新文件和现有文件里是相同的,如调用包括文件 (include files) 。

何时使用插件

根据你的框架创建网站时,你还有一个选择是结合你的子主题使用插件。一个插件并不会完全取代子主题,但它在下列情况下会非常有效:

  • 你要添加的功能与主题无关 (要保持它不变,即使将来该网站改变了主题) 。这可能包括注册自定义文章类型或分类。
  • 你想在你创建的众多网站上使用某个功能,但它又不能直接添加到初始子主题或框架本身之中。

我会在下一课介绍如何为你的框架开发插件。

小结

目前,你建立的代码库和支持你开发网站的所有文件只是创建主题框架的一个起点。每个创建的网站需要运行在一个子主题上,你的主题框架就是其父主题。

正如我们所看到的,你子主题会加入自己的风格和功能,它们通过框架的动作挂钩和过滤挂钩,或者通过创建新的模板文件做到这一点。采用最少的代码来解决问题总是好的,因为它可以让你的网站运行更快,你的工作也会变得更加轻松!