1

我正在基于现有父主题创建一个 WordPress 子主题,并且我希望我放在子主题目录中的任何同名文件优先于父主题目录中的文件。我认为这就是在 WP 中设置父/子主题的方式,但我遇到了一个问题。

根据儿童主题的 WordPress 法典,它说:

模板文件
如果你想改变的不仅仅是样式表,你的子主题可以覆盖父主题中的任何文件:只需在子主题目录中包含一个同名文件,它将覆盖父主题中的等效文件网站加载时的目录。

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

include get_parent_theme_file_path("folder/file.php")

即使我的子主题中有该 file.php 的重复命名但修改的版本,它仍然使用我的父主题中的版本。根据相同的 codex,他们针对子主题文件的建议是使用 get_stylesheet_directory(),所以它看起来像这样:

include (get_stylesheet_directory()."/folder/file.php");

我了解名为“get_parent_theme_file_path()”的函数的目的是忽略父/子关系并仅获取父主题版本,因此无需用在我的子主题中显式获取文件的函数替换它(即 get_stylesheet_directory ),有没有一种方法可以让我拥有某种通用的 get_path() 函数来首先检查子级,如果它不存在,则获取父版本?

顺便说一句,我读过在 "get_parent_theme_file_path vs. get_template_directory" 上阅读了这个问答,但他们的解决方案是使用 parent_theme_file 过滤器,但这不是动态的,并且需要我为我希望它使用的每个子文件编写一个过滤器函数.

谢谢你的帮助。

4

2 回答 2

3

你有没有尝试过这样的事情:

add_filter( 'parent_theme_file_path', function( $path, $file ) {
    return get_stylesheet_directory() . '/' . $file;
}, 10, 2 );

这应该覆盖父主题路径,而无需为每个文件编写函数。

如果您想确保get_parent_theme_file_path()在您的子主题中未覆盖的父主题文件仍然有效,您可以做一个简单的检查:

add_filter( 'parent_theme_file_path', function( $path, $file ) {
    if ( !file_exists( get_stylesheet_directory() . '/' . $file ) ) {
        return $path;
    }
    return get_stylesheet_directory() . '/' . $file;
}, 10, 2 );
于 2018-09-15T00:02:56.783 回答
1

wordpress.stackexchange 上有人指出了 的用法locate_template,它检索存在的最高优先级模板文件的名称。

在 TEMPLATEPATH 和 wp-includes/theme-compat 之前的 STYLESHEETPATH 中搜索,以便从父主题继承的主题只能重载一个文件。

于 2018-09-15T13:26:32.347 回答