问题描述

我正在编写一个自定义帖子类型的插件。其中一部分我通过短信输出到模板。但是其他部分需要一个自定义的帖子模板,我想出了如何使用 CPT 的模板层次结构。但是自定义模板是在主题中,我认为插件应该是 self-contained,至少要开始。

那么这里最好的做法是什么?我们如何在 CPT 插件中包含模板文件?你能指点一下我们如何做好这个例子吗?

谢谢你的帮助。

最佳解决方案

So what’s the best practice here?

我会说,让主题处理它并提供一个默认的插件的组合。

您可以使用 single_template 过滤器来切换模板。在你的回调中,看看主题是否提供了 post 类型的模板,如果没有做,什么都不做。

<?php
add_filter('single_template', 'wpse96660_single_template');
function wpse96660_single_template($template)
{
    if ('your_post_type' == get_post_type(get_queried_object_id()) && !$template) {
        // if you're here, you're on a singlar page for your costum post
        // type and WP did NOT locate a template, use your own.
        $template = dirname(__FILE__) . '/path/to/fallback/template.php';
    }
    return $template;
}

我喜欢这种方法最好。结合它提供了一套完整的”template tags”(例如 the_contentthe_title),支持任何与您的帖子类型相关的自定义数据,并为终端用户提供了大量定制功能以及一些声音默认值。 Bbpress 做得很好:包含用户模板,如果它找到并提供了大量的模板标签。

或者,您可以使用 the_content 过滤器的回调,只需更改内容中的内容。

<?php
add_filter('the_content', 'wpse96660_the_content');

function wpse96660_the_content($content)
{
    if (is_singular('your_post_type') && in_the_loop()) {
        // change stuff
        $content .= '<p>here we are on my custom post type</p>';
    }

    return $content;
}

次佳解决方案

如果请求是针对您的帖子类型,您可以挂接到 template_include 并返回您的插件文件

add_filter( 'template_include', 'insert_my_template' );

function insert_my_template( $template )
{
    if ( 'my_post_type' === get_post_type() )
        return dirname( __FILE__ ) . '/template.php';

    return $template;
}

但这样会大大改变外观。仍然没有干净的解决方案。

参考文献

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