基于页面ID以编程方式设置页面模板

时间:2015-06-11 作者:Nate

如何根据ID设置页面模板?我的站点中安装了Redux框架,其中一个选项是设置注册页面。在这个页面上,我想使用一个特定的模板,但在其他页面上应该使用默认模板。

我已经用了一半了

add_filter( \'page_template\', \'my_function\' );
function my_function(){
  global $my_options;
  $page_id = get_queried_object_id();
  if ( $my_options[\'my-reg-page\'] == $page_id ) {
    return get_template_directory() . \'/reg-page.php\'; 
  }
}
在该页面中(ID存储在$my_options[\'my-reg-page\']) 已设置页面,但其余页面使用索引。php作为模板,而不是其相应的页面(single.php、page.php等)。如果我在过滤器外部设置条件,它将不会显示我要查找的模板。我希望避免保存元数据,因为我宁愿将代码粘贴到我的函数中。要在多个主题中使用的php文件,如果需要,将使用不同的页面作为相关页面。我知道最简单的方法是直接在管理区域的页面上设置主题,但这会创建多个选项。我希望尽可能地减少它们。

有什么建议吗?有可能吗?

1 个回复
最合适的回答,由SO网友:EHerman 整理而成

我需要为我正在开发的一个插件做一些非常类似的事情。我在插件激活期间注册了两个独立的cpt,每个cpt都应该使用我与插件代码库捆绑的自定义单个模板。

您应该能够使用page_template 滤器

下面是我使用single\\u template过滤器的函数,可以将其调整为使用page\\u template。您只需获取全局$post变量,以便检查post类型或post ID,然后根据该数据提供模板。

add_filter( \'page_template\', \'custom_page_template\' );
public function custom_page_template( $page_template ) {
        global $post;

        switch ( $post->ID) {

            default :
            case \'2\' : // page ID 2
                if( file_exists( get_stylesheet_directory() . \'/single-event-template.php\' ) ) {
                    $page_template = get_stylesheet_directory() . \'/single-event-template.php\'; 
                return $single_template;
            break;

            case \'14\' : // page ID 14
                $page_template= plugin_dir_path( dirname( __FILE__ ) ) . \'public/partials/single-event-location-template.php\';
                return $page_template;
            break;

        } // end switch

}
我还没有使用页面模板对此进行测试,但从codex页面来看,这似乎应该可以工作。

根据您的示例,您可能希望尝试以下类似的操作:

add_filter( \'page_template\', \'my_function\' );
function my_function( $page_template ){
  global $post;
  $page_id = $post->ID;
  if ( $my_options[\'my-reg-page\'] == $page_id ) {
    $page_template = get_template_directory() . \'/reg-page.php\'; 
  } else {
   $page_template = get_template_directory() . \'/some-other-page-template.php\'; 
  } 
  return $page_template;
}

结束