Is there a default template file for child pages / subpages?

This seems like a very simple question. I’m looking for something like sub-page.php or page-child.php where I can do some different things on the child pages of my theme.

They are different enough in design and content that I’m having to use a lot of php or the CSS .page-child class to do all the dirty work. I’m looking for a simpler method.

One caveat – I would like this to happen automatically so I don’t have to tell the client “make sure to always select the ‘subpage’ template when you create a subpage!” which is precarious..

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

There is no specifica template for child pages, but you can do this pretty easily with the get_template_part() function.

First create a file called “content-child.php”.

Second create a file called “content.php”.

Next, inside of page.php, place this:

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

Anything that you want displayed on a child page will be placed inside of content-child.php. Anything you want displayed on non-child pages will be placed in content.php.

Method 2

It’s actually very easy, add follow code to your 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;
    }
);

Then you can prepare templates with following patterns:

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

Method 3

My modification of OzzyCzech’s solution above. This function looks in the theme’s root directory for files who’s name contains the parent’s slug or parent’s ID.

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


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x