it-swarm.com.de

Anzeigen von Post-Links aus einer Kategoriegruppe nach Jahr

Ich möchte die Links zu Beiträgen einer Kategoriegruppe nach Jahr anzeigen. Nach Jahr gruppieren, da standardmäßig WordPress das Datum für jeden Beitrag wiederholt. Ich versuche, einen Code zu verwenden, aber ich habe alle Beiträge im laufenden Jahr erhalten. Wie kann ich es tun? Beispiel, das ich machen möchte:

2010

  • post link 20
  • post link 19
  • post link 18
  • ...
  • post link 8

2009

  • post link 7
  • post link 6
  • ...

Der Code:

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

Ich habe diesen Originalcode auf Stack Overflow geschrieben, aber ich habe Ihre weiteren Antworten nicht gesehen, weil Sie sie als Antworten und nicht als Kommentare zu meiner Antwort gepostet haben. Ich habe den Code jetzt mit einer bestimmten Kategorie getestet und es funktioniert für mich, aber es bedarf einer entscheidenden Änderung: Der Aufruf von the_post() (den ich vollständig vergessen habe) muss genau zu Beginn der while ( have_posts() )-Schleife erfolgen, da sonst das Jahr immer verzögert wird ein Beitrag dahinter. Ich habe das in der ursprünglichen Antwort korrigiert.

Wenn Sie für Ihre Abfrage mehrere Kriterien angeben möchten, müssen Sie diese im selben Funktionsaufruf kombinieren. Also nicht query_posts('cat=27'); query_posts('nopaging=1');, sondern query_posts('cat=27&nopaging=1'). Sie können auch das Array-Format verwenden (wie in meinem ursprünglichen Beispiel). Ich bevorzuge dies aus Gründen der Lesbarkeit.

Eine letzte Änderung: Wenn dies nicht die Hauptschleife Ihrer Seite ist (und ich vermute, dass dieser Code in einer Seitenleiste endet, also nicht die Hauptschleife), [ist es besser, query_posts()][2] nicht zu verwenden. Versuchen Sie stattdessen get_posts() und verwenden Sie das Ergebnis davon. Ich wusste das nicht, als ich die ursprüngliche Antwort schrieb, aber das Herumhängen auf dieser Site lernt Sie viel!

1
Jan Fabry

Ihr Code ist beim Posten sehr kaputt gegangen. Nach allem, was ich sehe, sind mehrere query_posts() in den meisten Fällen eine schlechte Idee. Bitte korrigieren Sie Ihren Code, wenn Sie eine bessere Bewertung wünschen.

Persönlich würde ich dafür das Plugin verwenden, es gibt eine Menge exzellenter Archiv-Plugins. Ich spiele zurzeit mit Smart Archives Reloaded . Es ermöglicht das einfache Abrufen von Beiträgen nach Monat/Jahr in einer bestimmten Kategorie:

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

0
Rarst

Was Sie haben, scheint gut zu funktionieren. Da ich hier nach Lösungen für eine andere Frage gesucht habe, die ich gestellt habe und auf diese gestoßen bin, dachte ich, ich würde hinzufügen, wie ich dies auf einer meiner Websites erreicht habe:

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

Dies eliminiert mehrere query_posts-Aufrufe und ist wirklich einfach zu steuern, Styling, etc. Ich hoffe, dies hilft jemandem, der verschiedene Lösungen für dieses Problem sehen möchte :)

Wieder großartige Arbeit, über deinen Ursprung. Lösung.

0
revive

Die Details Ihrer Frage sind inkohärent. Sie sollten die Frage vor dem Posten vorlesen. Dein Codeblock ist auch total kaputt.

Das heißt, die Antwort ist ziemlich einfach. Sie müssen eine Posts-Abfrage ausführen, die sowohl die Kategorie- als auch die Jahreswerte enthält (sowie Ihr Nopaging, das am besten mit posts_per_page = -1 durchgeführt wird).

Im Codex-Artikel für query_posts () finden Sie ausführliche Informationen zu den Parametern, die Sie an das neue WP_Query () übergeben können.

Hier ist der Code für Ihre Frage:

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