is_active_widget

Определяет отображается ли указанный виджет на сайте (во фронтэнде). Получает 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 в которой хранятся все зарегистрированные виджеты.
✈ 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

Примеры

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

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

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

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

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

Код из


wp-includes/widgets.php

WP 4.7.2

<?php
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 || 'orphaned_widgets' === substr( $sidebar, 0, 16 ) ) ) {
				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;
}