web-dev-qa-db-fra.com

Existe-t-il un fichier de modèle par défaut pour les pages/sous-pages enfants?

Cela semble être une question très simple. Je cherche quelque chose comme sub-page.php ou page-child.php où je peux faire différentes choses sur les pages enfants de mon thème.

Ils sont suffisamment différents dans la conception et le contenu pour que je doive utiliser beaucoup de php ou la classe CSS .page-child pour effectuer tout le sale boulot. Je cherche une méthode plus simple.

Une mise en garde: j'aimerais que cela se produise automatiquement afin de ne pas avoir à dire au client "assurez-vous de toujours sélectionner le modèle de" sous-page "lorsque vous créez une sous-page!" qui est précaire ..

4
timshutes

Il n’existe pas de modèle spécifique pour les pages enfants, mais vous pouvez le faire assez facilement avec la fonction get_template_part () .

Commencez par créer un fichier appelé "content-child.php".

Deuxièmement, créez un fichier appelé "content.php".

Ensuite, à l'intérieur de page.php, placez ceci:

if( $post->post_parent !== 0 ) {
    get_template_part('content', 'child');
} else {
    get_template_part('content');
}

Tout ce que vous voulez afficher sur une page enfant sera placé dans content-child.php. Tout ce que vous voulez afficher sur des pages non enfants sera placé dans content.php.

13
Pippin

C'est en fait très facile, ajoutez un code de suivi à votre functions.php

add_filter(
    'page_template',
    function ($template) {
        global $post;

        if ($post->post_parent) {

            // get top level parent page
            $parent = get_post(
               reset(array_reverse(get_post_ancestors($post->ID)))
            );

            // or ...
            // when you need closest parent post instead
            // $parent = get_post($post->post_parent);

            $child_template = locate_template(
                [
                    $parent->post_name . '/page-' . $post->post_name . '.php',
                    $parent->post_name . '/page-' . $post->ID . '.php',
                    $parent->post_name . '/page.php',
                ]
            );

            if ($child_template) return $child_template;
        }
        return $template;
    }
);

Ensuite, vous pouvez préparer des modèles avec les modèles suivants:

  • [parent-page-slug]/page.php
  • [parent-page-slug]/page-[child-page-slug].php
  • [parent-page-slug]/page-[child-post-id].php
9
OzzyCzech

Ma modification de la solution de OzzyCzech ci-dessus. Cette fonction recherche dans le répertoire racine du thème les fichiers dont le nom contient le slug ou l'ID du parent.

  • /theme_root/child-PARENT_SLUG.php
  • /theme_root/child-PARENT_ID.php
function child_templates($template) {
    global $post;

    if ($post->post_parent) {
        // get top level parent page
        $parent = get_post(
            reset(array_reverse(get_post_ancestors($post->ID)))
        );

        // find the child template based on parent's slug or ID
        $child_template = locate_template(
            [
                'child-' . $parent->post_name . '.php',
                'child-' . $parent->ID . '.php',
                'child.php',
            ]
        );

        if ($child_template) return $child_template;
    }

    return $template;
}
add_filter( 'page_template', 'child_templates' );
0
comtyler