在转到 parent 主题之前,如何首先使用 include 检查 child 主题文件?

How do I check for child theme files first using include, before going to parent theme?

我正在创建一个基于现有 parent 主题的 WordPress child 主题,我想将任何 same-named 文件放入我的 child 主题目录优先于 parent 主题目录中的文件。我以为这就是 parent/child 在 WP 中设置主题的方式,但我遇到了一个问题。

根据WordPress codex on Child Themes,它说:

Template Files
If you want to change more than just the stylesheet, your child theme can override any file in the parent theme: simply include a file of the same name in the child theme directory, and it will override the equivalent file in the parent theme directory when your site loads.

在我的一个文件 (header.php) 中,有一个看起来像这样的包含:

include get_parent_theme_file_path("folder/file.php")

即使我的 child 主题中有那个 file.php 的 duplicate-named-but-modified 版本,它仍然使用我的 parent 主题中的版本。根据相同的法典,他们针对 child 主题文件的具体建议是使用 get_stylesheet_directory(),因此它看起来像这样:

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

我知道一个名为 "get_parent_theme_file_path()" 的函数的目的是忽略 parent/child 关系并只获取 parent 主题版本,因此无需将其替换为显式的函数在我的 child 主题中获取一个文件(即 get_stylesheet_directory), 有没有一种方法可以让我拥有某种通用的 get_path() 函数来检查 child首先,如果不存在,获取parent版本?

顺便说一下,我读了 this Q&A on "get_parent_theme_file_path vs. get_template_directory",但他们的解决方案是使用 parent_theme_file 过滤器,但这不是动态的,并且需要我为每个 child 我想要它使用的文件。

感谢您的帮助。

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

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 );

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

Searches in the STYLESHEETPATH before TEMPLATEPATH and wp-includes/theme-compat so that themes which inherit from a parent theme can just overload one file.