Я однажды решил это для WP 2.9 примерно так:
И да! Я знаю: отступ в наценке выглядит испорченным, но это (вроде) имеет смысл, если вы посмотрите внимательно;)
Это больше не тестируется с WP 3.0.x, но он сделал в точности то, что вы хотели. Пожалуйста, посмотрите, работает ли он для вас, и не стесняйтесь спрашивать, если что-то сломано или не имеет смысла.
<?php if (have_posts()): ?>
<?php $year = 0; ?>
<?php $month = 0; ?>
<ul>
<?php while (have_posts()): the_post(); ?>
<?php $post_year = substr($post->post_date, 0, 4); ?>
<?php $post_month = substr($post->post_date, 5, 2); ?>
<?php if(($year != $post_year || $month != $post_month) && $year != 0): ?>
</ul>
</li>
<?php endif; ?>
<?php if ($year != $post_year || $month != $post_month): ?>
<li>
<strong><?php the_time('F Y') ?></strong>
<ul>
<?php endif; ?>
<li>
<span><?= mysql2date('j', $post->post_date) ?></span>
<?php the_title() ?>
</li>
<?php $year = $post_year; ?>
<?php $month = $post_month; ?>
<?php endwhile; ?>
</ul>
</li>
</ul>
<?php endif; ?>