覆盖插件中的主题文件

时间:2017-02-26 作者:Usce

我正在尝试构建一个插件,它将替换主题中的一个文件。它将是特定主题的插件,其中包含一个放置在includes文件夹中的文件,路径为:

wp内容/主题/包括/示例文件。php

此示例文件。php也通过以下方式加载到页眉和页脚中include

我想制作一个可以覆盖示例文件的插件。php,以便主题包含我插件中的文件,而不是主题中的includes文件夹。

这怎么可能,最好的方法是什么?

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

WordPress方式(推荐):

在插件中,使用WordPresstheme_file_path 过滤钩子以更改插件中的文件。在插件中使用以下代码:

add_filter( \'theme_file_path\', \'wpse_258026_modify_theme_include_file\', 20, 2 );
function wpse_258026_modify_theme_include_file( $path, $file = \'\' ) {
    if( \'includes/example-file.php\' === $file ) {
        // change path here as required
        return plugin_dir_path( __FILE__ ) . \'includes/example-file.php\';
    }
    return $path;
}
然后,您可以使用get_theme_file_path 函数,如下所示:

include get_theme_file_path( \'includes/example-file.php\' );
在这里,如果文件在插件的过滤器挂钩中匹配,那么将包括文件的插件版本,否则将包括主题版本。

同样,通过这种方式,即使插件被禁用,主题也将使用其自己的文件版本,而无需任何修改。

从插件控制页面模板:

如果您正在寻找从插件控制页面模板,那么您可以check out this answer 看看怎么做。

PHP方式:

如果您包括wp-content/theme/<your-theme>/includes/example-file.php 文件使用简单include 使用呼叫relative path 在页眉、页脚模板中,如下所示:

include \'includes/example-file.php\';
然后也可以用插件版本的includes/example-file.php 使用PHP的文件set_include_path() 作用

一般来说,为了包含具有相对路径的文件,PHP会在当前目录中查找该文件。但是,您可以对其进行操作,以便PHP首先在另一个路径中查找它。在这种情况下,请在插件的主PHP文件中使用以下PHP代码,将插件的目录包含到PHP的默认包含路径中:

set_include_path(  plugin_dir_path( __FILE__ ) . PATH_SEPARATOR . get_include_path() );
之后,任何include 相对路径位于header.php, footer.php PHP将首先在插件目录中查找文件。

然而,这种方法will not work 如果在页眉、页脚等中包含使用绝对路径的文件。

SO网友:Sonali

试试这个。如果您使用的是页面模板,则此操作有效。

add_filter("page_template", "plugin_function_name");
function plugin_function_name($page_template)
{
   $id = substr($page_template, strrpos($page_template, \'/\') + 1);
   if ($id == \'includes/example-file.php\') {
    $page_template = plugin_dir_path(__FILE__) . \'includes/example-file.php\';
   }
   return $page_template;
}

相关推荐

Custom term templates

所以,我在网上做了一些研究,但没有找到可靠的答案,所以我来了。我需要为特定类别创建自定义woocommerce类别页面。例如,我有一个类别叫做“Awesome”。而不是使用由短代码生成的常规类别页面[product_category category=\"something\"], 我想为自定义特定类别页面Awesome.我发现我需要编辑taxonomy-product_cat.php 但我不知道如何将其链接到名为awesome.换句话说,我正在考虑制作php文件的自定义副本,然后将其添加为主题templ