Первые и последние классы PHP в цикле while

#php #wordpress #while-loop #css

#php #wordpress #цикл while #css

Вопрос:

Я пытаюсь понять, как добавить первый и последний класс к первому и последнему элементам, выводимым из цикла while. Единственное, что я нашел с помощью поиска, имело отношение к работе с mysql напрямую, пока я использую это в цикле WordPress (я ввел функцию, в которой я хочу создать класс osu_first_last() ):

 <div id="news-loop">
    <h2 class="widget-title">News</h2>
    <?php
        // Build query for 
        $wp_news_query_temp = clone $wp_query;
        $wp_news_query = new WP_Query();
        $wp_news_query->query('category_name=Newsamp;showposts=3amp;orderby=dateamp;order=DESC');
        $news_counter = 0;
        // Create posts loop
        if ($wp_news_query->have_posts()) : while ($wp_news_query->have_posts()) : $wp_news_query->the_post(); ?>
        <div class="news-entry news-entry-<?php echo $news_counter; ?><?php osu_first_last(); ?>">
            <h3 class="entry-title">
            <?php the_title(); ?>
            </h3>
            <?php twentyten_posted_dateonly(); ?>
            <?php echo osu_short_excerpt(); ?>
        </div> <!-- End div.news-entry -->
        <?php
        $news_counter  ;
        endwhile; ?>
        <?php endif; $wp_query = clone $wp_news_query_temp; ?>
        <a href="<?php bloginfo('url'); ?>/category/news/" class="sidebar-more">View all news</a>   
</div>
  

Кто-нибудь может посоветовать лучший способ сделать это, пожалуйста?

Спасибо,

osu

Комментарии:

1. Почему бы не использовать CSS? #news-loop div:first-child {} и #news-loop div:last-child {}

2. Привет, Гордон — к сожалению, похоже, что IE не поддерживает эти селекторы: quirksmode.org/css/contents.html Я бы предпочел делать это только с помощью CSS!

Ответ №1:

подразделение может использовать current_post и post_count и для определения первого и последнего сообщения, передав его вместе с запросом в osu_first_last()

затем реализуйте osu_first_last() следующим образом

 function osu_first_last($query)
{
    $extraClass = "";
    if($query->current_post == 1)
    {
        $extraClass .= "first";
    }
    if($query->post_count == $query->current_post)
    {
        if($extraClass != "")
        {
            // post is first and last
            $extraClass .= " ";
        }
        $extraClass .= "last";
    }
    return $extraClass;
}
  

В вашем коде это выглядело бы так:

 <div class="news-entry news-entry-<?php echo $news_counter; ?><?php echo osu_first_last($wp_news_query); ?>">
  

Комментарии:

1. Спасибо за это. Вот моя функция, основанная на этом совете: function osu_first_last($total_posts, $posts_count) { if($posts_count == 0) { $class = ' first'; } elseif(($posts_count 1) == $total_posts) { $class = ' last'; } return $class; }

2. На самом деле, ваша функция выглядит лучше, так что я соглашусь с этим — еще раз спасибо!

Ответ №2:

С помощью count($wp_news_query->posts) вы должны получить количество сообщений / страниц, возвращаемых запросом. И с $wp_news_query->current_post вы получаете индекс текущего сообщения / страницы (таким образом, начиная с 0 …)