Виджеты — это модули с различным функционалом для добавления в специальную область sitebar. Одним из основных преимуществ данного решения является скорость и простота настройки.
Виджет для изображения
Если вставить изображение в простой текстовый виджет, то отображение будт происходить по стандарту отступы, заголовок и т.д.
Image Widget — плагин для создания нового типа виджета специально для изображений, без лишних «обводок».
Условия вывода виджета
Widget Logic (300 000) — плагин позволяющий прописывать логику вывода каждого виджета. В виджетах появляется специальное поле Widget logic в котором мы прописываем условия (категория, запись и т.д.). Весь функционал плагина строится на базовых запросах условий wordpress. Преимуществом плагина является его простота и лаконичность. Можно строить условия с дополнительными таксономиями, в частности категориями товаров woocommerce:
is_product_category('gipsokarton')
Widget Context (60 000) — еще один аналогичный плагин. При установке Woocommerce расширяет варианты запросов. Чтобы показывать виджет в категории и товарах входящих в нее необходимо выбрать пункт: Показывать в > Архив записей «Товары», а в поле URL прописать
catalog/gipsokarton/
catalog/gipsokarton/*
$args = array(
'order' => 'ASC',
'hide_empty' => 1,
'hierarchical' => true,
'depth' => 1,
'taxonomy' => 'pa_firma',
'title_li' => '',
'separator' => ''
);
wp_list_categories( $args );
Отключение стандартных виджетов
Мы можем отключить какие-то стандартные виджеты, чтобы они не мешались «под ногами».
//Удаление стандартных виджетов
add_action( 'widgets_init', 'widgets_init_example' );
function widgets_init_example() {
unregister_widget( 'WP_Widget_Pages' );
//unregister_widget( 'WP_Widget_Calendar' );
unregister_widget( 'WP_Widget_Archives' );
unregister_widget( 'WP_Widget_Links' );
unregister_widget( 'WP_Widget_Meta' );
//unregister_widget( 'WP_Widget_Search' );
//unregister_widget( 'WP_Widget_Text' );
//unregister_widget( 'WP_Widget_Categories' );
//unregister_widget( 'WP_Widget_Recent_Posts' );
unregister_widget( 'WP_Widget_Recent_Comments' );
unregister_widget( 'WP_Widget_RSS' );
//unregister_widget( 'WP_Widget_Tag_Cloud' );
}
Выводим виджеты woocommerce
Любой виджет можно вывести в любом месте верстки с помощью функции the_widget, нужно правильно указывать название виджета и его аргументы.
Виджет категорий woocommerce
<?php the_widget( 'WC_Widget_Product_Categories', 'dropdown=1' ); ?>
Виджет недавно просмотренных товаров
<?php the_widget( 'WC_Widget_Recently_Viewed', 'number=5&title=Недавно просмотренные товары' ); ?>
Почему-то сам по себе он работает не корректно — не запоминает просмотренные товары. Но начинает работать когда активировать родной виджет и вывести где-либо.
Решение: активировать, но скрыть (display: none;) основной виджет.
CSS класс виджета
У стандартных виджетов WP есть одна проблема — у разных виджетов одинаковый класс widget. Было бы гораздо удобнее, чтобы у каждого уникального виджета был бы id или дополнительный класс.
Плагин Widget CSS Classes (100 000 установок) как раз решает эту проблему. В каждом виджете появляется дополнительное поле для указания дополнительного класса. И еще плагин автоматически назначает классы: widget-first, widget-last, widget-odd, widget-even и порядковые номера (widget-1, widget-2 и т.д.).
Поле класс у виджетов без плагина:
function kc_widget_form_extend( $instance, $widget ) {
if ( !isset($instance['classes']) )
$instance['classes'] = null;
$row = "";
$row .= "Class:\t<input type='text' name='widget-{$widget->id_base}[{$widget->number}][classes]' id='widget-{$widget->id_base}-{$widget->number}-classes' class='widefat' value='{$instance['classes']}'/>\n";
$row .= "</p>\n";
echo $row;
return $instance;
}
add_filter('widget_form_callback', 'kc_widget_form_extend', 10, 2);
function kc_widget_update( $instance, $new_instance ) {
$instance['classes'] = $new_instance['classes'];
return $instance;
}
add_filter( 'widget_update_callback', 'kc_widget_update', 10, 2 );
function kc_dynamic_sidebar_params( $params ) {
global $wp_registered_widgets;
$widget_id = $params[0]['widget_id'];
$widget_obj = $wp_registered_widgets[$widget_id];
$widget_opt = get_option($widget_obj['callback'][0]->option_name);
$widget_num = $widget_obj['params'][0]['number'];
if ( isset($widget_opt[$widget_num]['classes']) && !empty($widget_opt[$widget_num]['classes']) )
$params[0]['before_widget'] = preg_replace( '/class="/', "class=\"{$widget_opt[$widget_num]['classes']} ", $params[0]['before_widget'], 1 );
return $params;
}
add_filter( 'dynamic_sidebar_params', 'kc_dynamic_sidebar_params' );
Проверка активен ли виджет
Проверяем активен ли виджет или нет:
<?php $sidebar_id = is_active_widget( 0, 0, 'woocommerce_layered_nav' );
if( $sidebar_id ){
echo 'Во фронте есть активный виджет фильтр по свойствам товаров';
} else { echo 'Во фронте нет активного виджета фильтр по свойствам товаров'; } ?>
Проверка активен ли сайтбар (т.е. есть ли в нем хоть один виджет).
Список виджетов woocommerce:
woocommerce_layered_nav — Фильтрация товаров по атрибутам
woocommerce_layered_nav_filters — Активные фильтры товаров
woocommerce_product_categories — Категории товаров
woocommerce_recently_viewed_products — Недавно просмотренные товары
woocommerce_widget_cart — Корзина
woocommerce_product_tag_cloud — Облако меток товаров woocommerce_product_search — Поиск товаров
woocommerce_recent_reviews — Последние обзоры товара
woocommerce_products — Товары
woocommerce_top_rated_products — Товары по рейтингу
woocommerce_rating_filter — Фильтрация товаров по рейтингу
woocommerce_price_filter — Фильтрация товаров по цене