List monthy archives for specific year with wp_get_archives

The year, monthnum, day and w (week) parameters are only used to highlight/pre-select the current item in the list/output and they only take effect on an archive page like date and category archives. And by “highlight”, I mean WordPress will add either selected='selected' (if the format is option) or aria-current="page" (for other format than link) to the output. Something like this (note the selected attribute):

// Assume $results contains database's rows (row objects).
// And '2018' is in the $args you pass to wp_get_archives().
$output="";
foreach ( $results as $row ) {
    if ( is_archive() && '2018' === $row->year ) {
        $output .= '<option value="2018" selected>2018</option>';
    } else {
        $output .= '<option value="2018">2018</option>';
    }
}

Try the following and visit any archive pages, and you’d see the year 2018 option is pre-selected:

$my_archives="<select>" . wp_get_archives( array(
    'type'   => 'yearly',
    'limit'  => 10,
    'echo'   => 0,
    'year'   => '2018',
    'format' => 'option', // this outputs an <option>
) ) . '</select>';

Other examples below, assuming there’s a (public) post on November 1, 2018:

And that you’re on an archive page — on other pages like single posts, those four parameters (year, monthnum, day and w) default to the ones in the main query.

  1. When format is monthly, November 2018 would be pre-selected:

    $my_archives="<select>" . wp_get_archives( array(
        'type'     => 'monthly',
        'limit'    => 10,
        'echo'     => 0,
        'year'     => '2018',
        'format'   => 'option',
        'monthnum' => 11,
    ) ) . '</select>';
    
  2. When format is weekly, October 29, 2018–November 4, 2018 (week 44th in 2018) would be pre-selected:

    $my_archives="<select>" . wp_get_archives( array(
        'type'   => 'weekly',
        'limit'  => 10,
        'echo'   => 0,
        'year'   => '2018',
        'format' => 'option',
        'w'      => 44,
    ) ) . '</select>';
    
  3. When format is daily, November 1, 2018 would be pre-selected:

    $my_archives="<select>" . wp_get_archives( array(
        'type'     => 'daily',
        'limit'    => 10,
        'echo'     => 0,
        'year'     => '2018',
        'format'   => 'option',
        'monthnum' => 11,
        'day'      => 1,
    ) ) . '</select>';
    

So that year parameter won’t give you the results you’re wanting to have; however, it is possible to achieve the results using the getarchives_where hook in combination with a custom parameter, like so:

  1. This should go in the theme’s functions.php file:

    add_filter( 'getarchives_where', function ( $where, $parsed_args ) {
        if ( ! empty( $parsed_args['in_year'] ) ) {
            $year = absint( $parsed_args['in_year'] );
            $where .= " AND YEAR(post_date) = $year";
        }
        return $where;
    }, 10, 2 );
    
  2. Then when you call wp_get_archives(), simply use the in_year parameter to include only the archives for a specific year: (* You can change the parameter name, but also change it above.)

    $my_archives = wp_get_archives( array(
        'type'    => 'monthly', 
        'limit'   => 10,
        'echo'    => 0,
        'in_year' => '2018', // custom parameter
    ) );
    

    But you can still use the standard year parameter to highlight/pre-select the relevant item.