创建主题可以覆盖的默认自定义发布模板

时间:2011-03-17 作者:saalon

我正在构建一个Wordpress插件,该插件添加了一个自定义的帖子类型,我想为其添加一个默认的显示模板。本质上,这是一个事件管理插件,自定义的帖子类型用于事件。有一些自定义元字段,以及一个子帖子类型(性能),因此如果没有默认模板来显示它们,使用它将非常不友好。但如果需要,我希望主题设计师能够为这些帖子类型创建自己的模板。

除非主题提供自己的模板,否则有没有办法使用插件提供的模板?这样做的最佳做法是什么?

Edit:

按照Peter Rowell的建议,我捕获了template\\u重定向操作,如果帖子类型是我的,并且当前主题中不存在该类型的模板,则默认为插件的模板:

class FestivityTemplates {

  public static function determineTemplate(){
    global $post;
    $standard_type = strpos($post->post_type, \'fest_\');

    if(is_single() && $standard_type !== false) {
      FestivityTemplates::loadSingleTemplate($post);
    }
  }

  private static function loadSingleTemplate($post) {
    $template_name = \'single-\'.$post->post_type.\'.php\';
    $template = locate_template(array($template_name), true);
    if(empty($template)) {
      include(WP_PLUGIN_DIR . \'/Festivity/lib/templates/\' . $template_name);
      exit();
    }
  }
}

add_action(\'template_redirect\', array(\'FestivityTemplates\', \'determineTemplate\'));

3 个回复
最合适的回答,由SO网友:Peter Rowell 整理而成

您可能需要查看WP为此使用的例程:locate_template(). 它在wp-includes/theme.php 并从该文件中的多个函数调用。这些函数用于wp-includes/template-loader.php 根据当前页面选择正确的模板类型,然后在主题层次结构中查找匹配项。

SO网友:Michal Mau

还有一个bunch of template related filters (向下滚动)您可以使用\'hijack\' the templates requests and apply your own logic 对他们来说。

下面是一个如何劫持调用的示例single-saalon_events.phparchive-saalon_events.php 并使用/your-plugin/templates/ 改为文件夹:

# Template for displaying a single event
add_filter( \'single_template\', \'saalon_events_single_template\') ) ;
function saalon_events_single_template($single_template) {
    global $post;           
    if ($post->post_type == \'saalon_events\')
        $single_template = dirname( __FILE__ ) . \'/templates/saalon_events_single.php\';
    return $single_template;
}

# Template for displaying the events archive
add_filter( \'archive_template\', \'saalon_events_archive_template\') ) ;
function saalon_events_archive_template($archive_template) {
    if ( is_post_type_archive(\'saalon_events\') ) // since 3.1
        $archive_template = dirname( __FILE__ ) . \'/templates/saalon_events_archive.php\';
    return $archive_template;
}
资源:
http://codex.wordpress.org/Plugin_API/Filter_Reference#Template_Filtershttp://codex.wordpress.org/Plugin_API/Filter_Reference/_single_template

哦,还有template_redirect 行动看起来也不错!http://codex.wordpress.org/Plugin_API/Action_Reference#Template_Actions

希望这有帮助!

SO网友:Bainternet

我不知道它是否是最佳实践,但当我遇到类似问题时,我使用了\\u内容挂钩来检查帖子类型,看看它是否是我的自定义类型,如果是,我返回了我想要的内容。例如:

add_filter(\'the_content\',\'events_conetnt_display\');
function events_conetnt_display($content){
    global $post;
    if (!$post_type == "events"){
        return $content;
    }else{
        remove_filter( \'the_content\', \'events_conetnt_display\' );
        $events_meta = get_post_custom($post->ID);
        $new_content = \'<div class="event_container">\';
        $new_content .= \'<div class="event_title">\'.get_the_title($post->ID).\'</div>\';
        $new_content .= \'<div class="event_description">\'.apply_filters(\'the_content\',get_the_content()).\'</div>\';
        $new_content .= \'<div class="event_start_date">\'.$events_meta[\'start_date\'].\'</div>\';
        $new_content .= \'<div class="event_end_date">\'.$events_meta[\'start_end\'].\'</div>\';
        //...
        //whatever
        //...
        add_filter(\'the_content\',\'events_conetnt_display\');
        return $new_content;
    }
}
我的插件有一个选项,让用户决定是使用什么内容挂钩,还是有一个自定义模板,比如:

if (get_option(\'use_content_template\')){
  add_filter(\'the_content\',\'events_conetnt_display\');
}

结束

相关推荐

How do you debug plugins?

我对插件创作还很陌生,调试也很困难。我用了很多echo,它又脏又丑。我确信有更好的方法可以做到这一点,也许是一个带有调试器的IDE,我可以在其中运行整个站点,包括插件?