it-swarm-es.com

Mostrar enlaces de publicaciones de un grupo de categorías por año

Quiero mostrar los enlaces de las publicaciones de un grupo de categorías por año. Agrupar por año, por defecto, wordpress repite la fecha de cada publicación. Intento usar un código pero obtuve todos los mensajes en el año actual. ¿Cómo puedo hacerlo? Ejemplo que quiero hacer:

2010

  • publicar enlace 20
  • publicar enlace 19
  • publicar enlace 18
  • ...
  • publicar enlace 8

2009

  • publicar enlace 7
  • publicar enlace 6
  • ...

El código:

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

Escribí ese código original en Stack Overflow , pero no vi tus respuestas adicionales porque las publicaste como respuestas y no como comentarios a mi respuesta. He probado el código ahora con una categoría específica y funciona para mí, pero necesita un cambio crucial: la llamada a the_post() (que olvidé por completo) debe realizarse justo al comienzo del bucle while ( have_posts() ), de lo contrario, el año siempre se retrasará un post detrás Lo he corregido en la respuesta original.

Si desea especificar varios criterios para su consulta, debe combinarlos en la misma llamada de función. Entonces no query_posts('cat=27'); query_posts('nopaging=1');, sino query_posts('cat=27&nopaging=1'). También puede utilizar el formato de matriz (como en mi ejemplo original), prefiero que para facilitar la lectura.

Un último cambio: si este no es el bucle principal de su página (y sospecho que este código terminará en una barra lateral, así que no el bucle principal), [es mejor no usar query_posts()][2]. En su lugar, intente get_posts() y use el resultado de eso. No sabía esto cuando escribí la respuesta original, ¡pero andar por ahí en este sitio te aprende mucho!

1
Jan Fabry

Su código se rompió mucho cuando se publicó. Por lo que puedo ver, varias funciones query_posts() son una mala idea en la mayoría de los casos. Por favor, corrija su código si desea una mejor evaluación.

Personalmente usaría un complemento para esto, hay muchos excelentes complementos de archivo. Actualmente juego con Smart Archives Reloaded . Permite obtener fácilmente publicaciones por mes/año en una categoría específica:

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

0
Rarst

Lo que parece que funciona bien ... Ya que estaba aquí buscando soluciones a otra pregunta que publiqué y encontré esta, pensé que agregaría cómo logré esto en uno de mis sitios:

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

Esto elimina múltiples llamadas a query_posts y es realmente fácil de controlar el estilo, etc. Espero que esto ayude a alguien que quiera ver varias soluciones para esto :)

Gran trabajo de nuevo, en su origen. solución.

0
revive

Los detalles de tu pregunta son incoherentes. Deberías leer la pregunta en voz alta antes de publicar. Tu bloque de código también está totalmente roto.

Dicho esto, la respuesta es bastante simple. Debe ejecutar una consulta de publicaciones que proporcione los valores de categoría y año (así como su nopaging, que se realiza mejor con posts_per_page = -1)

Consulte el artículo codex para query_posts () para obtener detalles completos sobre los parámetros previos que puede pasar a WP_Query ().

Aquí está el código para su pregunta:

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