WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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..

share|improve this question
up vote 8 down vote accepted

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 {

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.

share|improve this answer
I was able to make this code work. As it turned out - I didn't need to separate it quite as much as I thought, so I just adjusted your code and used it in page.php in a couple specific instances. The CSS selector 'page-child' helped round out the edges. Thanks! – timshutes Jun 15 '12 at 5:29
Nice! Great solution. How to set a different template for Parent > Child > Child? Thanks! – Brightweb Jul 25 '12 at 21:23

It's actually very easy, add follow code to your functions.php

    function ($template) {
        global $post;

        if ($post->post_parent) {

            // get top level parent page
            $parent = get_post(

            // 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
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.