Existe una función en WordPress, wp_get_archives(), que al ser invocada crea un archivo cronológico de los contenidos de la página; el formato es un listado de enlaces a los diferentes años, meses o días, en función de los parámetros que proporcionemos a la función. Lo que no existe es una función que limite este listado de enlaces cronológicos a una categoría. Con el siguiente código podemos obtener un archivo cronológico de una categoría, con acceso anual y mensual a los contenidos.
Hay que tener en cuenta que el siguiente ejemplo está pensado para funcionar en la página de archivo de una categoría, así que se obtiene la información necesaria de la categoría (ID, nombre…) mediante de la query actual mediante get_query_var().
// definimos variables generales $monthsName = array( "0","Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"); $months = array(12,11,10,9,8,7,6,5,4,3,2,1); // definimos variables de la categoría // en este ejemplo la categoría actual $cat = get_query_var('cat'); // ID $cat_slug = get_query_var('category_name'); // slug $cat_name = get_cat_name($cat); // nombre // averiguamos cuándo se publicó el primer contenido de la categoría // para saber dónde comenzar el listado $args = array( 'numberposts' => -1, 'category' => $cat, 'orderby' => 'post_date', 'order' => 'DESC' ); $current_cat_posts = get_posts( $args ); $count = 1; while ( $count == '1' ) { foreach ( $current_cat_posts as $post ) { setup_postdata($post); $cat_first_year = get_the_date('Y'); $cat_first_month = get_the_date('n'); } $count++; } wp_reset_query(); // encabezado del listado $cabeza_out = " <header> <h1>$cat_name</h1> </header> <nav> <ul> "; echo $cabeza_out; // variables para conocer la fecha actual // y por lo tanto uno de los dos límites del listado $currentY = date('Y'); $currentM = date('n'); $year = $currentY; // iniciamos loop que se ejecutará mientras el año actual sea // mayor o igual que el año en el que se publicó // el primer contenido de la categoría while ( $year >= $cat_first_year ) : // primer caso: si el año de esta vuelta del loop es // mayor que el de la categoría if ( $year > $cat_first_year ) : // código para enlace anual $year_out = " <li><a href='/$cat_slug/$year' title='Archivo de $cat_name para el $year'>$year</a></li> <ul><!-- inicio sublista meses --> "; echo $year_out; // iniciamos loop para el listado mensual foreach ( $months as $month ) : if ( $month <= $currentM ) : $month_out = " <li><a href='/$cat_slug/$year/$month' title='Archivo de $cat_name para el mes $month de $year'>$monthsName[$month]</a></li> "; echo $month_out; endif; endforeach; // pasamos al siguiente año $year--; // segundo caso: si el año del loop es el mismo que el de la categoría elseif ( $year == $cat_first_year ) : $year_out = " <li><a href='/$cat_slug/$year' title='Archivo de $cat_name para el $year'>$year</a></li> "; echo $year_out; // iniciamos loop para el listado mensual foreach ( $months as $month ) : if ( $month >= $cat_first_month ) { $month_out = " <li><a href='/$cat_slug/$year/$month' title='Archivo de $cat_name para el mes $month de $year'>$monthsName[$month]</a></li> "; echo $month_out; } endforeach; $year--; endif; endwhile; // cerramos el listado $epi_out = " </ul> </nav> "; echo $epi_out;