问题描述

我正在编写一个插件来管理有关 open-source 项目的数据。我开发了一个对象模型,并已经成功地创建了所有自定义的帖子类型和分类,以及使用 Members 插件实现了正确的功能/角色。适当的用户可以创建,修改和删除自己的帖子,管理员可以批准他们,以及修改和删除任何人的帖子。

我的问题是,我想定义一个项目的模板和项目列表 (单个和存档,我相信 – 我从来没有在这个级别使用 Wordpress),但我不希望循环依赖在目前的主题中为单个项目或项目列表呈现页面。如果我使用 TwentyTen 主题,我希望它使用我的插件的模板为这些自定义的帖子类型。如果我使用 TwentyEleven 主题,我仍然希望它使用我的插件的模板为这些自定义的帖子类型。

我想要这样服从 「它只是工作」 的范例,但现在用户不能只是将文件夹放在插件目录中 – 他们必须在每次切换主题时将适当的文件添加到其主题文件夹中。我已经签出了模板层次结构,并且文件名正确无误,但如果它们位于 plugin 文件夹或 plugin /templates 文件夹中,则 WordPress 不会使用它们。

谢谢!

最佳解决方案

您需要使用 template_include 过滤器,它是所有模板包含体的通用过滤器。

add_filter( 'template_include', 'my_plugin_templates' );
function my_plugin_templates( $template ) {
    $post_types = array( 'project' );

    if ( is_post_type_archive( $post_types ) && ! file_exists( get_stylesheet_directory() . '/archive-project.php' ) )
        $template = 'path/to/list/template/in/plugin/folder.php';
    if ( is_singular( $post_types ) && ! file_exists( get_stylesheet_directory() . '/single-project.php' ) )
        $template = 'path/to/singular/template/in/plugin/folder.php';

    return $template;
}

我还没有完全测试帖子类型归档位,您可能需要使用 is_tax( $taxonomies )包含一个检查,使其能够处理相关的自定义分类归档。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。