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

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

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

add_filter( 'sidebars_widgets', 'wp_kama_sidebars_widgets_filter' );

/**
 * Function for `sidebars_widgets` filter-hook.
 * 
 * @param array $sidebars_widgets An associative array of sidebars and their widgets.
 *
 * @return array
 */
function wp_kama_sidebars_widgets_filter( $sidebars_widgets ){

	// filter...
	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 виджетов, прикрепленные к тому или иному сайдбару.

Примеры

0

#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_widgets ) {
	$sidebars_widgets['sidebar-left'] = $sidebars_widgets['reviews-sidebar'];

	return $sidebars_widgets;
}

Список изменений

С версии 2.7.0 Введена.

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

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

Где используется хук в WordPress

wp-includes/class-wp-customize-widgets.php 2012
add_filter( 'sidebars_widgets', $filter_callback, 1000 );
wp-includes/class-wp-customize-widgets.php 2021
remove_filter( 'sidebars_widgets', $filter_callback, 1000 );
wp-includes/class-wp-customize-widgets.php 375
add_filter( 'sidebars_widgets', array( $this, 'preview_sidebars_widgets' ), 1 );