我有需要根据父模板自动应用的子页面模板。
我想知道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(); ?>
SO网友:MikeNGarrett
看起来不错。听起来像是Drupal擅长的东西。
WordPress为get_post_meta()
您正在使用:get_page_template_slug()
另一种方法是在函数文件中使用一个函数,如果父模板具有特定模板,则在保存时更改子模板。这样,如果您想要移动该页面,它将携带相同的页面模板,而不需要在其下有一个具有特定模板的父级。
EDIT
保存后更改内容需要您
add an action 到
save_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\' );
我还没有测试过这个,但它应该非常接近你想要的。这样,您将测试父模板,并根据返回的内容设置子模板。这将在保存帖子时触发,但不会在修订时触发。
如果这不合理,请告诉我。