2

Ordena tus archivos por año y meses

Uno de los ‘problemas’ que me encontré a la hora de programar la sección del menu de archivos es la forma que tiene WordPress de listarlos, lo que se solucionaría simplemente haciendo una llamada a wp_get_archives() pasándole como argumento como lo queremos mostrar (anual, mensual, día) no termino de convencerme ya que al mostrarlos archivos de forma anual sólo tendría los años y de forma mensual obtendría todos los meses junto a su año lo cual quedaría un tanto ‘feo’ e interminable a la par que los meses fueran avanzando y las mismas entradas, la idea que expongo ahora es para hacerlo de forma anidada y más ordenado de cara al usuario a la par que añadimos soporte en español porque por desgracia WordPress aún no soporta idiomas en funciones, sólo lo hace en el estándar, el inglés en este caso, por lo que pasaré a poneros el código y explicar un poco como lo he hecho:

 

<li>
<a href="#"><span>Archivo</span></a>
<ul>
<?php $years = get_archives_years()  // Establecemos una llamada a una función customizada para coger los años
foreach($years as $year) : ?> // Recorremos tantos años como tengamos
<li>
<a href="<?php echo bloginfo(url) . '/' . $year . '/'; ?>"><?php echo $year; ?></a>   // Realizamos un submenú por cada año y lo enlazamos a su correspondiente archivo
<ul>
<?php $months = get_archives_monthlys($year) // Realizamos otro submenú que herede de su correspondiente año pasándole como argumento el año para obtener sus meses
foreach($months as $month) : ?>
<li>
<a href="<?php echo bloginfo(url) . '/' . $year . '/' . $month . '/'; ?>"><?php echo GetMonthName($month); ?></a>  // Lo mismo que en años sólo que esta vez realizaremos una llamada a otra función customizada para obtener los nombres en español de los meses
</li>
<?php endforeach; ?>
</ul>
</li>
<?php endforeach; ?>
</ul>
</li>

 

function get_archives_years(){

return $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts ORDER BY YEAR(post_date) ASC");

// Realizamos una consulta de todas los años de las entradas y las ordenamos de forma ascendente

}

 

function get_archives_monthlys($year){

return $wpdb->get_col("SELECT DISTINCT MONTH(post_date) FROM $wpdb->posts  WHERE YEAR(post_date) = '$year' ORDER BY MONTH(post_date) ASC");

// Realizamos una consulta de todos los meses de las entradas de un año en concreto pasado como argumento

}

 

function GetMonthName($n)
{

// Pasándole como argumento el cardinal del año con un simple switch retornaremos el nombre del mes en español
switch ($n) {
case 1:
$mes = "Enero";
break;
case 2:
$mes = "Febrero";
break;
case 3:
$mes = "Marzo";
break;
case 4:
$mes = "Abril";
break;
case 5:
$mes = "Mayo";
break;
case 6:
$mes = "Junio";
break;
case 7:
$mes = "Julio";
break;
case 8:
$mes = "Agosto";
break;
case 9:
$mes = "Septiembre";
break;
case 10:
$mes = "Octubre";
break;
case 11:
$mes = "Noviembre";
break;
case 12:
$mes = "Diciembre";
break;

}

return $mes;
}

 

Y esta sería la solución, sólo basta con copiar las funciones en vuestro archivo functions.php o el que tengáis por defecto y copiar el menú dónde queráis colocarlo, para cualquier duda no duden en dejar un comentario.

Tone

Ingeniero del Software y procrastinador sin remedio, interesado en todo lo que tenga que ver con el mundo del desarrollo web y la inteligencia artificial, no sé si seré el responsable de la creación de Skynet algún día pero se intenta.

2 Comentarios
  1. Miguel

    Hola buenas, estoy probando esto y me salta un error en la primera parte del codigo, linea:

    foreach($years as $year) : ?> // Recorremos tantos años como tengamos

    Responder
    • Tone

      Perdona la tardanza, ¿Podrías ser más específico con el error que te da? De todas formas creo que ha habido una actualización del highlighter pro y ha desordenado un poco la sintaxis del código.

      Saludos!

      Responder
ESCRIBIR UN COMENTARIO
  • (will not be published)

XHTML: Puedes usar estas etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>