I'm working on a site where we're introducing drop down panels from the menu which will display thumbnails from various tags on the site.

Each panel has a left column displaying a featured post, and a right column displaying 6 thumbnails; on each tab then I'm doing two wp_query loops, the first to display the featured post image, and the second to display the 6 thumbnails (with featured post excluded).

I'm wondering though if this is the most efficient way of doing things, as there are 10 tabs, so that's 20 uses of wp_query in the main menu.

Example code for one of the tabs below:

    <div class="displaymenu"><div class="menucontent">

        <div class="leftdisplaymenu padding">

        global $quote_id;
        $quote_id=array(); // setup an array to store post ids to exclude from future queries
        'posts_per_page' => '1',
        'post_status' => 'publish',
        'tag' => 'quotes',


        $mainquotes = new WP_Query($argsformainquotes);
        while ($mainquotes->have_posts()) : $mainquotes ->the_post();
$idforquote=get_the_id(); $quote_id[]=$idforquote; // add the id of this post to exclusion array
        $post_thumbnail_id = get_post_thumbnail_id();
    $post_thumbnail_url = wp_get_attachment_image_src( $post_thumbnail_id,'bigfeature'); ?><div class="mainimg"><a href="<?php the_permalink();?>" target="_blank"><img src="<?php echo $post_thumbnail_url[0];?>" alt=" <?php the_title();?>"  class="thumblist"  height="240" width="240" /></a><div class="imgtitle"><a href="<?php the_permalink();?>" title="<?php the_title();?>" class="tablinktitles"><?php the_title();?></a></div><br /><?php $small_excerpt=get_the_excerpt();echo substr($small_excerpt,0,100);?><br /><br /><a href="<?php the_permalink();?>" class="tablinktitles">read more...</a></div><?php endwhile;?>


        <div class="rightdisplaymenu"><ul><?php $argsforquotes=array(
        'posts_per_page' => '6',
        'post_status' => 'publish',
        'tag' => 'quotes',
        'post__not_in' => $quote_id,


        $quotes = new WP_Query($argsforquotes);
        while ($quotes->have_posts()) : $quotes ->the_post();?>

        $post_thumbnail_id = get_post_thumbnail_id();
    $post_thumbnail_url = wp_get_attachment_image_src( $post_thumbnail_id,'smallfeature' ); ?><a href="<?php the_permalink();?>" target="_blank"><img src="<?php echo $post_thumbnail_url[0];?>" alt=" <?php the_title();?>" height="140" width="140" class="thumblist" /></a><br /><a href="<?php the_permalink();?>"><?php $trunctitle=get_the_title();echo substr($trunctitle,0,20);?>...</a></li><?php endwhile;?> </ul><div class="furtherlink"><a href="http://www.aplacetolovedogs.com/tag/quotes/" title="More of Your Dog Quotes">More Quotes...</a></div></div>


Rather than querying for a single item and then querying again for 6 more excluding the first, you can just do a single query for 7 items and selectively output markup by checking which post you're currently outputting in the loop via $your_query_object->current_post. You can also combine that with $your_query_object->rewind_posts() to run through the same loop multiple times within a template.

Beyond that, you can store your menu in a transient so you're not doing all those queries on every request. I always recommend people use a caching plugin as well, like W3TC or similar.

  • +1 for transients. Any time you are doing an extra query, you should store it in a transient. – helgatheviking Sep 13 '12 at 17:48
  • Thanks Milo - that's exactly the answer I was looking for. – andy Sep 14 '12 at 13:41

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.