web-dev-qa-db-ja.com

カテゴリーグループからの投稿リンクを年ごとに表示する

カテゴリグループからの投稿リンクを年ごとに表示したい。デフォルトではワードプレスでグループ化されているため、各投稿の日付を繰り返します。私はコードを使用しようとしますが、私は今年中にすべての投稿を得ました。どうすればいいの?私がやりたい例:

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>';

}

?>
2
Henrique Barone

Stack Overflowの元のコード を書きましたが、私の回答に対するコメントとしてではなく回答として投稿したので、それ以上の返信は見ませんでした。特定のカテゴリでコードをテストしましたが、動作しますが、1つの重要な変更が必要です。the_post()(完全に忘れていました)への呼び出しは、while ( have_posts() )の最初に来る必要がありますそうでない場合、年は常に1投稿遅れます。元の回答でそれを修正しました。

クエリに複数の条件を指定する場合は、同じ関数呼び出しでそれらを結合する必要があります。 query_posts('cat=27'); query_posts('nopaging=1');ではなく、query_posts('cat=27&nopaging=1')です。また、配列形式(元の例のように)を使用することもできますが、読みやすくするためにそれを好みます。

最後の変更点:これがページのメインループでない場合(このコードはメインループではなく、サイドバーで終わると思われる場合)、[query_posts()][2]を使用しない方が良いです。代わりに、get_posts()を試して、その結果を使用してください。元の答えを書いたとき、私はこれを知りませんでしたが、このサイトでぶらぶらすることは多くを学びます!

1
Jan Fabry

あなたのコードは投稿時に非常に壊れてしまいました。私が複数のquery_posts()を見ることができることから、ほとんどの場合悪い考えです。より良い評価が必要な場合は、コードを修正してください。

個人的には私はこれにプラグインを使用するでしょう、周りにたくさんの優れたアーカイブプラグインがあります。私は現在 Smart Archives Reloaded で遊んでいます。それは簡単に特定のカテゴリの月/年で投稿を取得することができます:

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

0
Rarst

私がここに投稿してこの問題に出くわした別の質問に対する解決策を探しているので、私は自分のサイトの1つでこれを達成する方法を追加したいと思いました。

            <?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
revive

あなたの質問の詳細は首尾一貫していません。投稿する前に質問を自分で声に出して読んでください。あなたのコードブロックも完全に壊れています。

それは答えがかなり簡単であると言った。あなたはカテゴリーと年の両方の値を与えるpostsクエリを実行する必要があります(あなたのnopagingと同様に、これはposts_per_page = -1で最もよくされます)

新しいWP_Query()に渡すことができるパラメータの詳細については、 query_posts()のコーデックス記事 を参照してください。

これがあなたの質問に対するコードです:

/**
 * 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
jerclarke