web-dev-qa-db-fra.com

Charger un modèle enfant basé sur le parent

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(); ?>
1
hyperdrive

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

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.

0
MikeNGarrett