When the single post template is loaded, WordPress has already queried the database for that post. When you call query_posts('post_type=post&posts_per_page=1');
, and then run the loop, this simply loads and outputs a single post, which by default will be the latest post. It also has the side-effect of overwriting the original main query.
You don’t need to, nor should you ever call query_posts
in the template.
To load additional posts beside the single post you are currently viewing, use WP_Query
, and leave the main query unaltered.
// load and display all posts
// setting post_type is unnecessary, it will default to post
$all_posts = new WP_Query( array( 'posts_per_page' => -1 ) );
while( $all_posts->have_posts() ):
$all_posts->the_post();
// your markup for all posts
endwhile;
// reset the global post variable
wp_reset_postdata();
// now output the single post
// no need for a query, the post data already exists
// in the global $wp_query
while( have_posts() ):
the_post();
// your markup for the single post
endwhile;