Are you looking for a way to display a beautifully formatted archives list of months separated by year? While there’s probably a plugin for this, we have created a quick code snippet that you can use to display formatted archives by month separated by year in WordPress.
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
;
}
$archive_date_format_over_ride
= 0;
$archive_day_date_format
=
'Y/m/d'
;
$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'
);
}
$where
= apply_filters(
'customarchives_where'
,
"WHERE post_type = 'post' AND post_status = 'publish'"
,
$r
);
$join
= apply_filters(
'customarchives_join'
,
""
,
$r
);
$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 );
$text
= sprintf(__(
'%s'
),
$wp_locale
->get_month(
$arcresult
->month));
$year_text
= sprintf(
'
‘,
$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;
}
}
if
(
$echo
)
echo
$output
;
else
return
$output
;
}
Add this snippet in your index.php file or any other template file where you want to display the formatted archives.