Displaying part of every child page?

I have been trying to find a way to return page information in order to create a landing page. I have done this with posts before, to create a blog reel, and would like to achieve the same overall result with pages.

The Scenario:
I use a drop menu with pages created in the WordPress. Nesting the pages builds the menu.

Read More

The Goal:
I would like to get the subpages of the parent page. When a user navigates to the parent page I would like it to return links to the subpages with a part of the content of the child page. For example, I would like to display the <div> with class header.

A Starting Point:

$mypages = get_pages('child_of='.$post->ID.'&sort_column=post_date&sort_order=desc');

foreach($mypages as $page)
{
    $content = $page->post_content;
    if(!$content) // Check for empty page
        continue;

    $content = apply_filters('the_content', $content);
?>
    <h2><a href="<?php echo get_page_link($page->ID) ?>"><?php echo $page->post_title ?></a></h2>
    <div class="entry"><?php echo $content ?></div>
<?php
}

So far function returns all of the_content for all of the children and grandchildren pages. I would like it to specifically return only 1 div with a specific class from each child page and disregard all of the grandchildren pages.

Related posts

Leave a Reply

2 comments

  1. Two suggestions:

    1. To output your “Loop” only for Child Pages, and not for Grandchild etc. Pages, add a conditional.

    e.g.

    foreach ( $mypages as $page ) {
         if ( $page->post_parent == $post->ID ) {
              // Loop goes here
         }
    }
    
    1. To output only an excerpt of each Child Page, enable excerpt support for Pages, and then output $page->post_excerpt.

    In functions.php:

    add_post_type_support('page', 'excerpt');
    

    Then in your “Loop”:

    foreach ( $mypages as $page ) {
    
         if ( $page->post_parent == $post->ID ) {
    
                  $content = $page->post_excerpt; // changed post_content to post_excerpt
    
                  if( ! $content ) // Check for empty page
                       continue;
    
                  $content = apply_filters( 'the_content', $content );
                  ?>
                  <h2><a href="<?php echo get_page_link( $page->ID ) ?>"><?php echo $page->post_title ?></a></h2>
                  <div class="entry"><?php echo $content ?></div>
                  <?php
    
         }
    }
    
  2. And here is my solution to split it with the More button (which is also available for pages):

    $child_pages = get_pages( array(
        'parent' => get_the_ID(),
        'hierarchical' => false,
        'sort_column' => 'post_date',
        'sort_order' => 'desc',
    ) );
    
    foreach ( $child_pages as $child_page ) {
        $short_content = $child_page->post_content;
        if ( preg_match( '/<!--more(.*?)?-->/', $short_content, $matches, PREG_OFFSET_CAPTURE ) ) {
            $short_content = substr( $short_content, 0, $matches[0][1] );
        }
        echo apply_filters( 'the_content', $short_content );
    }