WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Am trying to use this code:

function wp_custom_archive($args = '') {
        global $wpdb, $wp_locale;

        $defaults = array(
            'cat' => 6, //doing nothing
            'format' => 'html',
            'show_post_count' => true,
            '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');

        $where = apply_filters('customarchives_where', "WHERE post_type = 'post' AND post_status = 'publish' AND ", $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 ];

            /*echo '<pre>';
            echo '</pre>';*/

            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 = '&nbsp;('.$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;
            return $output;

from this post to display archives by year and month with a category parameter but without any luck so far.

When i change the show_post_count value to false it doesn work well, but nothing happens when i add a category parameter as seen here. I've also tried with tags and custom fields, nothing works.

I've checked the wp_parse_args function and it seems to accept normal parameters such as wp_query.

Any clue?

share|improve this question

Update 3/5:

When I originally answered this question I didn't realize that your code was almost an exact copy of the wp_get_archives function. There is nothing in your code or the original wp_get_archives code that supports categories. The function was written to get date archives and your defaults are missing the type, limit, before and after arguments.

If you want to build categories into this function you will need to write your own where and join filter clauses.

Source: wp-includes/general-template.php

 * Display archive links based on type and format.
 * The 'type' argument offers a few choices and by default will display monthly
 * archive links. The other options for values are 'daily', 'weekly', 'monthly',
 * 'yearly', 'postbypost' or 'alpha'. Both 'postbypost' and 'alpha' display the
 * same archive link list, the difference between the two is that 'alpha'
 * will order by post title and 'postbypost' will order by post date.
 * The date archives will logically display dates with links to the archive post
 * page. The 'postbypost' and 'alpha' values for 'type' argument will display
 * the post titles.
 * The 'limit' argument will only display a limited amount of links, specified
 * by the 'limit' integer value. By default, there is no limit. The
 * 'show_post_count' argument will show how many posts are within the archive.
 * By default, the 'show_post_count' argument is set to false.
 * For the 'format', 'before', and 'after' arguments, see {@link
 * get_archives_link()}. The values of these arguments have to do with that
 * function.
 * @since 1.2.0
 * @param string|array $args Optional. Override defaults.
function wp_get_archives($args = '') {
    global $wpdb, $wp_locale;

    $defaults = array(
        'type' => 'monthly', 'limit' => '',
        'format' => 'html', 'before' => '',
        'after' => '', 'show_post_count' => false,
        'echo' => 1
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.