henriquebarone
  • 0
Новичок

Отображение ссылок на записи из группы категорий по годам

  • 0

Я хочу отображать ссылки на сообщения из группы категорий по годам. Сгруппируйте по годам, потому что WordPress по умолчанию повторяет дату для каждого сообщения. Я пытаюсь использовать код, но я получил все сообщения в текущем году. Как мне это сделать? Пример, который я хочу сделать:

2010

  • киньте ссылку 20
  • киньте ссылку 19
  • киньте ссылку 18
  • киньте ссылку 8

2009 г.

  • киньте ссылку 7
  • киньте ссылку 6

Код:

<?php
query_posts(array('nopaging' => 1, /* desabilitar a paginacao pata obter todos os pots. O padrao e ordenado pela data */));
$prev_year = null;

query_posts('cat=27');

if ( have_posts() ) {
   while ( have_posts() ) {
      $this_year = get_the_date('Y');
      if ($prev_year != $this_year) {
          // Year boundary
          if (!is_null($prev_year)) {
             // A list is already open, close it first
             echo '</ul>';
          }
          echo '<h2 class="titulo-conteudo">'. $this_year . '</h2>';
   echo '<div class="barra-amarela-4"></div>';
              echo '<ul>';
          }
      echo '<li>';

      // Imprimi o link do post.
  the_post(); ?>

                <div class="entry">
  <h2 id="post-<?php the_ID(); ?>">
  <a href="<?php the_permalink(the_title()) ?>"><?php the_title(); ?></a></h2>


  </div>  

<?php 

      echo '</li>';
      $prev_year = $this_year;

   }
   echo '</ul>';

}

?>
Share
  1. Я написал этот исходный код на Stack Overflow, но я не видел ваших дальнейших ответов, потому что вы разместили их как ответы, а не как комментарии к моему ответу. Я протестировал код сейчас с определенной категорией, и он работает для меня, но он нуждается в одном важном изменении: вызов the_post() (о котором я совсем забыл) должен поступать прямо в начало while ( have_posts() ) цикла, иначе год всегда будет отставать на один пост. позади. Я исправил это в исходном ответе.

    Если вы хотите указать несколько критериев для своего запроса, вы должны объединить их в одном вызове функции. Так что не query_posts('cat=27'); query_posts('nopaging=1');, а query_posts('cat=27&nopaging=1') . Вы также можете использовать формат массива (как в моем исходном примере), я предпочитаю его для удобства чтения.

    Последнее изменение: если это не основной цикл вашей страницы (и я подозреваю, что этот код окажется на боковой панели, а не в основном цикле), [лучше не использовать query_posts()][2] . Вместо этого попробуйте get_posts() использовать результат этого. Я не знал этого, когда писал исходный ответ, но зависание на этом сайте многому вас учит!

    • 0
  2. То, что у вас есть, выглядит хорошо. Поскольку я был здесь в поисках решения другого вопроса, который я разместил, и наткнулся на этот, я подумал, что добавлю, как я это сделал, на одном из моих сайтов:

                <?php query_posts('posts_per_page=-1&category_name=podcasts');
                $dates_array            = Array();
                $year_array             = Array();
                $i                      = 0;
                $prev_post_ts           = null;
                $prev_post_year         = null;
                $distance_multiplier    =  9;
            ?>
    
            <div class="post">
    
                <!--h2 class="title">< ? php the_title(); ?></h2-->
    
                <div id="archives" class="entry">   
                <?php while (have_posts()) : the_post();
    
                    $post_ts    =  strtotime($post->post_date);
                    $post_year  =  get_the_date('Y');
    
    
                    /* Handle the first year as a special case */
                    if ( is_null( $prev_post_year ) ) {
                        ?>
                        <h3 class="archive_year"><?=$post_year?></h3>
                        <ul class="archives_list">
                        <?php
                    }
                    else if ( $prev_post_year != $post_year ) {
                        /* Close off the OL */
                        ?>
                        </ul>
                        <?php
    
                        $working_year  =  $prev_post_year;
    
                        /* Print year headings until we reach the post year */
                        while ( $working_year > $post_year ) {
                            $working_year--;
                            ?>
                            <h3 class="archive_year"><?=$working_year?></h3>
                            <?php
                        }
    
                        /* Open a new ordered list */
                        ?>
                        <ul class="archives_list">
                        <?php
                    }
    
                    /* Compute difference in days */
                    if ( ! is_null( $prev_post_ts ) && $prev_post_year == $post_year ) {
                        $dates_diff  =  ( date( 'z', $prev_post_ts ) - date( 'z', $post_ts ) ) * $distance_multiplier;
                    }
                    else {
                        $dates_diff  =  0;
                    }
                ?>
                    <li>
                        <span class="date"><?php the_time('F j'); ?><sup><?php the_time('S') ?></sup></span> 
                        <span class="linked"><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></span> 
                        <span class="comments"><?php comments_popup_link(__('0 comments', 'warp'), __('1 comment', 'warp'), __('% comments', 'warp')); ?></span> 
                    </li>
                <?php
                    /* For subsequent iterations */
                    $prev_post_ts    =  $post_ts;
                    $prev_post_year  =  $post_year;
                endwhile;
    
                /* If we've processed at least *one* post, close the ordered list */
                if ( ! is_null( $prev_post_ts ) ) {
                    ?>
                </ul>
                <?php } ?>
    
                </div><!--entry-->
    
                </div><!--post-->   
    

    Это устраняет несколько вызовов query_posts и действительно легко контролирует стиль и т. Д. Надеюсь, это поможет кому-то, кто может захотеть увидеть различные решения для этого 🙂

    Отличная работа снова, на вашем ориг. решение.

    • 0
  3. Вам нужно запустить запрос сообщений, который дает значения как категории, так и года (а также вашего отсутствия разбиения на страницы, что лучше всего сделать с posts_per_page=-1)

    См. статью кодекса для query_posts() для получения полной информации о параметрах, которые вы можете передать в новый WP_Query().

    Вот код вашего вопроса:

    /**
     * Run a query for a specific category (cat=$cat_id) and year (&y=2008)
     * Also turn off the paging by setting posts_per_page to -1
     */
    $year_and_category_query = new WP_Query("cat=$cat_id&year=2007&posts_per_page=-1");
    
    /**
     * Run the loop on your new query
     */
    while ($year_and_category_query->have_posts()) : $year_and_category_query->the_post();
        // Use the post with functions like the_title, or use the now global $post
    endwhile;
    
    • 0
  4. Ваш код сильно сломался при публикации. Из того, что я вижу query_posts(), в большинстве случаев несколько — плохая идея. Пожалуйста, исправьте свой код, если вы хотите получить лучшую оценку.

    Лично я бы использовал плагин для этого, есть много отличных плагинов для архивов. Сейчас я играю в Smart Archives Reloaded. Это позволяет легко получать посты по месяцам/годам в определенной категории:

    smart_archives( array( 'format' => 'list', 'include_cat' => 27 ));

    • 0

Оставить ответ

You must login to add an answer.