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;
}

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

Код хука-фильтра sidebars_widgets

Фрагмент из: wp-includes/widgets.php VER 4.9.8
...
		$sidebars_widgets = $_wp_sidebars_widgets;
	} else {
		$sidebars_widgets = get_option('sidebars_widgets', array());
	}

	if ( is_array( $sidebars_widgets ) && isset($sidebars_widgets['array_version']) )
		unset($sidebars_widgets['array_version']);

	/**
	 * Filters the list of sidebars and their widgets.
	 *
	 * @since 2.7.0
	 *
	 * @param array $sidebars_widgets An associative array of sidebars and their widgets.
	 */
	return apply_filters( 'sidebars_widgets', $sidebars_widgets );
}

/**
 * Set the sidebar widget option to update sidebars.
 *
 * @since 2.2.0
 * @access private
 *
 * @global array $_wp_sidebars_widgets
 * @param array $sidebars_widgets Sidebar widgets and their settings.
 */
function wp_set_sidebars_widgets( $sidebars_widgets ) {
	global $_wp_sidebars_widgets;

	// Clear cached value used in wp_get_sidebars_widgets().
...
campusboy 3061youtube.com/c/wpplus
Создатель YouTube канала wp-plus, на котором делюсь своим опытом. Активный пользователь wp-kama.ru. WordPress-разработчик. Разработка сайтов и лендингов. Доработка существующих проектов. Сопровождение ресурсов.
Редакторы: Kama 7021
3 коммента
  • Здравия!
    В комменте 2 пункта
    // 2 шаг: Заменяем виджеты 'reviews-sidebar' на виджеты 'reviews-sidebar'
    наверно sidebar-left должно быть

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