自定义帖子类型插件:我在哪里放置模板?


11

我正在编写一个自定义帖子类型插件。我要通过短代码将其部分输出到模板。但是其他部分需要自定义帖子模板,并且我了解了如何将模板层次结构用于CPT。但是自定义模板是主题,而且我认为插件应该是自包含的,至少从一开始就是如此。

那么,这里的最佳实践是什么?我们如何在CPT插件中包含模板文件?您能指出我如何做到的特别好的例子吗?

谢谢你的帮助。



1
不确定是否重复,但这是一个主观的问题。对我来说,最佳实践是让主题处理它。对其他人来说,最佳实践是使该插件完全独立。
chrisguitarguy

@JohannesPille我在询问之前做了搜索。但感谢您的链接。我会研究它。
NotoriousWebmaster

1
@chrisguitarguy同意。我让主题处理问题是,如果我们切换主题,我们必须进行一些自定义以容纳插件。否则,我们将失去CPT带给聚会的东西。
NotoriousWebmaster

Answers:


8

那么,这里的最佳实践是什么?

我会说让主题处理它并为您的插件提供默认值的组合。

您可以使用single_template过滤器切换出模板。在回调中,查看主题是否提供了帖子类型的模板,如果有,则什么也不做。

<?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;
}

我最喜欢这种方法。与提供有完善的“模板标签”的结合起来(例如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;
}

我同意@toscho的观点,即没有干净的解决方案。但是我喜欢提供一组类别标签的概念。我怀疑最终我的插件中将有一个主题文件夹,其中包含一个示例CPT模板,并建议用户对其进行适应。我也喜欢the_content过滤器,因为这会将我的内容插入用户的布局中。我可以同时实现这两种方法,并允许用户使用选项切换选择哪种方式。
NotoriousWebmaster

3

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

但这将彻底改变外观。仍然没有干净的解决方案。


是的,您是对的,它将改变外观,包括布局,小部件等。我的口味太激进了。但是,谢谢。
NotoriousWebmaster
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.