I have a page structure like this.
Portfolio
- Residential
- - Resident 1
- - Resident 2
- - Resident 3
- Commercial
- - Commercial 1
- - Commercial 2
- - Commercial 3
The grandchild pages Resident 1 – Commercial 3 have post thumbnails
I have a template for the Portfolio page where i would like to display the ‘Residential’ and ‘Commerical’ pages with their child pages like so.
<div class="grid">
<h2>Residential</h2>
<ul>
<li> Resident 1 post_thumbnail </li>
<li> Resident 2 post_thumbnail </li>
<li> Resident 3 post_thumbnail </li>
</ul>
</div>
<div class="grid">
<h2>Commercial</h2>
<ul>
<li> Commercial 1 post_thumbnail </li>
<li> Commercial 2 post_thumbnail </li>
<li> Commercial 3 post_thumbnail </li>
</ul>
</div>
I’m using get_pages and I have the div’s created for ‘Residential’ and ‘Commercial’
<?php
$portfolio_sections = array(
'post_type' => 'page',
'child_of' => $post->ID,
'sort_column' => 'menu_order',
'sort_order' => 'ASC',
'parent' => $post->ID
);
$sections = get_pages($portfolio_sections);
foreach($sections as $section){
?>
<div class="grid">
<h2><?php echo $section->post_title; ?></h2>
//Create Child pages
</div><!--.grid-->
<?php
}
?>
My problem is creating the child pages in the ‘ul’ list
I tried using a second foreach loop but this didn’t work and I don’t know if this is the correct way
<?php
$portfolio_sections = array(
'post_type' => 'page',
'child_of' => $post->ID,
'sort_column' => 'menu_order',
'sort_order' => 'ASC',
'parent' => $post->ID
);
$sections = get_pages($portfolio_sections);
foreach($sections as $section){
?>
<div class="grid">
<h2><?php echo $section->post_title; ?></h2>
<ul class="imageGrid">
<?php
$portfolio_pages = array(
'post_type' => 'page',
'child_of' => $section->ID,
'sort_column' => 'menu_order',
'sort_order' => 'ASC',
'parent' => $section->ID
);
$pages = get_pages($portfolio_pages);
foreach($pages as $page){
?>
<li><a href="<?php echo get_the_permalink($page->ID);?>" rel="nofollow noreferrer noopener"><?php echo get_the_post_thumbnail($page->ID, "thumbnail"); ?><span><?php echo get_the_title($page->ID);?></span></a></li>
<?php
}
?>
</ul>
</div><!--.grid-->
<?php
}
?>
— UPDATE —-
The structure I wanted. A div around each ul list
<div class="grid">
<h2>Residential</h2>
<ul>
<li> Resident 1 post_thumbnail </li>
<li> Resident 2 post_thumbnail </li>
<li> Resident 3 post_thumbnail </li>
</ul>
</div>
<div class="grid">
<h2>Commercial</h2>
<ul>
<li> Commercial 1 post_thumbnail </li>
<li> Commercial 2 post_thumbnail </li>
<li> Commercial 3 post_thumbnail </li>
</ul>
</div>
The structure from the code is one surrounding div.
<div class="grid">
<h2>Residential</h2>
<ul>
<li> Resident 1 post_thumbnail </li>
<li> Resident 2 post_thumbnail </li>
<li> Resident 3 post_thumbnail </li>
</ul>
<h2>Commercial</h2>
<ul>
<li> Commercial 1 post_thumbnail </li>
<li> Commercial 2 post_thumbnail </li>
<li> Commercial 3 post_thumbnail </li>
</ul>
</div>
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
You don’t need 2 queries, just use a bit of logic and 2 foreach loops:
$portfolioID = $post->ID;
$portfolio_sections = array(
'post_type' => 'page',
'child_of' => $portfolioID,
'sort_column' => 'menu_order',
'sort_order' => 'ASC',
);
$sections = get_pages($portfolio_sections);
$hierachical = array();
if ( ! empty($sections) ) {
foreach ( $sections as $section ) {
if ( $section->post_parent == $portfolioID ) {
if ( ! isset( $hierachical[$section->ID]) ) $hierachical[$section->ID] = array();
$hierachical[$section->ID]['child'] = $section;
$hierachical[$section->ID]['grandchildes'] = array();
} else {
if ( ! isset( $hierachical[$section->post_parent]) ) $hierachical[$section->post_parent] = array();
$hierachical[$section->post_parent]['grandchildes'][] = $section;
}
}
foreach ( $hierachical as $id => $hierachical_data ) {
if ( ! isset($hierachical_data['child']) || ! is_object($hierachical_data['child']) ) continue;
echo '<div class="grid">';
echo '<h2>' . get_the_title($hierachical_data['child']->ID) . '</h2>';
echo '<ul>';
if ( isset($hierachical_data['grandchildes']) && ! empty($hierachical_data['grandchildes']) ) {
foreach ( $hierachical_data['grandchildes'] as $grandchild ) {
if ( has_post_thumbnail($grandchild->ID)) {
echo '<li><a href="' . get_permalink( $grandchild->ID ) . '" rel="nofollow noreferrer noopener" title="' . esc_attr( $grandchild->post_title ) . '">';
echo get_the_post_thumbnail($grandchild->ID);
echo '</a></li>';
}
}
}
echo '</ul>';
echo '</div>';
}
}
Code untested but should works.
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