Показать сообщения из категории по группам по годам

Я хочу показывать сообщения ссылок из категории по годам. Группа за годом, потому что по умолчанию 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>'; } ?> 

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

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

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

При размещении кода ваш код сильно нарушен. Из того, что я вижу, несколько query_posts() – это плохая идея в большинстве случаев. Пожалуйста, исправьте свой код, если хотите получить лучшую оценку.

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

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

Детали вашего вопроса непоследовательны. Вы должны прочитать вопрос вслух себе перед публикацией. Ваш кодовый блок также полностью сломан.

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

См. Статью codex для 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; 

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

  <?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 и действительно легко управляет стилями и т. Д. Надеюсь, это поможет кому-то, кто может захотеть увидеть различные решения для этого 🙂

Великая работа снова, на вашем языке. решение.