web-dev-qa-db-fra.com

Afficher les liens de messages d'un groupe de catégories par année

Je souhaite afficher les liens de messages d'un groupe de catégories par année. Groupe par année, car par défaut wordpress, répétez la date pour chaque message. J'essaie d'utiliser un code, mais j'ai tous les messages de l'année en cours. Comment puis-je le faire? Exemple que je veux faire:

2010

  • poster un lien 20
  • poster un lien 19
  • poster un lien 18
  • ...
  • poster un lien 8

2009

  • poster un lien 7
  • poster un lien 6
  • ...

Le 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

J'ai écrit ce code original sur Stack Overflow , mais je n'ai pas vu vos réponses ultérieures car vous les avez postées en tant que réponses et non en tant que commentaires à ma réponse. J'ai testé le code maintenant avec une catégorie spécifique et cela fonctionne pour moi, mais il nécessite un changement crucial: l'appel à the_post() (que j'ai complètement oublié) doit arriver dès le début de la boucle while ( have_posts() ), sinon l'année sera toujours en retard un poste derrière. J'ai corrigé cela dans la réponse initiale.

Si vous souhaitez spécifier plusieurs critères pour votre requête, vous devez les combiner dans le même appel de fonction. Donc, pas query_posts('cat=27'); query_posts('nopaging=1');, mais query_posts('cat=27&nopaging=1'). Vous pouvez également utiliser le format tableau (comme dans mon exemple d'origine), je préfère cela pour la lisibilité.

Un dernier changement: s'il ne s'agit pas de la boucle principale de votre page (et je suppose que ce code aboutira dans une barre latérale, donc pas de la boucle principale), [il est préférable de ne pas utiliser query_posts()][2]. Essayez plutôt get_posts() et utilisez le résultat. Je ne le savais pas quand j'ai écrit la réponse originale, mais traîner sur ce site vous en apprend beaucoup!

1
Jan Fabry

Votre code s'est très cassé quand posté. D'après ce que je peux voir, plusieurs query_posts() sont une mauvaise idée dans la plupart des cas. Veuillez corriger votre code si vous souhaitez une meilleure évaluation.

Personnellement, j'utiliserais un plugin pour cela, il y a plein d'excellents plugins d'archives. Je joue actuellement avec Smart Archives Reloaded . Il permet facilement d’obtenir des articles par mois/année dans une catégorie spécifique:

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

0
Rarst

Ce que vous avez semble bien fonctionner. Puisque je cherchais ici des solutions à une autre question que j’avais posée et que j’ai rencontré celle-ci, j’ai pensé ajouter la façon dont j’ai accompli cela dans un de mes sites:

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

Cela élimine les appels multiples à query_posts et permet de contrôler facilement le style, etc. J'espère que cela aidera quelqu'un qui voudra peut-être voir différentes solutions à cela :)

Encore du bon travail, sur ton origine. Solution.

0
revive

Les détails de votre question sont incohérents. Vous devriez lire la question à voix haute avant de poster. Votre bloc de code est également totalement cassé.

Cela dit, la réponse est assez simple. Vous devez exécuter une requête posts qui donne à la fois les valeurs de catégorie et d’année (ainsi que votre nopaging, ce qui est mieux réalisé avec posts_per_page = -1).

Voir l'article codex pour query_posts () pour plus de détails sur les paramètres que vous pouvez passer dans le nouveau WP_Query ().

Voici le code de votre question:

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