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

список змін

З версії 2.2.0Введено.

Код is_active_widget() WP 6.0.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 || '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 ) ) {
						if ( ! $widget_id || $widget_id === $wp_registered_widgets[ $widget ]['id'] ) {
							return $sidebar;
						}
					}
				}
			}
		}
	}
	return false;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *