0

您如何根据页面的整个 url 而不仅仅是它们的 slug 来加载页面模板?

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

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

所以 url/hello/world会寻找模板page-hello_world.php

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

API中没有template_redirect文档。

有任何想法吗?

4

2 回答 2

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');
于 2012-05-08T01:46:23.157 回答
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。

希望这可以帮助。

于 2012-05-08T00:54:32.150 回答