如果你正在使用从免费WordPress主题库下载的主题,或者从其他网站购买收费的主题,你可能需要对主题进行一些修改。
你可能想更改页面的字体或添加一个新的模板文件,想添加从网上的教程或课程中看到比较有用的功能代码,或者你想把这个主题作为基础设计你自己的主题。
你可能会直接去修改主题的源代码。请不要这样做!下次更新该主题时,所下载的新文件将覆盖掉你所做的所有更改。但是如果你确实需要编辑主题,应该怎么做呢?
有一种方法可以编辑主题中的代码,仍然能够下载最新的更新并且不会覆盖你所做的所有更改:那就是使用原始主题作为父主题创建子主题。
首先,先安装好父主题,但是不要激活它。然后在WordPress后台管理中安装并激活子主题,子主题中的代码需要指定这是个子主题,以及所关联的父主题。
下面的内容将展示如何在WordPress中创建子主题。其中还包含一些关于子主题和父主题是如何运作的说明,可以方便如何修改子主题的代码来显示想要的内容。
创建子主题
首先,需要在wp-content/themes目录中创建子主题目录,比如your-child-theme。子主题目录中必须包含style.css和functions.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将使用模板层次结构来查找最相关的文件:
- 特定类别的类别存档模板文件,使用目录缩略名:
category-travel.php - 特定类别的类别存档文件,使用目录ID:
category-23.php - 通用的类别存档文件:
category.php - 通用的存档文件:
archive.php - 涵盖所有的文件:
index.php
WordPress在父主题和子主题中查找这些模板文件,无论文件是在父主题还是子主题中,WordPress将使用其找到的在模板层次结构中的第一个文件。
有一个例外情况,当最相关的模板文件在父主题和子主题中都存在时,WordPress将使用子主题的文件,而忽略父主题的文件。这是子主题最常见的用途之一——覆盖父主题中的特定文件。
上面关于类别的例子,下面有几个示例来说明模板文件使用:
- 如果子主题中存在
archive.php和index.php两个文件,父主题中存在category.php和index.php两个文件,那么WordPress将使用父主题的category.php文件,因为它在模板的层次结构中级别最高。 - 如果子主题中存在
category.php和index.php两个文件,父主题中存在archive.php和index.php两个文件,那么WordPress将使用子主题中的category.php文件, 因为它在模板的层次结构中级别最高。 - 如果子主题中存在
archive.php和index.php两个文件,父主题中存在archive.php和index.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()挂钩。
通过这种方式,就可以为子主题编写函数,就好像父主题的函数从未存在过一样,但是要记住不要给它子主题函数起相同的名字!
子主题是编辑主题有用工具
子主题有两个主要的用途:
- 使用被设计为父主题(通常称为框架)的主题,该框架不是为单独使用而设计的。相反,您可以使用子主题添加样式和额外的模板文件。
- 可以修改父主题,而无需实际直接修改父主题代码,或者添加额外的模板文件。这意味着将来当父主题有更新时,对父主题所作的修改将不会丢失。
如果有需要修改的第三方主题,可以通过创建子主题的方式来实现不需要修改任何原主题的代码,而又可以增加或修改原主题的功能和样式,大家可以试试!
在修改主题过程中,大家如果有任何需要咨询和帮助的请私信或留言给我!



暂无评论
要发表评论,您必须先 登录