您如何根据页面的整个 url 而不仅仅是它们的 slug 来加载页面模板?
页面模板加载page-{slug}.php
或page-{id}.php
。
我真的希望它加载page-{parent-slug}_{slug}.php
。
所以 url/hello/world
会寻找模板page-hello_world.php
。
这应该是递归的,因此页面 url 越长,模板文件名就越长。
API中没有template_redirect文档。
有任何想法吗?
这就是我想出的。它工作得很好,并将其添加到主题文件夹中的 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');
在您的 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。
希望这可以帮助。