WordPress.org

Ready to get started?Download WordPress

Forums

nested list of posts using the_date (5 posts)

  1. donzacharias
    Member
    Posted 7 years ago #

    Okay here is some php code that displays posts grouped by the_date for use in a sidebar:

    <ul>
    <?php if (have_posts()) :
    while (have_posts()) : the_post();
    echo the_date('F j','<li>','</li>');
    echo "<li><a href=\"";
    echo the_permalink();
    echo "\">";
    echo the_title();
    echo " by ";
    echo the_author_posts_link();
    echo "</li>";
    endwhile;
    endif; ?>
    </ul>

    I want to find a way to nest the posts that appear for each use of the_date in a new <ul> tag but I can't think through it. Can anybody assist? Thanks!!

    See it in use here: http://wp.sacrag.com on the top left (recent posts)

  2. Samuel Wood (Otto)
    Tech Ninja
    Posted 7 years ago #

    I'm uncertain as to what you're trying to do. Are you saying that you want to do a new UL every time the_date changes? I really don't see why you'd want to do that in this case, but hey, to each his own.

    the_date has a unique property, as you may have noticed. It won't print the same thing twice in a row. If you look at your recent posts for Sept. 19th, you'll see that the September 19th only printed once for two posts, even though the_date was called twice (think about it).

    You can use this property to your advantage here.

    <ul>
    <?php if (have_posts()) :
    while (have_posts()) : the_post();
    echo the_date('F j','</ul><ul><li>','</li>');
    echo "<li><a href=\"";
    echo the_permalink();
    echo "\">";
    echo the_title();
    echo " by ";
    echo the_author_posts_link();
    echo "</li>";
    endwhile;
    endif; ?>
    </ul>

    This is a bit unpleasant, I grant you, since it leaves a useless <ul></ul> at the top of the result. You could work around this by handling the changing date code yourself. For this, you'd need get_the_time(), like so:

    <ul>
    <?php if (have_posts()) :
    $start_loop = true;
    while (have_posts()) : the_post();
    $curr_date = get_the_time('F j');
    if (!$start_loop && $curr_date != $old_date) {
    echo "</ul><ul>";
    }
    $start_loop = false;
    $old_date = $curr_date;
    echo the_date('F j','<li>','</li>');
    echo "<li><a href=\"";
    echo the_permalink();
    echo "\">";
    echo the_title();
    echo " by ";
    echo the_author_posts_link();
    echo "</li>";
    endwhile;
    endif; ?>
    </ul>

    This one is slightly more complex. Basically, we ignore the first run through the loop using a boolean variable, then for the rest of the runs, if the date string changes, we close the UL and start a new one.

  3. donzacharias
    Member
    Posted 7 years ago #

    Thanks! That was too many <ul>s but I played around with it and changed
    if (!$start_loop && $curr_date != $old_date) {
    echo "
    </ul><ul>";
    to
    if (!$start_loop && $curr_date != $old_date) {
    echo "
    </li></ul>";

    and
    the_date('F j','<li>','</li>');
    to
    the_date('F j','<li>','<ul>');

    and got what I wanted.

  4. Samuel Wood (Otto)
    Tech Ninja
    Posted 7 years ago #

    That don't seem right. You've got one too many </li>'s in there now. Your page doesn't validate because of it.

  5. donzacharias
    Member
    Posted 7 years ago #

    I think you were right, but
    echo "</ul></li>";
    after the if block works right and validates.

    Check it here in Recent Posts http://sacrag.com

Topic Closed

This topic has been closed to new replies.

About this Topic