WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Хостинг, VPS/VDS и отдельные сервера только на SSD дисках. 7 дней бесплатного тестирования.

sidebars_widgets хук-фильтр . WP 2.7.0

Позволяет изменить список сайдбаров и виджетов в них.

Использование

add_filter( 'sidebars_widgets', 'filter_function_name_1742' );
function filter_function_name_1742( $sidebars_widgets ){
	// Изменяем...

	return $sidebars_widgets;
}
$sidebars_widgets(массив)

Ассоциативный массив с сайдбарами и виджетами в них.

Пример данных, проходящих через хук-фильтр, для темы TownPress:

Array
(
	[wp_inactive_widgets] => Array
		(
			[0] => lsvr_directory_listing_list-3
			[1] => lsvr_townpress_post_list-4
			[2] => lsvr_townpress_post_featured-3
			[3] => archives-2
			[4] => meta-2
			[5] => categories-2
			[6] => recent-comments-2
		)

	[lsvr-townpress-default-sidebar-left] => Array
		(
			[0] => search-2
			[1] => recent-posts-2
		)

	[lsvr-townpress-default-sidebar-right] => Array
		(
			[0] => custom_html-2
			[1] => cherry_widget_trending_posts-2
		)

	[lsvr-townpress-footer-widgets] => Array
		(
			[0] => text-2
			[1] => tag_cloud-2
		)

	[lsvr-townpress-custom-sidebar-1] => Array
		(
		)

)

Как видно из примера, первый уровень массива - это список сайдбаров, где ключ массива есть ID сайдбара, указываемый при регистрации функцией register_sidebar(). Во втором уровне массива находятся ID виджетов, прикрепленные к тому или иному сайдбару.

Примеры

#1 Заменим виджеты из одного сайдбара виджетами другого

Пусть у нас есть рубрика Обзоры (taxonomy=category и slug=reviews) с Записями (post_type=post). Мы хотим в обзорах выводить в левом сайдбаре (id=sidebar-left) темы другие виджеты, отличные от тех, что выводятся в этом сайдбаре на всём сайте. Есть несколько решений проблемы, к примеру изменить логику и шаблон вывода сайдбаров темы, но что если не хочется изменять тему? Поможет хук-фильтр sidebars_widgets! Данный код можно использовать как в теме, так и в плагине.

// 1 шаг: Регистрируем новый сайдбар с id=reviews-sidebar

add_action( 'widgets_init', 'cr_register_sidebars' );

function cr_register_sidebars() {
	register_sidebar( array(
		'name'          => 'Reviews Sidebar',
		'id'            => 'reviews-sidebar',
		'description'   => 'Сайдбар для Обзоров',
		'class'         => '',
		'before_widget' => '<div id="%1$s" class="widget %2$s"><div class="widget__inner">',
		'after_widget'  => '</div></div>',
		'before_title'  => '<h3 class="widget__title">',
		'after_title'   => '</h3>',
	) );
}

// 2 шаг: Заменяем виджеты 'sidebar-left' на виджеты 'reviews-sidebar'

add_action( 'wp', 'cr_main_actions' );

function cr_main_actions() {

	// Проверяем, что текущая Запись относится к рубрике "Обзоры"
	if ( is_singular( 'post' ) && in_category( 'reviews' ) ) {
		add_filter( 'sidebars_widgets', 'cr_sidebars_widgets' );
	}

}

// Сама замена виджетов
function cr_sidebars_widgets( $sidebars ) {
	$sidebars['sidebar-left'] = $sidebars['reviews-sidebar'];

	return $sidebars_widgets;
}

Где вызывается хук

wp_get_sidebars_widgets()
wp-includes/widgets.php 930
return apply_filters( 'sidebars_widgets', $sidebars_widgets );

Где используется хук (в ядре WP)

wp-includes/class-wp-customize-widgets.php 373
add_filter( 'sidebars_widgets', array( $this, 'preview_sidebars_widgets' ), 1 );
wp-includes/class-wp-customize-widgets.php 1813
add_filter( 'sidebars_widgets', $filter_callback, 1000 );
wp-includes/class-wp-customize-widgets.php 1821
remove_filter( 'sidebars_widgets', $filter_callback, 1000 );
campusboy 3080youtube.com/c/wpplus
Создатель YouTube канала wp-plus, на котором делюсь своим опытом. Активный пользователь wp-kama.ru. WordPress-разработчик. Разработка сайтов и лендингов. Доработка существующих проектов. Сопровождение ресурсов.
Редакторы: Kama 7099
3 коммента
  • Здравия!
    В комменте 2 пункта
    // 2 шаг: Заменяем виджеты 'reviews-sidebar' на виджеты 'reviews-sidebar'
    наверно sidebar-left должно быть

    1
    Ответитьмесяц назад #
Здравствуйте, !     Войти . Зарегистрироваться