WP_Widget_Archives{}
Класс ядра для реализации виджета "Архивы".
Виджет регистрируется с помощью функции register_widget():
register_widget( 'WP_Widget_Archives' );
Наряду с классическим выводом виджета в сайдбаре, виджет также можно вывести с помощью функции the_widget() в любом месте шаблона:
<?php the_widget( 'WP_Widget_Archives' ); ?>
Наследуется от класса WP_Widget().
Внешний вид зависит от темы, но как правило виджет в лицевой части сайта выглядит так:
Хуки из класса
Возвращает
Ничего (null).
Использование
$WP_Widget_Archives = new WP_Widget_Archives(); // use class methods
Методы
- __construct()
- Устанавливает экземпляр виджета.
- form($instance)
- Выводит форму с вводом настроек виджета (в админке).
- update($new_instance, $old_instance)
- Управляет обновлением настроек виджета.
- widget($args, $instance)
- Выводит контент виджета (в лицевой части сайта).
Содержимое, которое виджет "Архивы" генерирует в лицевой части сайта, формируется с помощью функции wp_get_archives(). Из этого следует, что все параметры, которые принимает эта функция, можно передать на хуках-фильтрах widget_archives_dropdown_args и widget_archives_args для кастомизации.
Примеры
#1 Виджет архивов товаров WooCommerce
Если не нужен дефолтный виджет "Архивы", который по умолчанию отображает архивы записей, то можно с помощью хук-фильтров отображать архивы товаров WooCommerce. Внешний вид будет такой же, как и у записей, только при выборе месяца (по умолчанию) пользователь будет переходить на архив товаров, опубликованных в этом месяце.
add_filter( 'widget_archives_dropdown_args', 'wc_widget_archives_args' ); // Для выпадающего списка add_filter( 'widget_archives_args', 'wc_widget_archives_args' ); // Для маркерованного списка function wc_widget_archives_args( $args ) { $args['post_type'] = 'product'; return $args; }
#2 Виджет архивов по дням
Если на сайте записи часто публикуются, то можно вывести архивы по дням и ограничить по количеству выводимых дней.
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 Создаем улучшенный виджет архивов
В лицевой части сайта выпадающий или маркерованный список формируется с помощью функции wp_get_archives(), которая может принимать больше параметров, чем можно указать в стандартном виджете "Архивы". Создадим свой виджет "Улучшенные архивы" на основе виджета "Архивы", где предусмотрим выбор:
- какой тип архива (по годам, по месяцам, по неделям и так далее);
- сколько ссылок отображать;
- создавать ссылки на архивы какого типа записи.
<?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' => 'Улучшенный виджет с архивами.', ]; WP_Widget::__construct( 'archives_advanced', 'Улучшенные архивы', $widget_ops ); } // html форма настроек виджета в Админ-панели public function form( $instance ) { parent::form( $instance ); $instance = wp_parse_args( (array) $instance, $this->default ); $options = [ 'monthly' => 'По месяцам', 'yearly' => 'По годам', 'daily' => 'По дням', 'weekly' => 'По неделям', 'postbypost' => 'По постам (сорт. по дате)', 'alpha' => 'По постам (сорт. по заголовку)', ]; ?> <p> <label for="<?php echo $this->get_field_id( '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 echo $this->get_field_id( 'limit' ); ?>">Количество ссылок на архивы</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>Оставьте поле пустым, чтобы отобразить все ссылки</small> </p> <p> <label for="<?php echo $this->get_field_id( '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 } // Сохранение настроек виджета 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; } // Вывод виджета в лицевой части сайта 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' ); }
Заметки
- Смотрите: WP_Widget
Список изменений
С версии 2.8.0 | Введена. |