WP_Widget_Archives{}
Core class used to implement the Archives widget.
Hooks from the class
Usage
$WP_Widget_Archives = new WP_Widget_Archives(); // use class methods
Methods
- public __construct()
- public form( $instance )
- public update( $new_instance, $old_instance )
- public widget( $args, $instance )
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. |