如何根据页面的整个网址加载页面模板,而不仅仅是它们的slug?
网页模板加载page-{slug}.php
或page-{id}.php
。
我真的希望它加载page-{parent-slug}_{slug}.php
。
因此,网址/hello/world
会查找模板page-hello_world.php
。
这应该是递归的,因此页面的时间越长,模板文件名就越长。
API中没有 template_redirect 文档。
有什么想法吗?
答案 0 :(得分:4)
这就是我想出的。它工作得很好,并将其添加到主题文件夹中的functions.php文件中:
function hierarchical_template() {
global $post;
$permalink_array =
array_filter(explode('/',str_replace(get_site_url(),'',get_permalink($post->ID))));
$template_redirect = false;
while ( count( $permalink_array ) ) {
$template = 'page-' . implode( '_', $permalink_array ) . '.php';
if(file_exists(TEMPLATEPATH . '/' . $template)){
include (TEMPLATEPATH . '/' . $template);
exit;
}
array_shift($permalink_array);
}
}
add_action('template_redirect', 'hierarchical_template');
答案 1 :(得分:0)
在page.php文件中,您可以执行以下操作:
<?php
get_header();
$ancestors = get_ancestors(get_the_ID(), 'page');
$current_page = get_page(get_the_ID());
$top_page = $ancestors ? get_page(end($ancestors)) : false;
if($top_page && $file = locate_template('page-'.$top_page->post_name.'_'.$current_page->post_name.'.php'))
{
include $file;
}
else if($file = locate_template('page-'.$current_page->post_name.'.php'))
{
include $file;
}
else
{
//DEFAULT HTML TO DISPLAY
}
?>
这是未经测试的,但您的想法是让您的page.php搜索并包含匹配的'page- {parent-slug} _ {slug} .php'文件。如果找不到匹配的文件,那么它将搜索'page- {slug} .php'。如果那不存在,那么它将回退到else语句中的默认HTML。
希望这有帮助。