如何根据页面的整个网址加载页面模板,而不仅仅是它们的slug?

时间:2012-05-08 00:16:50

标签: wordpress templates

如何根据页面的整个网址加载页面模板,而不仅仅是它们的slug?

网页模板加载page-{slug}.phppage-{id}.php

我真的希望它加载page-{parent-slug}_{slug}.php

因此,网址/hello/world会查找模板page-hello_world.php

这应该是递归的,因此页面的时间越长,模板文件名就越长。

API中没有 template_redirect 文档。

有什么想法吗?

2 个答案:

答案 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。

希望这有帮助。