it-swarm-pt.tech

Mostrar links de posts de um grupo de categorias por ano

Quero exibir links de posts de um grupo de categorias por ano. Agrupar por ano, por padrão wordpress repetir a data para cada post. Eu tento usar um código, mas eu tenho todas as postagens no ano atual. Como eu posso fazer isso? Exemplo eu quero fazer:

2010

  • postar link 20
  • postar link 19
  • postar link 18
  • ...
  • postar link 8

2009

  • postar link 7
  • postar link 6
  • ...

O 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

Escrevi o código original no Stack Overflow , mas não vi as suas respostas adicionais porque as publicou como respostas e não como comentários à minha resposta. Eu testei o código agora com uma categoria específica e funciona para mim, mas ele precisa de uma mudança crucial: a chamada para the_post() (que eu esqueci completamente) deve vir logo no início do loop while ( have_posts() ), caso contrário o ano sempre atrasará um post atrás. Eu corrigi isso na resposta original.

Se você quiser especificar vários critérios para sua consulta, você deve combiná-los na mesma chamada de função. Então não query_posts('cat=27'); query_posts('nopaging=1');, mas query_posts('cat=27&nopaging=1'). Você também pode usar o formato de matriz (como no meu exemplo original), eu prefiro isso para legibilidade.

Uma última mudança: se este não é o loop principal da sua página (e eu suspeito que este código irá acabar em uma barra lateral, então não é o loop principal), [é melhor não usar query_posts()][2]. Em vez disso, tente get_posts() e use o resultado disso. Eu não sabia disso quando escrevi a resposta original, mas ficar por aqui neste site aprende muito!

1
Jan Fabry

Seu código ficou muito quebrado quando postado. Pelo que posso ver, vários query_posts() são má ideia na maioria dos casos. Por favor, corrija seu código se você quiser uma melhor avaliação.

Pessoalmente eu usaria o plugin para isso, há uma abundância de excelentes plugins de arquivo ao redor. Eu atualmente jogo com Smart Archives Reloaded . Permite facilmente obter postagens por mês/ano em categoria específica:

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

0
Rarst

O que você tem parece funcionar bem ... Desde que eu estava aqui procurando soluções para outra pergunta que publiquei e encontrei essa, pensei em adicionar como consegui isso em um dos meus 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-->   

Isso elimina várias chamadas query_posts e é realmente fácil de controlar o estilo, etc. Espero que isso ajude alguém que pode ser queria ver várias soluções para isso :)

Ótimo trabalho de novo, no seu orig. solução.

0
revive

Os detalhes da sua pergunta são incoerentes. Você deve ler a pergunta em voz alta para si mesmo antes de postar. Seu bloco de código também está totalmente quebrado.

Dito isto, a resposta é bastante simples. Você precisa executar uma consulta de postagens que forneça os valores de categoria e ano (assim como seu nopaging, o que é melhor feito com posts_per_page = -1)

Veja o artigo codex para query_posts () para detalhes completos sobre os parâmetros que você pode passar para o novo WP_Query ().

Aqui está o código da sua pergunta:

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