¿Está buscando una forma de mostrar una lista de archivos de meses bellamente formateada, separada por año? Si bien probablemente exista un plugin para esto, hemos creado un fragmento de código rápido que puede usar para mostrar archivos formateados por mes separados por año en WordPress.
Instrucciones:
Todo lo que tienes que hacer es agregar este código al archivo functions.php de tu tema o a un plugin específico del sitio:
function wp_custom_archive($args = '') {
global $wpdb, $wp_locale;
$defaults = array(
'limit' => '',
'format' => 'html', 'before' => '',
'after' => '', 'show_post_count' => false,
'echo' => 1
);
$r = wp_parse_args( $args, $defaults );
extract( $r, EXTR_SKIP );
if ( '' != $limit ) {
$limit = absint($limit);
$limit = ' LIMIT '.$limit;
}
// over-ride general date format ? 0 = no: use the date format set in Options, 1 = yes: over-ride
$archive_date_format_over_ride = 0;
// options for daily archive (only if you over-ride the general date format)
$archive_day_date_format = 'Y/m/d';
// options for weekly archive (only if you over-ride the general date format)
$archive_week_start_date_format = 'Y/m/d';
$archive_week_end_date_format = 'Y/m/d';
if ( !$archive_date_format_over_ride ) {
$archive_day_date_format = get_option('date_format');
$archive_week_start_date_format = get_option('date_format');
$archive_week_end_date_format = get_option('date_format');
}
//filters
$where = apply_filters('customarchives_where', "WHERE post_type = 'post' AND post_status = 'publish'", $r );
$join = apply_filters('customarchives_join', "", $r);
$output = '<ul>';
$query = "SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC $limit";
$key = md5($query);
$cache = wp_cache_get( 'wp_custom_archive' , 'general');
if ( !isset( $cache[ $key ] ) ) {
$arcresults = $wpdb->get_results($query);
$cache[ $key ] = $arcresults;
wp_cache_set( 'wp_custom_archive', $cache, 'general' );
} else {
$arcresults = $cache[ $key ];
}
if ( $arcresults ) {
$afterafter = $after;
foreach ( (array) $arcresults as $arcresult ) {
$url = get_month_link( $arcresult->year, $arcresult->month );
/* translators: 1: month name, 2: 4-digit year */
$text = sprintf(__('%s'), $wp_locale->get_month($arcresult->month));
$year_text = sprintf('<li>%d</li>', $arcresult->year);
if ( $show_post_count )
$after = ' ('.$arcresult->posts.')' . $afterafter;
$output .= ( $arcresult->year != $temp_year ) ? $year_text : '';
$output .= get_archives_link($url, $text, $format, $before, $after);
$temp_year = $arcresult->year;
}
}
$output .= '</ul>';
if ( $echo )
echo $output;
else
return $output;
}
Agregue este fragmento en su archivo index.php o en cualquier otro archivo de plantilla donde desee mostrar los archivos formateados.
<?php
wp_custom_archive();
?>
Nota: Si es la primera vez que agregas fragmentos de código en WordPress, consulta nuestra guía sobre cómo copiar / pegar fragmentos de código correctamente en WordPress, para que no rompas accidentalmente tu sitio.
Si te gustó este fragmento de código, considera echar un vistazo a nuestros otros artículos en el sitio como: los 9 mejores plugins de subastas para WordPress y cómo crear un formulario de envío de artículos de invitado en WordPress.
Gran trabajo, querido..
¿Puedes decirme cómo mostrar el recuento de publicaciones por meses?
Ahora mismo muestra los nombres de los meses
¿Cómo eliminar el mes reciente del año en estos plugins?
$temp_year no está definido 😉
¡Excelente código! ¡Muchas gracias, hombre!
¡De nada, me alegra haber podido ayudar!
¡Excelente código! ¡Muchas gracias, hombre!
¡Excelente código! ¡Muchas gracias, hombre!
Excelente código. Exactamente lo que estaba buscando. ¿Sabes, quizás, cómo refinarlo para que solo extraiga un tipo de publicación personalizado? *esperando con esperanza 🙂
post_type está definido aquí, "WHERE post_type = 'post'"
Este es un muy buen ejemplo. Gracias, ¿ahora es posible cargar los meses de una categoría específica?
Muy bonito. Genial. ¡Gracias!
Guau. Esa es una gran solución sin un plugin. Funciona perfecto. Gracias por el fragmento
Exactamente lo que necesitaba, esto debería estar integrado en el núcleo de WordPress, es muy bueno
Gran solución, gracias 🙂
Estimado Kevin,
Es difícil entender tu script. ¿Te gustaría adjuntarlo con una tabla en la base de datos MySql? Quizás sea más claro para mí porque soy nuevo en PHP. Gracias
Sé que esta es una publicación antigua. Pero, ¿hay alguna forma de especificar la categoría de la lista de archivos? Preferiblemente pasando el valor desde la etiqueta wp_custom_archive. Para que pueda poner varias listas de archivos en una página. Quiero una lista de archivos para la categoría 9 y una lista de archivos separada para la categoría 4. Para que la etiqueta sea algo como wp_custom_archive(‘9’) y wp_custom_archive(‘4’).
¿Alguna ayuda?
hhhmmm Hola John, existen muchos plugins de archivo que podrían ser una mejor solución cuando quieras ser tan detallado con tus archivos.
Si todavía te lo preguntas, he publicado código modificado arriba (29/05/2017) que permite filtrar por categoría.