在转到父主题之前,如何首先使用Include检查子主题文件?

时间:2018-09-14 作者:Mike B.

我正在基于现有的父主题创建WordPress子主题,并且我想让我放在子主题目录中的任何同名文件优先于父主题目录中的文件。我以为这就是WP中设置家长/孩子主题的方式,但我遇到了一个麻烦。

根据WordPress codex on Child Themes, 上面写着:

Template Files
如果您想更改的不仅仅是样式表,您的子主题可以覆盖父主题中的任何文件:只需在子主题目录中包含一个同名文件,当您的站点加载时,它就会覆盖父主题目录中的等效文件。

在我的一个文件(header.php)中,有一个include如下所示:

include get_parent_theme_file_path("folder/file.php")
尽管我有一个名为但修改过的文件的副本。在我的子主题中,它仍然使用父主题中的版本。根据同一法典,他们建议专门针对子主题文件使用get\\u stylesheet\\u directory(),因此如下所示:

include (get_stylesheet_directory()."/folder/file.php");
我知道名为“get\\u parent\\u theme\\u file\\u path()”的函数的目的是忽略父/子关系,只获取父主题版本,因此不必将其替换为显式获取子主题(即get\\u stylesheet\\u目录)中文件的函数,is there a way I can have some sort of universal get_path() function that checks for child first, if it doesn\'t exist, get parent version?

顺便说一下,我读过this Q&A on "get_parent_theme_file_path vs. get_template_directory", 但他们的解决方案是使用parent\\u theme\\u文件过滤器,但这不是动态的,需要我为希望使用的每个子文件编写一个过滤器函数。

谢谢你的帮助。

2 个回复
最合适的回答,由SO网友:Milo 整理而成

这本质上是locate_template()

在TEMPLATEPATH(父)之前的STYLESHEETPATH(子)中搜索,并wp-includes/theme-compat 因此,从父主题继承的主题只能重载一个文件。

SO网友:Jacob Peattie

从4.7开始,有一个功能:get_theme_file_path()

在模板目录之前的样式表目录中进行搜索,以便从父主题继承的主题可以只覆盖一个文件。

因此,如果您这样做:

include get_theme_file_path( \'folder/file.php\' );
folder/file.php 将从子主题(如果存在)加载,否则从父主题加载。

这不适用于get_stylesheet_directory(), 因为实际文件路径未传递给get_stylesheet_directory(), 所以它无法知道要查找什么文件。

URL的等效函数是get_theme_file_uri(). 如果文件存在于子主题中,这将获取该文件的URL,否则将获取父主题中文件的URL。

每个函数都有一个仅搜索父主题的匹配版本:

get_parent_theme_file_path();
get_parent_theme_file_uri();
对于模板,应使用get_template_part(). 这允许您包含可以由子主题替换的PHP文件,并具有一些额外的功能,例如名称的可选后缀。

附言:法典有点过时了。除非特定的文章尚未移植,否则您应该使用的开发人员文档位于https://developer.wordpress.org/themes/.

结束

相关推荐

Child-theme breaks site

所以,我有一个子主题,里面除了所需的CSS文件之外什么都没有。一旦我激活了这个儿童主题,我的整个网站就关闭了。最后我有两个问题:激活一个只有CSS的子主题怎么能破坏我的网站</我怎样才能回到我原来的主题</这些是网站给我的错误:Warning: require_once(/wp-content/themes/interio_child/admin/options-framework.php) [function.require-once]: 无法打开流:中没有此类文件或目录/wp-c