I have in my Wordpress theme, a section where I am getting child pages to display their information. This is what I have right now:
<?php
$my_wp_query = new WP_Query();
$all_wp_pages = $my_wp_query->query(array('post_type' => 'page'));
$staff = get_page_children(8, $all_wp_pages);
foreach($staff as $s){
$page = $s->ID;
$page_data = get_page($page);
$content = $page_data->post_content;
$content = apply_filters('the_content',$content);
$content = str_replace(']]>', ']]>', $content);
echo '<div class="row-fluid"><span class="span4">';
echo get_the_post_thumbnail( $page );
echo '</span><span class="span8">'.$content.'</span></div>';
}
?>
I have five child pages that should be showing up, but only three are returning. I used print_r on $staff to see if the other pages were even in the array, but they aren't. I'm not sure what the problem could be.
There is nothing wrong with get_page_children()
or new WP_Query()
. By default WP_Query
returns only the last x
number of pages created. It's the limit imposed on WP_Query
.
get_page_children()
simply takes the pages array returned by WP_Query
and filters the children pages from that list. According to WordPress Codex: get_page_children "...does not make any SQL queries to get the children."
$query = new WP_Query( 'posts_per_page=-1' );
<?php
$my_wp_query = new WP_Query();
$all_wp_pages = $my_wp_query->query(array('post_type' => 'page', 'posts_per_page' => -1));
$staff = get_page_children(8, $all_wp_pages);
foreach($staff as $s){
$page = $s->ID;
$page_data = get_page($page);
$content = $page_data->post_content;
$content = apply_filters('the_content',$content);
$content = str_replace(']]>', ']]>', $content);
echo '<div class="row-fluid"><span class="span4">';
echo get_the_post_thumbnail( $page );
echo '</span><span class="span8">'.$content.'</span></div>';
}
?>
function my_get_page_children( $page_id, $post_type = 'page' ) {
// Set up the objects needed
$custom_wp_query = new WP_Query();
$all_wp_pages = $custom_wp_query->query( array( 'post_type' => $post_type, 'posts_per_page' => -1 ) );
// Filter through all pages and find specified page's children
$page_children = get_page_children( $page_id, $all_wp_pages );
return $page_children;
}
You code with with the helper function
foreach(my_get_page_children(8) as $s){
$page = $s->ID;
$page_data = get_page($page);
$content = $page_data->post_content;
$content = apply_filters('the_content',$content);
$content = str_replace(']]>', ']]>', $content);
echo '<div class="row-fluid"><span class="span4">';
echo get_the_post_thumbnail( $page );
echo '</span><span class="span8">'.$content.'</span></div>';
}
I've had a similar problem - looks like get_page_children behaves weird... (in my case, for one page which had three children it returned three, for another with four it returned zero! - can't work it out..)
I got round it by using a custom query instead:
$params = array(
'post_type'=>'page',
'post_parent'=> 8,
);
$staff = query_posts($params);
Similar here: http://www.sanraul.com/2010/08/28/get-page-children/
NOTE: depending on where you use this, you might need a wp_reset_query();
as well - or else that query_posts()
could break your main loop!
Hope that helps! - A
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With