WP_Widget_Archives{}└─ WP_Widget
Class of the core for implementing the "Archives" widget.
The widget is registered using the function register_widget():
register_widget( 'WP_Widget_Archives' );
Along with the classic output of the widget in the sidebar, the widget can also be displayed using the function the_widget() anywhere in the template:
<?php the_widget( 'WP_Widget_Archives' ); ?>
Inherits from the class WP_Widget().

when placed in the widget area
The appearance depends on the theme, but usually the widget on the front end of the site looks like this:
Hooks from the class
Returns
Nothing (null).
Usage
$WP_Widget_Archives = new WP_Widget_Archives(); // use class methods
Methods
- __construct()
- Sets up the widget instance.
- form($instance)
- Outputs the form with widget settings input (in the admin panel).
- update($new_instance, $old_instance)
- Manages the update of widget settings.
- widget($args, $instance)
- Outputs the widget content (on the front end of the site).
The content that the "Archives" widget generates on the front end of the site is formed using the function wp_get_archives(). This means that all parameters that this function accepts can be passed on the hooks-filters widget_archives_dropdown_args and widget_archives_args for customization.
Examples
#1 WooCommerce product archives widget
If you do not need the default "Archives" widget, which by default displays the archives of posts, you can use hook filters to display WooCommerce product archives. The appearance will be the same as that of the posts, only when you select a month (by default) the user will go to the archive of products published in that month.
add_filter('widget_archives_dropdown_args', 'wc_widget_archives_args' ); // For the dropdown list add_filter('widget_archives_args', 'wc_widget_archives_args' ); // For a bulleted list function wc_widget_archives_args( $args ) { $args['post_type'] = 'product'; return $args; }
#2 Archive widget by day
If the site posts are frequently published, you can display the archives by day and limit the number of days to be displayed.
add_filter( 'widget_archives_dropdown_args', 'widget_archives_days' ); function wc_add_widget_archives_dropdown_args( $args ) { $args['type'] = 'daily'; $args['limit'] = 5; return $args; }
#3 Creating an improved archive widget (non-Gutenberg widget)
In the front end of the site, a dropdown or tokenized list is generated using wp_get_archives(), which can take more parameters than can be specified in the standard "Archives" widget. Let's create our "Enhanced Archives" widget based on the "Archives" widget, where we'll provide a choice:
- what type of archive (by year, by month, by week, and so on);
- how many links to display;
- create links to archives of what type of posts.

<?php add_action( 'widgets_init', 'register_widget_archives_advanced' ); function register_widget_archives_advanced() { class WP_Widget_Archives_Advanced extends WP_Widget_Archives { public $default = [ 'type' => 'monthly', 'limit' => '', 'post_type' => 'post', ]; public function __construct() { $widget_ops = [ 'description' => 'Improved widget with archives', ]; WP_Widget::__construct( 'archives_advanced', 'Enhanced archives', $widget_ops ); } // html form of widget settings in the admin panel public function form( $instance ) { parent::form( $instance ); $instance = wp_parse_args( (array) $instance, $this->default ); $options = [ 'monthly' => 'By month', 'yearly' => 'By year', 'daily' => 'By day', 'weekly' => 'By week', 'postbypost' => 'By post (sorted by date)', 'alpha' => 'By post (sorted by title)', ]; ?> <p> <label for="<?php php $this->get_field_id('type' ); ?>">Archive type</label> <select name="<?php echo $this->get_field_name( 'type' ); ?>" id="<?php echo $this->get_field_id( 'type' ); ?>" class="widefat" > <?php foreach ( $options as $value => $text ): ?> <option value="<?php echo esc_attr( $value ); ?>"<?php selected( $instance['type'], $value ); ?>> <?php echo esc_html( $text ); ?> </option> <?php endforeach; ?> </select> </p> <p> <label for="<?php php $this->get_field_id('limit' ); ?>">Number of links to archives</label> <input type="number" name="<?php echo $this->get_field_name( 'limit' ); ?>" id="<?php echo $this->get_field_id( 'limit' ); ?>" class="widefat" value="<?php echo isset( $instance['limit'] ) ? esc_attr( $instance['limit'] ) : ''; ?>" > <small>Leave the field blank to display all links</small> </p> <p> <label for="<?php php $this->get_field_id('post_type' ); ?>">Post type</label> <select name="<?php echo $this->get_field_name( 'post_type' ); ?>" id="<?php echo $this->get_field_id( 'post_type' ); ?>" class="widefat" > <?php foreach ( get_post_types( [ 'public' => true, ], 'objects' ) as $post_type ): ?> <option value="<?php echo esc_attr( $post_type->name ); ?>" <?php selected( $instance['post_type'], $post_type->name ); ?> > <?php echo esc_html( $post_type->label ); ?> </option> <?php endforeach; ?> </select> </p> <?php } // Saving widget settings public function update( $new_instance, $old_instance ) { $new_instance = wp_parse_args( (array) $new_instance, $this->default ); $instance = parent::update( $new_instance, $old_instance ); $instance['type'] = sanitize_key( $new_instance['type'] ); $instance['limit'] = $new_instance['limit'] > 0 ? (int) $new_instance['limit'] : ''; $instance['post_type'] = sanitize_key( $new_instance['post_type'] ); return $instance; } // Widget output in the front part of the site public function widget( $args, $instance ) { add_filter( 'widget_archives_dropdown_args', [ $this, 'add_args' ], 10, 2 ); add_filter( 'widget_archives_args', [ $this, 'add_args' ], 10, 2 ); parent::widget( $args, $instance ); remove_filter( 'widget_archives_dropdown_args', [ $this, 'add_args' ] ); remove_filter( 'widget_archives_args', [ $this, 'add_args' ] ); } public function add_args( $args, $instance ) { return wp_parse_args( $instance, $args ); } } register_widget( 'WP_Widget_Archives_Advanced' ); }
Notes
- See: WP_Widget
Changelog
Since 2.8.0 | Introduced. |