setup_postdata() does not seem to be working?

I am not sure why but I have used get_posts() to query for some data. Then I used setup_postdata() … I think its used so that I can use functions like the_permalink() etc with the new post data?

<?php foreach ($childPosts as $cp) : setup_postdata($cp); ?>

<article <?php post_class() ?> id="post-<?php the_ID(); ?>">
  <h1><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
  <?php if (has_post_thumbnail()) : ?>
  <a href="<?php the_permalink() ?>"><?php the_post_thumbnail(($hasOutputNotFeaturedDiv) ? 'thumb-small' : null) ?></a>
  <?php endif; ?>
  <?php the_excerpt(); ?>
  <p class="more"><a href="<?php the_permalink() ?>">Read more ...</a></p>
  <?php include (TEMPLATEPATH . '/inc/meta.php' ); ?>
</article>

<?php endforeach; ?>

but it appears that only the_excerpt contains the new post data value, why is that? I find that if I use echo get_the_permalink($cp) it works ok. But I think the shorter version will be better

Related posts

Leave a Reply

6 comments

  1. I could be wrong, but from what I’m seeing, “setup_postdata()” should be used when doing a custom select query (not just query_posts):
    http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query

    As well, if you want to use tags like “the_title()” and “the_permalink()” with that custom select query … you’ll need to use the variable name $post specifically (not another variable name) in setup_postdata() – AS WELL – you should call global $post before your “foreach” loop…

    So basically follow that example in that codex link. And don’t change the variable name $post – otherwise it breaks it.

    HTH

  2. Replace the

    foreach ( $childPosts as $cp ) : setup_postdata( $cp );
    

    with

    foreach ( $childPosts as $post ) : setup_postdata( $post );
    

    So you need to use the exact $post variable along with the setup_postdata().

  3. Depending on where you are using setup_postdata() (if it is not in the main loop, or in a function/sidebar widget, for example), you may also need to declare –

    global $post;
    
  4. 2 important things to make this work,

    1. use global $post variable to setup the postdata, else the loop functions will not see your custom post object.

    2. VERY IMPORTANT: make sure to call wp_reset_postdata() function at the end of the loop else you may have weird errors which will be very difficult to debug.

       <?php
       global $post;
      
       $myposts = get_posts( array(
           'posts_per_page' => 5,
           'offset'         => 1,
           'category'       => 1
       ) );
      
       if ( $myposts ) :
           foreach ( $myposts as $post ) :
             setup_postdata( $post ); ?>
               <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
           endforeach; 
           wp_reset_postdata();
       endif;
       ?>
      
  5. When querying posts just use the normal loop with a set of arguments passed into it. Then reset the query at the end.

    <?php 
    
        // makes query respect paging rules
        $paged = get_query_var('paged');
    
        // defining the arguements for the custom loop
        $variablenameQuery = array(
            'post_type'                 => 'seating-charts',
            'post_status'               => 'publish',
            'cust_tax_name'             => 'custom-tax-term',
            'posts_per_page'            => -1, // neg 1 means all posts
            'orderby'                   => 'date',
            'order'                     => 'ASC',
            'paged'                     => $paged,
        ); // end query
    
        // pass result into query_posts to get result
        query_posts($variablenameQuery);
    
    ?>
    <?php if (have_posts()) : ?>
    
        <?php while (have_posts()) : the_post(); ?>
    
            <?php // Individual Post Styling ?>
    
        <?php endwhile; ?>
    
            <?php // paged navigation - next post, previous post... ?>
    
        <?php else : ?>
    
        <h3>Ooops looks like there was an issue. Please <a href="<?php echo get_option('home'); ?>/contact" title="Contact Us">get in touch</a> with us and we'll get the problem fixed.</h3>
    
    <?php endif; ?>
    
    <!-- resets the WordPress Query -->
    <?php wp_reset_query(); ?>