web-dev-qa-db-fra.com

Liste d'archives des publications par année de publication (plusieurs années)

J'ai une page d'archives montrant tous les articles du blog (dans une catégorie spécifique). Avec un nombre croissant de messages, je souhaite les séparer par année de publication. Par exemple (simplifié), je voudrais ce qui suit:

2012

  • poster
  • poster
  • poster

2011

  • poster

Je teste ce système en modifiant la date de publication de mon message le plus ancien à la mi-2011. Actuellement, la structure semble fonctionner pour la plupart, mais tous les postes sont publiés en 2012 et aucun en 2011, bien que la date de publication du plus ancien ait été fixée à 2011. Pour illustrer cela, je comprends:

2012

  • poster
  • poster
  • poster
  • post (2011 post)

2011


J'utilise le code ci-dessous (certains éléments supplémentaires ont été supprimés pour simplifier, mais cela n'affecte pas le résultat). Quelqu'un peut-il voir pourquoi l'ancien message apparaît en 2012 et non dans le <ul> de 2011? Merci de votre aide.

<?php global $query_string; query_posts($query_string . '&posts_per_page=-1'); // Show all posts ?>
<?php if (have_posts() {
if (is_category('210')) { ?>
<div class="archive-posts-box">
    <?php $firstyear = '2011';
    $currentyear = date('Y');
    $postyear = get_the_time('Y', $post->ID);
    for ($i = $currentyear; $i >= $firstyear; $i--) { ?>
            <h4><?php echo $i ?></h4>
            <ul class="archive-posts">
            <?php while (have_posts() && $postyear == $i) {
                the_post(); ?>
                <li><span class="archive-post-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></span><span class="archive-post-date"><?php the_time(get_option('date_format')); ?></span></li>
            <?php } // end while ?>
            </ul>
        <?php } // end for ?>        
</div><!-- .archive-posts-box -->
<?php } // end if (category)
} // end if (have_posts)
wp_reset_query() ?>
1
t-jam

À l’origine, j’avais l’impression que je croyais que ce qui se passait, c’est que la boucle n’est pas incrémentée tant que the_post n’exécute pas, de sorte que votre contrôle && $postyear == $i examine réellement le post précédent pas l'actuel. Vous devrez réorganiser ceci pour obtenir cette vérification après que la boucle soit incrémentée de the_post .

Cela dit, je ne pense pas avoir confiance en cette logique à un niveau encore plus profond. Vous définissez $postyear avant une boucle englobante ($postyear = get_the_time('Y', $post->ID);), de sorte qu'il n'est même pas affecté par ce qui se passe avec the_post . Ça m'inquiète.

Je sais que vous ne voulez pas tant de révision, mais pour ce que cela vaut, je pense que vous avez besoin de quelque chose de plus semblable à:

 $oldyear = $postyear = get_the_time('Y', $post->ID);?>
 <h4><?php echo $postyear; ?></h4>
    <ul class="archive-posts"><?php
    while (have_posts()) {
      the_post();
      $postyear = get_the_time('Y', $post->ID);
      if ($oldyear != $postyear) {
    $oldyear = $postyear; ?>
    </ul><h4><?php echo $postyear; ?></h4><ul class="archive-posts">
    <?php
      } ?>
    <li><span class="archive-post-title">
    <a href="<?php the_permalink(); ?>"><?php the_title(); ?>
    </a></span><span class="archive-post-date"><?php the_time(get_option('date_format')); ?></span></li><?php
    }
    echo '</ul>';
?>

Je vais bien, waaayy sur une branche avec ça. Il a à peine été testé, mais il devrait vous donner une idée.

0
s_ha_dum