Trusted WordPress tutorials, when you need them most.
Beginner’s Guide to WordPress
WPB Cup
25 Million+
Websites using our plugins
16+
Years of WordPress experience
3000+
WordPress tutorials
by experts

How to Display a List of Child Pages For a Parent Page in WordPress

Editorial Note: We earn a commission from partner links on WPBeginner. Commissions do not affect our editors' opinions or evaluations. Learn more about Editorial Process.

Recently one of our readers asked us how to display child pages of a WordPress page?

If you organize your WordPress website with parent and child pages, then you may want to display your child pages or sub pages on the main parent page. You may also want to show the main page on each sub page for easy browsing.

In this article, we will show you how to easily display a list of child pages for a parent page in WordPress.

Displaying a list of child pages for a parent page in WordPress

When You Need to Show a List of Child Pages?

WordPress comes with two default post types called posts and pages. Posts are blog content, and they are usually organized with categories and tags.

Pages are one-off or standalone content that are evergreen such as ‘About us’ page or ‘Contact us’ page.

In WordPress, pages can be hierarchical which means you can organize them with parent and child pages.

For instance, you may want to create a product page with child pages for Features, Pricing, and Support.

To create a child page, follow our guide on how to create a child page in WordPress.

After you have created your parent and child pages, you may want to list child pages on the main parent page.

Now an easy way to do this is by manually editing the parent page and add a list of links individually.

Manually add child page links

However, you’ll need to manually edit the parent page each time you add or delete a child page. Wouldn’t it be nicer if you could just create a child page and it would automatically appear as a link on the parent page?

That being said, let’s take a look at some other dynamic ways to quickly display a list of child pages on the parent page in WordPress. We’ll show you three methods, so you can pick the one that’s best for you:

Method 1. Display Child Pages on Parent Page using a Plugin

This method is easier and recommended for all users.

First, you need to install and activate the Page-list plugin. For more details, see our step by step guide on how to install a WordPress plugin.

Upon activation, you need to edit the parent page and simply add the following shortcode where you want to display the list of child pages.

[subpages]

You can now save your page and preview it in a new browser tab. You’ll notice that it displays a simple bulleted list of all the child pages.

Plain list of child page links

If you want, you can add some custom CSS to change the appearance of the list. Here is some sample CSS you can use as a starting point.

ul.page-list.subpages-page-list {
    list-style: none;
    list-style-type: none;
    background-color: #eee;
    border: 1px solid #CCC;
    padding: 20px;
}

After applying your custom CSS you can preview the parent page. This is how it looked on our test WordPress website.

Child pages list with CSS

The plugin provides a bunch of shortcode parameters that allow you to set depth, exclude pages, number of items, and more. For details, please see the plugin’s page for detailed documentation.

Method 2. List Child Pages for a Parent Page using Code

This method is a bit advanced and requires to you add code to your WordPress website. If you have not done this before, then please take a look at our guide on how to copy and paste code in WordPress.

To list child pages under a parent page, you need to add the following code in a code snippets plugin or in your theme’s functions.php file:

function wpb_list_child_pages() { 
 
global $post; 
 
if ( is_page() && $post->post_parent )
 
    $childpages = wp_list_pages( 'sort_column=menu_order&title_li=&child_of=' . $post->post_parent . '&echo=0' );
else
    $childpages = wp_list_pages( 'sort_column=menu_order&title_li=&child_of=' . $post->ID . '&echo=0' );
 
if ( $childpages ) {
 
    $string = '<ul class="wpb_page_list">' . $childpages . '</ul>';
}
 
return $string;
 
}
 
add_shortcode('wpb_childpages', 'wpb_list_child_pages');

At WPBeginner, we always recommend adding code in WordPress with WPCode. It allows you to easily add custom code without editing your theme files, so you don’t have to worry about breaking your site.

First, you need to install and activate the free WPCode plugin. For step by step instructions, see this guide on how to install a WordPress plugin.

Once the plugin is activated, navigate to Code Snippets » Add Snippet from your WordPress dashboard. From there, hover your mouse over the ‘Add Your Custom Code (New Snippet)’ option and click the ‘Use snippet’ button.

Add a new custom code snippet in WPCode

Next, add a title for your snippet and paste the code from above into the ‘Code Preview’ box.

Don’t forget to choose ‘PHP Snippet’ as the code type from the dropdown menu on the right.

Paste code into WPCode plugin

After that, simply toggle the switch from ‘Inactive’ to ‘Active’ and click the ‘Save Snippet’ button at the top of the page.

Activate and save your custom code snippet

This code first checks to see if a page has a parent or the page itself is a parent.

If it is a parent page, then it displays the child pages associated with it. If it is a child page, then it displays all other child pages of its parent page.

Lastly, if this is just a page with no child or parent page, then the code will simply do nothing. In the last line of the code, we have added a shortcode, so you can easily display child pages without modifying your page templates.

To display child pages simply add the following shortcode in a page or text widget in the sidebar:

[wpb_childpages]

Don’t forget to save your changes and preview them in a browser tab. This is how it appears on our test site.

Plain link list

You can now style this page list using some custom CSS. Here is some sample CSS code you can use as a starting point.

ul.wpb_page_list {
    list-style: none;
    list-style-type: none;
    background-color: #eee;
    border: 1px solid #CCC;
    padding: 20px;
}

Method 3. Dynamically Display Child Pages Without Any Shortcode

Using shortcodes is convenient, but the problem with them is that you will have to add shortcodes in all pages that have parent or child pages.

You may end up having shortcodes in lots of pages, and sometimes you may even forget to add it.

A better approach would be to edit the page template file in your theme, so that it can automatically display child pages.

To do that, you need to edit the main page.php template, or create a custom page template in your theme.

You can edit your main theme, but those changes will disappear if you change or update your theme. That’s why it would be better if you create a child theme and then make your changes in the child theme.

In your page template file, you need to add this line of code where you want to display child pages.

<?php wpb_list_child_pages(); ?>

That’s all. Your theme will now automatically detect child pages and display them in a plain list.

You can customize the styles with CSS and formatting. Here’s an example of how the OptinMonster website shows the parent page and sub pages:

OptinMonster Sub Pages Example

We hope this article helped you list child pages for a parent page in WordPress. You may also want to see our guide on the most important pages to create on a new WordPress website, and our comparison of the best drag & drop WordPress page builders to create custom layouts without any code.

If you liked this article, then please subscribe to our YouTube Channel for WordPress video tutorials. You can also find us on Twitter and Facebook.

Disclosure: Our content is reader-supported. This means if you click on some of our links, then we may earn a commission. See how WPBeginner is funded, why it matters, and how you can support us. Here's our editorial process.

Editorial Staff

Editorial Staff at WPBeginner is a team of WordPress experts led by Syed Balkhi with over 16 years of experience in WordPress, Web Hosting, eCommerce, SEO, and Marketing. Started in 2009, WPBeginner is now the largest free WordPress resource site in the industry and is often referred to as the Wikipedia for WordPress.

The Ultimate WordPress Toolkit

Get FREE access to our toolkit - a collection of WordPress related products and resources that every professional should have!

Reader Interactions

81 CommentsLeave a Reply

  1. Syed Balkhi says

    Hey WPBeginner readers,
    Did you know you can win exciting prizes by commenting on WPBeginner?
    Every month, our top blog commenters will win HUGE rewards, including premium WordPress plugin licenses and cash prizes.
    You can get more details about the contest from here.
    Start sharing your thoughts below to stand a chance to win!

  2. Denise says

    For third level pages (grandchild), I want to show the same menu that is seen on the child pages (all the child links of the parent). With this snippet, when on a grandchild page, I only see the other grandchild pages in the menu. How would this code need to be modified to show the all child links even when on grandchild pages?

  3. Meredith L says

    I’m relatively new to blogging and I recently switched over to the Kale WordPress theme. I have been trying to do page attribute pages (under the parent page Recipes) so I can have separate categories for appetizers, desserts, etc. Everything seems to go through on the admin part but then on the site itself there are no page attributes/drop down form the Recipes category. What am I doing wrong? It is all set to public so I’m not sure what the problem is.

  4. Daves says

    Thank you for this code. But I don’t want this to be shown on the homepage (static page), just on the parent pages only. Please how can it be done?

    Thank you.

  5. Boris Budeck says

    I am using Generatepress Theme (created a child theme from it for customizing) and I can’t get this to work. The shortcode is displayed in the output page, it seems it is not even ercognized as being a shortcode. I use Elementor widgets and neither text nor shortcode widgets work.

    Any idea of how to make it work when using elementor widgets?

  6. Frederic says

    a great post, it’s exactly what I’m looking for since many hours ! and it works like a charm, just adding the code in the function.php of the theme then adding the short code in the page where I want the sub pages to appear, and voilà!!!
    wonderful, thanks a lot for your generosity !!

  7. Ron says

    Like with so many of the snippets we find, one has to go through all the comments in order to get it to work. What’s wrong with testing what you write?

  8. Alicia says

    Can you do a drop down menu for parent/child pages on wordpress.com, or does it have to be the .org version?

  9. Rudy says

    Using this code ends up displaying the parent page along with the child pages, which is redundant. As I understand it, what we really need is to display only the child pages, not the parent page. Any suggested modification that can do this?

  10. Milos says

    On plugins update, for some strange reason I always get an error:

    Fatal error: Cannot redeclare wpb_list_child_pages() (previously declared in …/wp-content/themes/pagelines/functions.php:25) in …/wp-content/themes/pagelines/functions.php on line 34

  11. ethann says

    Hello great article,
    Can you please help me creating a dropdown of child pages in parent page.I need this functionality for one of my wordpress project and i am totally newbie to wordpress.

  12. Alex says

    Am I the only one that cannot get it to work?

    I have the following structure

    About
    — Page 1
    — Page 2
    — Page 3

    When on the “About” or a child page (1, 2 or 3) I would like to have a list with my parent page (About) and all children (1, 2, 3) – Anyone got that working?

    Thanks! :)

    • Kendra says

      OMG sorry this is annoying Please ignore my other posts. Didn’t realize you couldn’t paste code into the comments.

      I was NOT able to get it to work with wpb_list_child_pages();

      I WAS able to get it to work with echo do_shortcode( ‘[wpb_childpages]’)

      And to get the title of the parent page, i inserted this above the child page list:
      $current = $post->ID;

      $parent = $post->post_parent;

      $grandparent_get = get_post($parent);

      $grandparent = $grandparent_get->post_parent;

      PHP if ($root_parent = get_the_title($grandparent) !== $root_parent = get_the_title($current)) {echo get_the_title($grandparent); }else {echo get_the_title($parent);

  13. Jean Bishop says

    I am using this code and it works great. Is it possible to also display categories in menus along with pages?

  14. Michelle says

    Hi,

    I want to do the following

    Parent page must be either for sale and or for rent
    Then I want the child for example a province (gauteng) to link to the for sale and the for rent parent.
    How do I do that?

    Michelle

  15. Zakhar says

    How can i create shortcode with param, for example, [wpb_childpages id=”1″], where id=”1″ is an id of parent page?

  16. Strand says

    Hi,

    Is it possible to limit the links to a specific number such as maximum 12 child pages?

    Thanks

  17. Aander says

    Thank you,

    Could you explain, please, how can I organize child pages in drop down list that would be accessible through the parent page? (I don’t want the visitors could see all child pages in a form of a blogroll.)

    I.e., on the parent page I want to create drop down list (listbox) to which child pages would be added in predefined order (say in alphabetical order). After reading Introduction a visitor can proceed by choosing any page from the list at her wish (child pages has no logical connection so in any case she will search the exact page).

    Is ‘my dream’ realizable?

    Thank you again.

  18. Astrid says

    Hi WPBeginner Staff,

    I used the code you guys provided with the “short code option” and it worked (links to child pages). However, I wanted to use the permanent option, and that didn’t work.

    When I added this line of code [ ] the parent page returns a 500 error and no child pages are displayed at atll.

    What am I doing wrong?

    On a side note if I wanted to display and excerpt with its respective image how would I go about it? Thanks!

    • Astrid says

      I was able to figure this out.

      I added the code snippet then added this shortcode [wpb_childpages] to the parent page where I wanted the child pages displayed. Awesome!

      Now in order to display excerpts and an image would I use the same queries– just like posts under a category.

      Thanks in advance :)

      • Jade says

        Hey I was wondering what you meant by ‘query’? How exactly did you get the excerpts and images to display in the parent page?

        Thanks!

  19. Pradeep says

    Could someone confirm that the example page used in this tutorial http://optinmonster.com/how-it-works/ uses this feature or not? To me it looks like it they are using tabs, instead of child pages.

    If I’m right, could someone direct me to a resource to get that feature, as I’m desperately looking for a fluid solution like the one they have in that page?

    Many thanks,

    Pradeep

  20. Andrew Roberts says

    For the non-shortcode option, you might want to let users know they need to either change
    return $string; to
    echo $string; or
    in their page template echo out the function
    echo page_list_child_pages();

    Thanks to Erik for pointing this out above

  21. Howard says

    Hi, I can get this to work when I am visiting my domain with a subdirectory (e.g – example.com/home) but when viewing the site without this (example.com) the list of sub pages is not listed. Can anyone point me as to where I am going wrong?

    Thanks in advance – very new to WordPress.

  22. Emily Jennewein says

    How do you get this function to display the parent page itself at the top of the list along with the list of child and grandchild pages? On the child pages it does not list the parent page.

  23. Jenny says

    Is there now a plugin that can do same ?

    and also can we decide where the box with submenus pages will go in any are of the page not just top of page? Using a plugin

  24. WPBeginner Staff says

    Yes it can be used for custom post types. Like this:


    function wpb_list_child_pages() {

    global $post;

    if ( 'movie' == get_post_type() && $post->post_parent )

    $childpages = wp_list_pages( 'post_type=movie&sort_column=menu_order&title_li=&child_of=' . $post->post_parent . '&echo=0' );
    else
    $childpages = wp_list_pages( 'post_type=movie&sort_column=menu_order&title_li=&child_of=' . $post->ID . '&echo=0' );

    if ( $childpages ) {

    $string = '' . $childpages . '';
    }

    return $string;

    }

    add_shortcode('wpb_childpages', 'wpb_list_child_pages');

  25. dpc says

    Is there a way to modify this in order to print custom post type child posts on a custom post type post page? Thanks, it is very handy!

  26. Sokeara says

    It’s very greate for me! Anyways I would like to know how can I display title and thumbnail of child page to parent page.

    • Ashley Bell says

      Hi, I have the same query. I really like how the list is styled on the Beginners Blueprint page but I have no idea how to start. Can someone recommend an article to read or give some advice, thanks.

  27. amitabha197 says

    There is an error in the pages which are not having child pages so I have slightly modified
    if( count($childpages) != 0 ) {
    $string = ” . $childpages . ”;
    }

    instead of
    if( $childpages ){
    $string = ” . $childpages . ”;
    }

  28. Coen Siebenheller says

    I’ve added the code to the functions.php and when i add the [wpb_childpages] shortcode in side my text it works. But when try to add to one of my templates it doesn’t show a thing. Anybody knows what i’m doing wrong?

  29. Quin says

    This is brilliant, thanks.

    Is there a way to adapt it so the Parent displays the Grandchild, and not the Child?

  30. Steph says

    Can you tell us how to stop the list at the first level? I’d like to show all the subpages of that parent, but not the subpages’ children. Thanks.

    • Stefan says

      Just add &depth=1

      sort_column=menu_order&title_li=&child_of=’ . $post->post_parent . ‘&echo=0&depth=1

  31. Martin Capodici says

    Great. I love this idea of a site plugin and seeing the code you are adding (so you know it is clean and doesn’t do bad stuff) rather than relying on some plugin that could be installing anything.

    For something as simple as listing child pages I agree it should be part of a larger plugin rather than just one plugin otherwise you end up with so many plugins it is hard to keep track.

  32. Rishi Gangoly says

    This is great. I had a page on my website called “Services” and was manually linking the sub-pages, but not any more. Awesome. Thanks for this tip. Worked like a charm and did exactly what I was doing manually. :)

  33. Bojan says

    This is great! Putting it in a plugin is great feature and great opportunity to extend functionality by adding:
    – child page featured image (as thumbnail)
    – child Title
    – rest of the meta (author, date, comment count)
    – styling in columns maybe
    and so on

    This way, we would have almost complete Portfolio plugin – portfolios made of Pages rather than just made of custom post types.

    Thank you..

  34. yousef mayeli says

    hi there
    thanks it was very useful . but if you could show it by video it was very more useable.as tyler moor would do
    thanks
    yousef

  35. Nancy says

    This is great! I have a lot of manually added links to child pages, and this is going to make maintaining our site MUCH easier. I’ve just been testing in my development environment, and I’d like to tweak the function a little bit, so that on a child page, when the shortcode is included, all of the children of the same parent are listed EXCEPT for the currently displayed page. I’m really still learning PHP, so while I’ll be trying to figure this one out on my own, I’d welcome any assistance in making that change to the code.

Leave a Reply to Alex Cancel reply

Thanks for choosing to leave a comment. Please keep in mind that all comments are moderated according to our comment policy, and your email address will NOT be published. Please Do NOT use keywords in the name field. Let's have a personal and meaningful conversation.