覆盖核心函数LOCATE_TEMPLATE

时间:2020-02-12 作者:FamousWolluf

我想重写Wordpress核心函数locate\\u template()
我希望该函数还可以在附加插件目录中搜索模板文件
我在函数中没有看到任何过滤器,也没有检查函数是否存在<也许有人有更好的解决方案。

我试图创建的是一个作为插件的孙主题,它适用于常规主题文件,但不适用于重写get\\u template\\u part()和locate\\u template()函数。

为了将来的清除,我的网站将在子主题文件夹中查找文件,如果不在那里,它将查看插件文件夹,如果不在那里,它将查看父主题,然后查看原始Wordpress文件<因此,我构建了一个额外的层。

2 个回复
SO网友:Jacob Peattie

locate_template() 不可插拔,并且没有筛选器。过滤器是十年前提出的,但尚未实施。这方面的问题是here, 因此,您可以阅读该讨论,了解为什么它可能尚未发生。

这个template hierarchy filters 可能会有帮助。它们将允许您过滤顶级模板的模板层次结构,如page.php, date.php, 或category.php 类似地template_include 过滤器将允许您替换用于呈现任何给定页面的整个模板。

但实际上,WordPress并不是为支持模板的三级继承而设计的。解决问题的“正确”方法是将子主题复制到新主题,并对其进行更改。

SO网友:Christian Lescuyer

正如“Jacob Peattie”所解释的,直到今天,你还不能推翻locate_template().

根据需要,您可以使用template_include 滤器

例如,如果您的插件定义了自定义帖子类型my cpt,则可以添加此过滤器:

add_filter( \'template_include\', function( $template ) {
    if ( is_singular( \'my-cpt\' ) ) {
        return plugin_dir_path() . \'templates/my-cpt.php\';
    }

    return $template;
} );

相关推荐

Swap themes locally

我有一个问题,我的“添加新插件”按钮不起作用,它也不会出现在普通菜单上。我在线搜索,建议的解决方案是交换主题,以检查主题是否冲突或禁用了一些wp核心。我有这个网站已经在生产中,我想改变它本地到另一个主题只是为了测试。我该怎么做?我尽量避免发布登台环境,因为它非常耗时,我只需要调试这一个问题。提前谢谢。