dynamic_sidebar() WP 2.2.0

Виводить на екран першу активну панель віджетів (сайдбар – панель у якій є хоча б один віджет). Можна вказати ID або номер панелі, яку саме виводити, якщо на сайті більше однієї панелі віджетів.

dynamic_sidebar() повертає true або false, з результатом, що повертається, також виводить на екран панель віджетів. Значення, що повертається, можна використовувати, наприклад, щоб визначити, чи потрібно обробляти код замінника віджетів, коли в панелі немає віджетів (див. приклад #1).

Якщо при реєстрації панелі віджетів за допомогою функції Множинні сайдбари .

Повертає

true|false. true, якщо панель з віджетами була знайдена. false, якщо панелі немає, або немає віджетів.

Використання

<ul id="sidebar">
	<?php dynamic_sidebar($index); ?>
</ul>
$index
(рядок/число)
Ідентифікатор панелі, вказаний у параметрі ID функції register_sidebar(), при реєстрації панелі. Якщо вказано число, то буде шукатись панель з ID
sidebar-$index.


Типово: 1 (sidebar-1)

Приклади

2

#1 Перевіряємо наявність панелі та виводимо її

У прикладі 2 ми не перевіряли наявність панелі та віджетів у ній. У цьому прикладі ми перевіримо наявність панелі, щоб не виводити зайві HTML теги ( <ul id="sidebar">), якщо сайдбар порожній:

<?php if ( is_active_sidebar( 'left-sidebar' ) ) : ?>
	<ul id="sidebar">
		<?php dynamic_sidebar( 'left-sidebar'); ?>
	</ul>
<?php endif; ?>
1

#2 Виводимо сайдбар, якщо він є.

Цей приклад показує як вивести перший не порожній сайдбар (при реєстрації id сайдара не було вказано) або якщо його не знайдено обробити вказаний код:

<ul id="sidebar">
<?php if ( ! dynamic_sidebar() ) : ?>
	<li><!-- код блоку 1 --></li>
	<li><!-- код блоку 2 --></li>
<?php endif; ?>
</ul>
1

#3 Виводимо необхідний сайдбар.

<ul id="sidebar">
	<?php dynamic_sidebar( 'right-sidebar'); ?>
</ul>
1

#4 Множинні сайдбари

При реєстрації більше однієї панелі віджетів за допомогою register_sidebar() зручніше вказувати ID для кожної панелі.

Ми можемо не вказувати ID, тоді панель отримає порядковий номер. Але в цьому випадку, при редагуванні теми складно буде зрозуміти яка панель яка, адже числа 1, 2, 3 ні про що не говорять. Але якщо задати назву, стає набагато зрозуміліше:

// --- числа
// реєстрація
register_sidebar();
// Висновок
dynamic_sidebar(1);

// --- Рядки
// реєстрація
register_sidebar( array( 'id' => 'top_menu') );
// Висновок
dynamic_sidebar( 'top_menu');

З прикладу, видно, що з рядками зручніше: зазирнувши в тему і побачивши dynamic_sidebar(‘top_menu’) відразу зрозуміло, що панель викликається для головного меню.

Аргумент id не повинен містити прогалин, великих букв, кириличних букв. У ньому можна використовувати тире – та підкреслення _. Також він має бути унікальним. Вказуючи id ми також можемо вказати назву, опис та переклади для них:

register_sidebar(array(
	'id' => 'top-menu',
	'name' => __( 'Top Menu', $text_domain ),
	'description' => __( 'Ця sidebar is located above the age logo.', $text_domain ),
)));

нотатки

  • Global. Масив. $wp_registered_sidebars Registered sidebars.
  • Global. Масив. $wp_registered_widgets Registered widgets.

список змін

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

Код dynamic_sidebar() WP 6.0.2

function dynamic_sidebar( $index = 1 ) {
	Global $wp_registered_sidebars, $wp_registered_widgets;

	if ( is_int( $index ) ) {
		$index = "sidebar-$index";
	} else {
		$ index = sanitize_title ($ index);
		foreach ((array) $wp_registered_sidebars as $key => $value ) {
			if ( sanitize_title( $value['name'] ) === $index ) {
				$ index = $ key;
				break;
			}
		}
	}

	$sidebars_widgets = wp_get_sidebars_widgets();
	if ( empty ( $ wp_registered_sidebars [ $ index ] ) ) | | empty ( $ sidebars_widgets [ $ index ] ) | | !
		/** Ця дія міститься в wp-includes/widget.php */
		do_action('dynamic_sidebar_before', $index, false);
		/** Ця дія міститься в wp-includes/widget.php */
		do_action('dynamic_sidebar_after', $index, false);
		/** Цей filter is documented в wp-includes/widget.php */
		return apply_filters('dynamic_sidebar_has_widgets', false, $index);
	}

	$sidebar = $wp_registered_sidebars[$index];

	$sidebar['before_sidebar'] = sprintf( $sidebar['before_sidebar'], $sidebar['id'], $sidebar['class'] );

	/**
	 * Fires до widgets є rendered в dynamic sidebar.
	 *
	 * Note: Рішення на фермах для дрібних sidebars, і на верхній частині кінця
	 * і back end, включаючи Inactive Widgets sidebar on the Widgets screen.
	 *
	 * @ Since 3.9.0
	 *
	 * @param int|string $index Index, name, або ID dynamic sidebar.
	 * @param bool $has_widgets Whether the sidebar is populated with widgets.
	 * Default true.
	 */
	do_action('dynamic_sidebar_before', $index, true);

	if ( ! is_admin() && ! empty( $sidebar['before_sidebar'] ) ) {
		echo $sidebar['before_sidebar'];
	}

	$did_one = false;
	foreach ((array) $sidebars_widgets[ $index ] as $id ) {

		if ( ! isset( $wp_registered_widgets[ $id ] ) ) {
			continue;
		}

		$params = array_merge(
			array(
				array_merge(
					$sidebar,
					array(
						'widget_id' => $id,
						'widget_name' => $wp_registered_widgets[ $id ]['name'],
					)
				),
			),
			(array) $wp_registered_widgets[ $id ]['params']
		);

		// Substitute HTML `id` та `class` attributes into `before_widget`.
		$classname_ = '';
		foreach ((array) $wp_registered_widgets[ $id ]['classname'] as $cn ) {
			if ( is_string( $cn ) ) {
				$classname_ .= '_' . $ cn;
			} elseif ( is_object ( $ cn ) ) {
				$classname_ .= '_' . get_class ($ cn);
			}
		}
		$classname_ = ltrim($classname_, '_');

		$params[0]['before_widget'] = sprintf(
			$params[0]['before_widget'],
			str_replace( '', '_', $id ),
			$classname_
		);

		/**
		 * Filters the parameters passed to a widget's display callback.
		 *
		 * Note: Filter is evaluated on both front end and back end,
		 * Включаючи для Inactive Widgets sidebar на Widgets screen.
		 *
		 * @ Since 2.5.0
		 *
		 * @see register_sidebar()
		 *
		 * @param array $params {
		 * @type array $args {
		 * An array of widget display arguments.
		 *
		 * @type string $name Name of the sidebar widget is assigned to.
		 * @type string $id ID sidebar widget is assigned to.
		 * @type string $description The sidebar description.
		 * @type string $class CSS class applied to the sidebar container.
		 * @type string $before_widget HTML markup для того, щоб перейти до всіх widget в sidebar.
		 * @type string $after_widget HTML markup до підрахунку до всіх widget в sidebar.
		 * @type string $before_title HTML markup для того, щоб перейти до widget title, коли displayed.
		 * @type string $after_title HTML markup до підключення до widget title, коли displayed.
		 * @type string $widget_id ID of the widget.
		 * @type string $widget_name Name of the widget.
		 * }
		 * @type array $widget_args {
		 * An array of multi-widget arguments.
		 *
		 * @type int $number Номер increment used for multiples of the same widget.
		 * }
		 * }
		 */
		$params = apply_filters('dynamic_sidebar_params', $params);

		$callback = $wp_registered_widgets[ $id ]['callback'];

		/**
		 * Fires до widget's display callback is called.
		 *
		 * Note: Рішення дії на основі front end and back end, including
		 * для widgets in the Inactive Widgets sidebar on the Widgets screen.
		 *
		 * The action is not fired for empty sidebars.
		 *
		 * @ Since 3.0.0
		 *
		 * @param array $widget {
		 * An associative array of widget arguments.
		 *
		 * @type string $name Name of the widget.
		 * @type string $id Widget ID.
		 * @type callable $callback Якщо ви думаєте, що огортається на front end, `$callback` is an array
		 * containing the widget object. Fired on the back end, `$callback`
		 * is 'wp_widget_control', see `$_callback`.
		 * @type array $params Асоційована array of multi-widget arguments.
		 * @type string $classname CSS class applied to the widget container.
		 * @type string $description The widget description.
		 * @type array $_callback Коли ви думаєте, що огортається на back end, `$_callback` є populated
		 * with array containing the widget object, see `$callback`.
		 * }
		 */
		do_action('dynamic_sidebar', $wp_registered_widgets[$id]);

		if ( is_callable( $callback ) ) {
			call_user_func_array ($ callback, $ params);
			$did_one = true;
		}
	}

	if ( ! is_admin() && ! empty( $sidebar['after_sidebar'] ) ) {
		echo $sidebar['after_sidebar'];
	}

	/**
	 * Fires після widgets є rendered в dynamic sidebar.
	 *
	 * Note: Рішення на фермах для дрібних sidebars, і на верхній частині кінця
	 * і back end, включаючи Inactive Widgets sidebar on the Widgets screen.
	 *
	 * @ Since 3.9.0
	 *
	 * @param int|string $index Index, name, або ID dynamic sidebar.
	 * @param bool $has_widgets Whether the sidebar is populated with widgets.
	 * Default true.
	 */
	do_action('dynamic_sidebar_after', $index, true);

	/**
	 * Filters whether a sidebar має widgets.
	 *
	 * Note: The filter is also evaluated for empty sidebars, and on both the front end
	 * і back end, включаючи Inactive Widgets sidebar on the Widgets screen.
	 *
	 * @ Since 3.9.0
	 *
	 * @param bool $did_one Whether at least one widget був rendered в sidebar.
	 * Default false.
	 * @param int|string $index Index, name, або ID dynamic sidebar.
	 */
	return apply_filters('dynamic_sidebar_has_widgets', $did_one, $index);
}

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

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