setup_postdata() does not seem to be working?

The question:

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() ?>" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener"><?php the_title(); ?></a></h1>
  <?php if (has_post_thumbnail()) : ?>
  <a href="<?php the_permalink() ?>" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener"><?php the_post_thumbnail(($hasOutputNotFeaturedDiv) ? 'thumb-small' : null) ?></a>
  <?php endif; ?>
  <?php the_excerpt(); ?>
  <p class="more"><a href="<?php the_permalink() ?>" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener">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

The Solutions:

Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.

Method 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

Method 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().

Method 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;

Method 4

global post; does not work with setup_postdata($post); if you want to use the the_title() family of commands etc.

It’s in https://codex.wordpress.org/Function_Reference/setup_postdata

Instead use

// global $post; setup_postdata($post_object); //don't do this!
setup_postdata( $GLOBALS['post'] =& $post_object );

…also make sure your $post_object is a valid WP_Post object.

Method 5

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;
     ?>
    

Method 6

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" rel="nofollow noreferrer noopener" 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(); ?>


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

Leave a Comment