插件和模板中的自定义分类

时间:2012-04-25 作者:brenjt

我有一个使用自定义帖子类型和分类法开发的插件。我的问题是。当转到分类法的自定义url时,如何将插件中的内容/主题数据加载到页面上?

编辑

我试图使用插件的模板文件,而不是我自定义taxomony的主题。

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

首先—plugins are for generating content, themes are for displaying it. 所以实际上,插件不应该这样做。但也有一些灰色区域,例如在与“事件”相关的插件中,最好显示日期、地点等,而WordPress主题通常不会显示这些内容。

我建议

使插件模板可以在主题/子主题中使用同名模板要更改正在使用的模板,可以使用template_include 滤器这是分类法模板的一个示例,但对于自定义帖子类型也可以使用类似的过程。

add_filter(\'template_include\', \'wpse50201_set_template\');
function wpse50201_set_template( $template ){

    //Add option for plugin to turn this off? If so just return $template

    //Check if the taxonomy is being viewed 
    //Suggested: check also if the current template is \'suitable\'

    if( is_tax(\'event-venue\') && !wpse50201_is_template($template))
        $template = plugin_dir_url(__FILE__ ).\'templates/taxonomy-event-venue.php\';

    return $template;
}
Note 它假设插件模板位于相对于当前控制器的模板子文件夹中。

逻辑这只是检查是否正在查看“活动地点”分类。如果不是,则将使用原始模板。

这个wpse50201_is_template 函数将检查WordPress是否已从调用的主题/子主题中选择模板taxonomy-event-venue.phptaxonomy-event-venue-{term-slug}.php. 如果是-将使用原始模板。

这允许插件的用户将它们复制到主题中并进行编辑,插件将对主题/子主题模板进行优先级排序。只有当它找不到它们时,才会返回插件模板。

function wpse50201_is_template( $template_path ){

    //Get template name
    $template = basename($template_path);

    //Check if template is taxonomy-event-venue.php
    //Check if template is taxonomy-event-venue-{term-slug}.php
    if( 1 == preg_match(\'/^taxonomy-event-venue((-(\\S*))?).php/\',$template) )
         return true;

    return false;
}
我在一个插件中使用了这种方法-您可以看到上面的一个工作示例here.

SO网友:MikeT

这就是我从主题文件夹中的子目录调用分类法模板的方式。请记住taxonomy.php 将需要保留在根主题目录中。

function call_taxonomy_template_from_directory(){
    global $post;
    $taxonomy_slug = get_query_var(\'taxonomy\');
    load_template(get_template_directory() . "/templates-taxonomy/taxonomy-$taxonomy_slug.php");
}
add_filter(\'taxonomy_template\', \'call_taxonomy_template_from_directory\');
例如,我的分类法被称为“新闻类别”。模板位于wp-content/themes/mytheme/templates-taxonomy/taxonomy-news-category.php

结束

相关推荐

Communicate between plugins

我已经创建了两个WordPress插件。如果两个插件都安装了,那么这两个插件之间就可以进行一些有益的合作。那么我的问题是:让他们合作的最佳方式是什么?如何检测某个插件是否已启用?如何传输信息?我想我可以用globals,但有更好的方法吗?