when i run the following code.

$args = array(
    'type'            => 'monthly',
    'limit'           => '',
    'format'          => 'option', 
    'before'          => '',
    'after'           => '',
    'show_post_count' => false,
    'echo'            => 1,
    'order'           => 'DESC',
    'post_type'     => 'post'
<option value=""> Select </option>
    wp_get_archives( $args ); 
?>  </select>

I got this output

<option> Select </option>
    <option value="http://test.astech-us.com/holistichivorce/2016/03/"> March 2016 </option>
<option value="http://test.astech-us.com/holistichivorce/2016/02/"> February 2016 </option></select>

but i need output like WordPress back end filter option. like this

    <select name="m" id="filter-by-date"><option selected="selected" value="0">All dates</option><option value="201603">March 2016</option><option value="201602">February 2016</option></select>


2 Answers 2


wp_get_archives creates its links with the function get_archives_link. this function returns plain HTML, but it has a filter you can hook into.

You can use the get_archives_link filter to manipulate your HTML with some regex.

function my_archives_link($link_html) {
    //TODO: my regex to manipulate the HTML
    return $link_html;


Further reading


To create a dropdown filter for posts by month in the front end similar to wp backend, you can use the wp_dropdown_categories() function with a custom taxonomy query to achieve the desired output

<select name="filter-by-date" id="filter-by-date">
    <option selected="selected" value="0">All dates</option>
    global $wpdb;
    $months = $wpdb->get_results("
        SELECT DISTINCT YEAR(post_date) AS year, MONTH(post_date) AS month
        FROM $wpdb->posts
        WHERE post_type = 'post' AND post_status = 'publish'
        ORDER BY post_date DESC
    foreach ($months as $month) {
        $value = sprintf("%04d%02d", $month->year, $month->month);
        $label = date("F Y", strtotime($month->year . '-' . $month->month . '-01'));
        echo "<option value='$value'>$label</option>";

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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