基于父模板加载子模板

时间:2014-01-23 作者:hyperdrive

我有需要根据父模板自动应用的子页面模板。

我想知道Wordpress是否会处理这个问题。

这就是我想到的解决方案。(在page.php中)

<?php 
//Check parent template 
if ($post->post_parent != $post->ID )
{
    //Get parent template filename
    $parentTemplate = get_post_meta($post->post_parent,\'_wp_page_template\',true);
}

switch ($parentTemplate) {
    case \'about.php\':
        get_template_part( \'child_templates/content\', \'about-child\' );
        break;
    default:
        get_template_part( \'content\', \'page\' );
}
?>

Edit

函数将父模板应用于子页面。

function switch_page_template() {
    global $post;
    // Checks if current post type is a page, rather than a post
    if (is_page()){
        $ancestors = $post->ancestors;

        if ($ancestors) {
            $parent_page_template = get_post_meta(end($ancestors),\'_wp_page_template\',true);
            $template = TEMPLATEPATH . "/{$parent_page_template}";
            if (file_exists($template)) {
            load_template($template);
            exit;
        }
        } else {
            return true;
        }
    }
}

add_action(\'template_redirect\',\'switch_page_template\');
检查页面是父页面还是子页面

function is_subpage() {
    global $post;                              // load details about this page

    if ( is_page() && $post->post_parent ) {   // test to see if the page has a parent
        return true;             // return the ID of the parent post

    } else {                                   // there is no parent so ...
        return false;                          // ... the answer to the question is false
    }
}
模板现在如下所示

<?php
/*
Template Name: About Us
*/
?>

<?php get_header(); ?>

<?php if (is_subpage()): ?>
    <?php get_template_part( \'templates/content\', \'about-child\' ); ?>
    <?php else: ?>
    <?php get_template_part( \'templates/content\', \'about-parent\' ); ?>
<?php endif ?>

<?php get_footer(); ?>

2 个回复
SO网友:gmazzap

您可以保持模板干净并将其添加到functions.php 使用\'template_include\' 用于检查父页面模板并为子页面返回相同模板的操作挂钩。

add_action(\'template_include\', \'auto_child_template\');

function auto_child_template( $template = \'\' ) {
  if ( ! is_page() ) {
    return $template;
  } else {
    $page = get_queried_object();
    $ancestors = get_post_ancestors( $post );
    $templates = array();
    // add ancestors page templates to $templates array
    foreach ( $ancestors as $ancestor ) {
      $templates[] = get_page_template_slug( $ancestor );
    }
    // remove empty values
    $templates = array_filter($templates);
    // if no ancestors has a template return current one
    if ( empty($templates) ) return $template;
    // fallback
    $templates[] = \'page.php\';
    return locate_template( $templates, FALSE );
  }
}

SO网友:MikeNGarrett

看起来不错。听起来像是Drupal擅长的东西。

WordPress为get_post_meta() 您正在使用:get_page_template_slug()

另一种方法是在函数文件中使用一个函数,如果父模板具有特定模板,则在保存时更改子模板。这样,如果您想要移动该页面,它将携带相同的页面模板,而不需要在其下有一个具有特定模板的父级。

EDIT

保存后更改内容需要您add an actionsave_post

function my_change_page_template( $post_id ) {

    // If this is just a revision, don\'t do anything
    if ( wp_is_post_revision( $post_id ) )
        return;
    if ($post->post_parent != $post->ID ) {
        $parentTemplate = get_post_meta($post->post_parent,\'_wp_page_template\',true);
    }
    $template = \'\';
    switch ($parentTemplate) {
        case \'about.php\':
            $template = \'about-child.php\';
        break;
    }
    if(!empty($template)) {
        update_post_meta( $post_id, \'_wp_page_template\', $template );
    }
}
add_action( \'save_post\', \'my_change_page_template\' );
我还没有测试过这个,但它应该非常接近你想要的。这样,您将测试父模板,并根据返回的内容设置子模板。这将在保存帖子时触发,但不会在修订时触发。

如果这不合理,请告诉我。

结束

相关推荐

Custom post types templates

我已经注册了一个名为“Services”的自定义帖子类型,但当我给这篇帖子提供模板“single Services.php”时,它不接受这个,而是选择了“homepage.php”模板,你能告诉我这个问题吗?它也没有使用“archive services.php”模板,而是使用blog模板(index.php)使现代化代码如下:add_action(\'init\', \'services_register\'); function services_register() { $