Laden Sie die untergeordnete Vorlage basierend auf dem übergeordneten Element

Ich habe untergeordnete Seitenvorlagen, die basierend auf der übergeordneten Vorlage automatisch angewendet werden müssen.

Ich frage mich, ob WordPress dies sowieso erledigt.

Das ist die Lösung, die ich mir ausgedacht habe. (in page.php)

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' ); } ?> 

Bearbeiten

function zum Anwenden der übergeordneten Vorlage auf untergeordnete Seiten.

 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'); 

Überprüfen Sie, ob die Seite übergeordnet oder untergeordnet ist

 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 } } 

Die Vorlage sieht jetzt so aus

         

Solutions Collecting From Web of "Laden Sie die untergeordnete Vorlage basierend auf dem übergeordneten Element"

Anstatt etwas auf die Vorlage zu setzen, können Sie Vorlagen sauber halten und zu functions.php eine function hinzufügen, die den 'template_include' Aktions-Hook verwendet, um die übergeordnete Seitenvorlage zu prüfen und dieselbe Vorlage für untergeordnete Seiten zurückzugeben.

 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 ); } } 

Das sieht ziemlich gut aus. Klingt nach etwas, bei dem Drupal gut sein könnte.

WordPress hat eine Wrapper-function für die get_post_meta() , die du verwendest: get_page_template_slug()

Sie können auch eine function in der functionsdatei verwenden, die die untergeordnete Vorlage beim Speichern ändert, wenn das übergeordnete Element über eine bestimmte Vorlage verfügt. Wenn Sie diese Seite einmal verschieben wollten, würde sie die gleiche Seitenvorlage enthalten, ohne dass ein Elternteil mit einer bestimmten Vorlage darunter sein müsste.

BEARBEITEN

save_post Sie die Änderungen nach dem Speichern save_post , müssen Sie eine Aktion zu 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' ); 

Ich habe das nicht getestet, aber es sollte ziemlich nah an dem sein, was Sie wollen. Auf diese Weise testen Sie die übergeordnete Vorlage und legen die untergeordnete Vorlage auf Grundlage der zurückgegebenen Vorlage fest. Dies wird beim Speichern von Post ausgetriggers, nicht jedoch bei Revisionen.

Lass es mich wissen, wenn das keinen Sinn ergibt.