J'ai des modèles de page enfant qui doivent être appliqués automatiquement en fonction du modèle parent.
Je me demande s’il existe une façon pour Wordpress de gérer cela.
C’est la solution que j’ai trouvée. (dans 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' );
}
?>
Modifier
Fonction permettant d'appliquer un modèle parent aux pages enfants.
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');
Vérifier si la page est un parent ou un enfant
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
}
}
Le modèle ressemble à ceci maintenant
<?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(); ?>
Au lieu de placer quelque chose sur le modèle, vous pouvez garder les modèles propres et ajouter à functions.php
une fonction qui utilise le crochet d'action 'template_include'
pour vérifier le modèle de page parent et renvoyer le même modèle pour les pages enfants.
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 );
}
}
Cela a l'air bien. On dirait que quelque chose que Drupal ferait bien.
WordPress a une fonction wrapper pour la get_post_meta()
que vous utilisez: get_page_template_slug()
Une autre façon de procéder est d’avoir une fonction dans le fichier de fonctions qui modifie le modèle enfant lors de l’enregistrement si le parent a un modèle particulier. Ainsi, si vous vouliez déplacer cette page, elle porterait le même modèle de page sans avoir à placer un parent sous un modèle particulier.
MODIFIER
Pour changer des choses après l'enregistrement, vous devez ajouter une 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' );
Je n'ai pas testé cela, mais cela devrait être assez proche de ce que vous voulez. De cette manière, vous allez tester le modèle parent et définir le modèle enfant en fonction de ce qui est renvoyé. Cela sera déclenché sur save post, mais pas sur les révisions.
Faites-moi savoir si cela n'a pas de sens.