web-dev-qa-db-fra.com

Fichier de thème pour toutes les pages qui sont un enfant d'une page spécifique

Est-il possible, dans la hiérarchie de nommage des fichiers de thème en cours, de définir un modèle pour toutes les pages qui sont les enfants d'une page spécifique? Par exemple, dans cette navigation:

À propos de nous

  • Contact
  • Qui nous sommes
  • Déclaration de message

Est-il possible de créer un fichier de thème portant le nom suivant:

page-about-us-all.php

Cela s'appliquerait automatiquement à toutes les pages qui sont des enfants de À propos de nous?

METTRE À JOUR

Je suis allé avec une version modifiée de ce que Bainternet avait suggéré. Voici la fonction descendante avec laquelle je me suis retrouvé:

function is_descendant($ancestor, $tofind = 0) {
    global $post;
    if ($tofind == 0) $tofind = $post->ID;
    $arrpostids = get_post_ancestors($tofind);
    $arrpostslugs = array();
    foreach($arrpostids as $postid) {
        $temppost = get_post($postid);
        array_Push($arrpostslugs, $temppost->post_name);
    }
    return (in_array($ancestor, $arrpostids) || in_array($ancestor, $arrpostslugs));
}
// Example use:
is_descendant('about-us');
is_descendant(123);
is_descendant('about-us', 134);

Cela me permet de vérifier qu’il s’agit d’un descendant en utilisant l’identifiant du parent ou du slug. Je craignais que l’utilisation exclusive de l’ID puisse poser problème si une page parent avait été accidentellement supprimée, il n’y aurait pas de moyen efficace de le faire fonctionner à nouveau sans avoir à modifier les fichiers de thème. Avec le slug au moins, il est possible de sauter et de créer une nouvelle page avec le même slug et la même hiérarchie.

4
hereswhatidid

J'ai une petite fonction conditionnelle faite sur mesure qui ferait le travail pour vous.

La fonction:

function is_child_page($page = NULL){
    global $post;
    if ($page == NULL){
        $p = get_post($post->ID);
        if ($p->post_parent  > 0 ){
            return true;
        }else{
            return false;
        }
    }
    $args = array( 'child_of' => (int)$page);
    $pages = get_pages($args); 
    foreach ($pages as $p){
        if ($p->ID == $post->ID){
            return true;
            break;
        }
    }
    return false;
}

Utilisation:

if (is_child_page()){
    //this page has a parent page
}

if (is_child_page(23)){
    //this page is a child page of the page with the ID of 23
}

Maintenant, vous demandez comment cela peut vous aider?

Après avoir enregistré cette fonction dans le fichier functions.php de votre thème, éditez le fichier page.php de votre thème et ajoutez tout en haut quelque chose comme ceci:

if (is_child_page(12)){
    include (TEMPLATEPATH . '/page-about-us-all.php');
    exit();
}

Et vous avez terminé! Remarque: ce code suppose que votre identifiant de page à propos est: 12 et que votre fichier de thème est nommé: page-about-us-all.php.

3
Bainternet

Cela peut être beaucoup plus simple et ne dépend pas de fonctions distinctes.

En supposant que nous voulions vérifier si la page en cours est un enfant de page 134 , il suffirait de déposer les éléments suivants en haut de votre page.php:

<?php
if (134 == $post->post_parent) {
    include (TEMPLATEPATH . '/page-mysubpagetemplate.php'); // Name this for your child page template name
    exit();
} else {
    // Do something else
    // You might want to stick your regular page.php code in here, or alternatively, you could call another template
}; ?>
2
Jon Lay

Cela n'est pas possible, par défaut, dans le système de templates WordPress. La hiérarchie template ne détecte pas la relation de page parent-enfant. Cependant, j'ai trouvé ce billet de blog , en expliquant une méthode pour automatiser le processus. Je n'ai pas essayé de le mettre en œuvre, je ne garantis donc pas son efficacité, mais il vaut au moins la peine d'être lu.

(Remarque: cette publication bloque sa fonction dans 'save_post', ce qui signifie que le changement de modèle de page ne se produit que lorsque la publication est enregistrée. Ceci devrait généralement fonctionne, car la modification de la page parent nécessite une action de sauvegarde. Toutefois, , vous aurez peut-être besoin d'un hook différent si vous devez effectuer des mises à jour rétroactives du modèle de page.)

1
Chip Bennett