如何创建WordPress子主题

如果你正在使用从免费WordPress主题库下载的主题,或者从其他网站购买收费的主题,你可能需要对主题进行一些修改。

你可能想更改页面的字体或添加一个新的模板文件,想添加从网上的教程或课程中看到比较有用的功能代码,或者你想把这个主题作为基础设计你自己的主题。

你可能会直接去修改主题的源代码。请不要这样做!下次更新该主题时,所下载的新文件将覆盖掉你所做的所有更改。但是如果你确实需要编辑主题,应该怎么做呢?

有一种方法可以编辑主题中的代码,仍然能够下载最新的更新并且不会覆盖你所做的所有更改:那就是使用原始主题作为父主题创建子主题。

首先,先安装好父主题,但是不要激活它。然后在WordPress后台管理中安装并激活子主题,子主题中的代码需要指定这是个子主题,以及所关联的父主题。

下面的内容将展示如何在WordPress中创建子主题。其中还包含一些关于子主题和父主题是如何运作的说明,可以方便如何修改子主题的代码来显示想要的内容。

创建子主题

首先,需要在wp-content/themes目录中创建子主题目录,比如your-child-theme。子主题目录中必须包含style.cssfunctions.php两个文件,子主题中还可以添加其他可选的文件,如模板文件或者包含文件。

创建style.css文件。在该文件的顶部,添加以下注释代码:

/*
Theme Name: Autumn-Pro Child Theme
Theme URI: https://jevonz.com/automn-pro-child-theme/
Description: Child theme for the Autumn-Pro theme
Author: Jevons Zhou
Text Domain: automnpro
Author URI: https://jevonz.com/
Template: Autumn-Pro

Version: 1.0
*/

这些注释代码提供了跟跟其他主题一样的信息,可以让WordPress识别出这是一个主题。跟其他主题不一样,作为子主题注释中还增加了一行信息Template: Autumn-Pro,这样WordPress就可以识别出这是Autumn-Pro的子主题。

Template后面的内容修改为主题所在的目录名称,任何主题都可以作为父主题,记住这里填写的内容不是主题的标题主题所在的目录名称。

保存修改好的样式表文件,然后在子主题中创建另一个名为functions.php的文件。

在这个文件中,需要加载父主题的样式表。推荐使用以下代码加载父主题的样式表:

/* enqueue script for parent theme stylesheet */
function autumnpro_parent_styles() {

    // enqueue style
    wp_enqueue_style( 'parent', get_template_directory_uri().'/style.css' );

}
add_action( 'wp_enqueue_scripts', 'autumnpro_parent_styles');

通过添加以上代码,子主题就可以继承父主题的样式,使用get_tempate_directory_uri()来定位父主题所在的位置(这个模板目录是父主题文件的存放位置)。

如果子主题需要通过增加加新的样式来覆盖或扩展父主题的样式,需要在子主题的样式表文件增加相应的样式,不要在functions.php文件中添加样式或加载另外的样式表文件。

在子主题的functions.php文件中可以定义新的函数,在子主题文件夹中还可以添加模板文件,这些文件将覆盖父主题中的相同文件名的模板文件。

到此,子主题就创建完成了。创建子主题后,需要理解子主题和父主题模板文件是如何交互的。

创建模板文件

下面来了解以下主题的模板文件。WordPress使用哪个模板文件来显示页面将取决于两件事:模板层次结构和添加到子主题的文件。

假设当前有一个Travel类别的存档页面,WordPress将使用模板层次结构来查找最相关的文件:

  1. 特定类别的类别存档模板文件,使用目录缩略名:category-travel.php
  2. 特定类别的类别存档文件,使用目录ID:category-23.php
  3. 通用的类别存档文件:category.php
  4. 通用的存档文件:archive.php
  5. 涵盖所有的文件:index.php

WordPress在父主题和子主题中查找这些模板文件,无论文件是在父主题还是子主题中,WordPress将使用其找到的在模板层次结构中的第一个文件。

有一个例外情况,当最相关的模板文件在父主题和子主题中都存在时,WordPress将使用子主题的文件,而忽略父主题的文件。这是子主题最常见的用途之一——覆盖父主题中的特定文件。

上面关于类别的例子,下面有几个示例来说明模板文件使用:

  • 如果子主题中存在archive.phpindex.php两个文件,父主题中存在category.phpindex.php两个文件,那么WordPress将使用父主题的category.php文件,因为它在模板的层次结构中级别最高。
  • 如果子主题中存在category.phpindex.php两个文件,父主题中存在archive.phpindex.php两个文件,那么WordPress将使用子主题中的category.php文件, 因为它在模板的层次结构中级别最高。
  • 如果子主题中存在archive.phpindex.php两个文件,父主题中存在archive.phpindex.php两个文件,那么WordPress将使用子主题中的archive.php文件,因为有两个文件在模板的层级结构中级别最高,按上面所提的子主题的文件会覆盖父主题的文件。

因此,如果需要覆盖父主题的模板文件,在子主题中创建该文件的副本来编写所需的代码,或者创建一个在模板层次结构中更高的文件,并将其添加到子主题中。

创建子主题的函数

函数的工作方式与模板文件不一样,没有那么直接。

如果在子主题中增加一个跟父主题一样名字的函数,WordPress会抛出一个错误,因为它试图两次调用同一个函数。

但是,如果父主题中的函数是可插拔的,则不会发生这种情况。一个可插拔的函数被包含在另一个同名函数的条件检查中,代码是这样写的:

if ( ! function_exists( 'function_name' ) ) {

    function function_name() {

    // contents of function

    }
}

WordPress将检查是否已经调用了同名的函数。如果没有被调用,它将运行这个函数。这是因为子主题的函数在父主题的函数之前被调用。如果在子主题中使用相同的名称编写函数,则会运行该函数。

但是父主题中的函数不是可插拔的,而且你又想在子主题中覆盖它该怎么处理?

在这种情况下,可以通过写一个新函数来实现,该函数从根本上抵消了父主题中的相同函数的功能,WordPress赋予它比父主题中的函数更高的优先级,这样它就会在父主题函数之后运行。或者,你也可以从父主题中取消函数的挂钩,并在子主题中编写一个新函数来重新挂钩。

假设父主题中的函数是这样的:

function parent_function() {

    // contents of function here

}
add_action ( 'init', 'parent_function' );

如果你的子主题中的函数可以撤销父主题的函数,而不必停止父主题函数的运行,你可以这样写:

function child_function() {

    // contents of function here
}
add_action ( 'init', 'child_function', 20 );

但是如果你需要阻止父主题的函数运行,你应该像这样先移除它:

function wpmu_remove_parent_function(){

    remove_action( 'init', 'parent_function' );
}
add_action( 'wp_head', 'wpmu_remove_parent_function' );

请注意,需要用remove_action()函数放在另一个函数中阻止父主题的函数运行并与wp_head()挂钩。

通过这种方式,就可以为子主题编写函数,就好像父主题的函数从未存在过一样,但是要记住不要给它子主题函数起相同的名字!

子主题是编辑主题有用工具

子主题有两个主要的用途:

  • 使用被设计为父主题(通常称为框架)的主题,该框架不是为单独使用而设计的。相反,您可以使用子主题添加样式和额外的模板文件。
  • 可以修改父主题,而无需实际直接修改父主题代码,或者添加额外的模板文件。这意味着将来当父主题有更新时,对父主题所作的修改将不会丢失。

如果有需要修改的第三方主题,可以通过创建子主题的方式来实现不需要修改任何原主题的代码,而又可以增加或修改原主题的功能和样式,大家可以试试!

在修改主题过程中,大家如果有任何需要咨询和帮助的请私信或留言给我!

继续阅读本文相关话题

相关推荐

暂无相关文章!

暂无评论