is_active_widget()WP 2.2.0

Определяет отображается ли указанный виджет на сайте (во фронтэнде). Получает ID панели, в которой виджет находится.

Функция получает абсолютно все активные виджеты из всех сайдбаров и ищет в них указанный виджет.

Параметр $id_base - основной

Для поиска виджета удобнее всего использовать параметр $id_base. В нем нужно указать ID виджета, который указывается в первом параметре конструктора WP_Widget, при создании виджета (см. register_widget()).

Параметр $widget_id - урезает поиск до конкретного виджета

Но он отвечает за то что вернет функция. Например, на сайте выводится виджет «Текст» и вызывается он два раза. Базовое имя у него text ($id_base == 'text'). А вот ID виджетов будут разные, создаются они как $id_base-$i++. Т.е. $widget_id у них будут: text-1 и text-2. Далее, если мы не укажем в поиске параметр $widget_id:

is_active_widget( 0, 0, 'text' );

то функция вернет нам первый найденный виджет, не важно text-1 это или text-2. Но если мы укажем параметр $widget_id:

is_active_widget( 0, 'text-1', 'text' );

то функция будет искать конкретный виджет: с базой 'text' и ID 'text-1'.

При этом нельзя указать только параметр $widget_id без $id_base. Тогда функция вернет false. И это мне показалось странным... Может поправят в след. версиях. А в 4.7 пока так.

Параметр $callback - ненужный

Для поиска виджета, вместо $id_base можно указать параметр $callback, но там нужно передавать, массив всех экземпляров функций обратного вызова. Короче, там не понятно что передавать и про этот параметр в 99% случаев проще просто забыть...

Использует глобальную переменную $wp_registered_widgets в которой хранятся все зарегистрированные виджеты.

Работает на основе: wp_get_sidebars_widgets()
1 раз — 0.000019 сек (очень быстро) | 50000 раз — 0.06 сек (скорость света) | PHP 7.0.8, WP 4.7

Хуков нет.

Возвращает

Строку|false.

  • ID сайдбара, например, sidebar-1 в котором найден активный виджет.
  • false - если виджет не активен (не найден ни в одном сайдбаре).
  • Вернет wp_inactive_widgets, если отключен параметр $skip_inactive и найденный виджет неактивен.

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

is_active_widget( $callback, $widget_id, $id_base, $skip_inactive );
$callback(массив/false)
callback виджета для проверки. Этот как правило не используется для поиска виджета. Тут нужно указать именно callback виджета из глобальной переменной $wp_registered_widgets.
По умолчанию: false
$widget_id(число/false)
ID виджета, который нужно найти. ID создается как база ID + число - $id_base-$i++
По умолчанию: false
$id_base(строка/false)

База ID виджета. База используется для создания динамического ID. Динамический нужен, потому что виджеты могут использоваться несколько раз. Этот параметр указывается при регистрации виджета в первом параметр при расширении класса WP_Widget (см. register_widget()).

Название базы каждого виджета который есть в WP по умолчанию смотрите в описании функции the_widget().

По умолчанию: false

$skip_inactive(логический)
Ставим в false, чтобы искать и в неактивных виджетах. В этом случае, если функция найдет виджет в неактивных то она вернет wp_inactive_widgets.
По умолчанию: true

Примеры

0

#1 Проверим есть ли активный виджет «Календарь»

$sidebar_id = is_active_widget( 0, 0, 'calendar' );
if( $sidebar_id ){
	echo 'Во фронте есть активный виджет Календарь';
}
0

#2 Поиск в неактивных виджетах

Допустим у нас есть виджет Текст, но он не находится ни в одном сайдбаре, а лежит в неактивной области в админке.

$sidebar_id = is_active_widget( 0, 0, 'text', 0 );
echo $sidebar_id; // wp_inactive_widgets

Заметки

  • Global. Массив. $wp_registered_widgets The registered widgets.

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

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

Код is_active_widget() WP 6.5.2

function is_active_widget( $callback = false, $widget_id = false, $id_base = false, $skip_inactive = true ) {
	global $wp_registered_widgets;

	$sidebars_widgets = wp_get_sidebars_widgets();

	if ( is_array( $sidebars_widgets ) ) {
		foreach ( $sidebars_widgets as $sidebar => $widgets ) {
			if ( $skip_inactive && ( 'wp_inactive_widgets' === $sidebar || str_starts_with( $sidebar, 'orphaned_widgets' ) ) ) {
				continue;
			}

			if ( is_array( $widgets ) ) {
				foreach ( $widgets as $widget ) {
					if ( ( $callback && isset( $wp_registered_widgets[ $widget ]['callback'] ) && $wp_registered_widgets[ $widget ]['callback'] === $callback ) || ( $id_base && _get_widget_id_base( $widget ) === $id_base ) ) {
						if ( ! $widget_id || $widget_id === $wp_registered_widgets[ $widget ]['id'] ) {
							return $sidebar;
						}
					}
				}
			}
		}
	}
	return false;
}