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,
-
use global $post variable to setup the postdata, else the loop functions will not see your custom post object.
-
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