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
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.
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):
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.
foreach ( $childPosts as $cp ) : setup_postdata( $cp );
foreach ( $childPosts as $post ) : setup_postdata( $post );
So you need to use the exact
$post variable along with the
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; does not work with
setup_postdata($post); if you want to use the
the_title() family of commands etc.
// 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.
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; ?>
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(); ?>