<?php
$count = 0; //set up counter variable
while (have_posts()) : the_post();
$count++; //increment the variable by 1 each time the loop executes
if ($count<4) {
// here put the special code for first three
}
// here put the code for normal posts
endwhile;
?>
обычно когда формируют такие страницы, тянут не только посты, но и различные таксонометрии.
update_post_caches(). Контролируются данные подзапросы с помощью параметра WP_Query 'update_post_term_cache' => bool (и 'update_post_meta_cache' => bool для метаданных соответственно). По умолчанию стоит true, поэтому термины таксономий и метаданные получаются. Подучите матчасть.можно вместо if использовать switch.
Использование серии if (без elseif/else) может быть более эффективным (вполне возможно тут надо быть row-обертки делать, например). Опять же, матчасть. Return erly и прочие грамотности.