Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

This has only been a problem since I updated to Wordpress 3.1

I have a page that displays a list of custom post types. The page is the child of a parent page. There is a sidebar that lists sibling pages. The code for the two is conflicting somehow, and I can't get the list of pages to show up.

This is the code to display the list of custom post type (in my case 'sponsor'):

<?php
$args = array( 'numberposts' => 30, 'post_type' => 'sponsor' );
$sponsors = get_posts( $args );
foreach ($sponsors as $post) :  setup_postdata($post); 
?>

<div class="content">
<h3><?php the_title(); ?></h3>
<?php the_content(); ?>
</div>

<?php endforeach; ?>

This is the code in my sidebar to list the sibling pages:

<?php
    if (!$post->post_parent) {
        $children = wp_list_pages('title_li=&child_of='.$post->ID.'&echo=0');
    } else {
        $p = end(get_post_ancestors($post->page));
        $children = wp_list_pages('title_li=&child_of='.$p.'&echo=0');
    }
?>
<?php
    if ($children) {
        $parent_title = end(get_post_ancestors($post));
?>
    <ul>
    <?php echo $children; ?>
<?php } ?>
    </ul>

Nothing is showing up in the sidebar. I tried deleting the code for the posts, and the list of pages showed up correctly. But something about the "get_posts" is not letting the "list_pages" work.

Anyone know what alternate code I can use?

share|improve this question
1  
Tried a reset after the get_posts call? eg. wp_reset_query, it's suppose to clear up variables used by template tags inside post loops. –  t31os Feb 24 '11 at 17:49
    
Yeah, that seemed to work. Probably something I should know, but still a newbie. Thank you! –  user3122 Feb 24 '11 at 21:08
    
@t31os Add your solution as an answer … so we can upvote it and get this question out of the list of unanswered questions. –  toscho May 1 '12 at 21:05

2 Answers 2

From comment:

Use wp_reset_query() after each loop to undo the changes made to global variables by setup_postdata().

share|improve this answer

From what I can see, it might be that you don't have the 'post_type' => 'custom-post-type-name' set in your wp_list_pages arguments. I know that mine doesn't show anything if I miss that out. You do have it in your get_posts args, which might be why that was working. Try this in your sidebar:

<?php
    if (!$post->post_parent) {
        $children = wp_list_pages('title_li=&child_of='.$post->ID.'&echo=0&post_type=sponsor');
    } else {
        $p = end(get_post_ancestors($post->page));
        $children = wp_list_pages('title_li=&child_of='.$p.'&echo=0&post_type=sponsor');
    }
?>
<?php
    if ($children) {
        $parent_title = end(get_post_ancestors($post));
?>
    <ul>
       <?php echo $children; ?>
    </ul>
<?php } ?>

Although I could of course just be barking up the wrong tree if wp_reset_query () makes it work fine for you.

Also, this wouldn't help if the pages you want wp_list_pages to reference aren't custom post types, it just wasn't clear from your question whether they were or not.

share|improve this answer

Your Answer

 
discard

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