Виводить на екран першу активну панель віджетів (сайдбар – панель у якій є хоча б один віджет). Можна вказати ID або номер панелі, яку саме виводити, якщо на сайті більше однієї панелі віджетів.
dynamic_sidebar() повертає true або false, з результатом, що повертається, також виводить на екран панель віджетів. Значення, що повертається, можна використовувати, наприклад, щоб визначити, чи потрібно обробляти код замінника віджетів, коли в панелі немає віджетів (див. приклад #1).
Якщо при реєстрації панелі віджетів за допомогою функції Множинні сайдбари .
Ідентифікатор панелі, вказаний у параметрі ID функції register_sidebar(), при реєстрації панелі. Якщо вказано число, то буде шукатись панель з ID sidebar-$index.
У прикладі 2 ми не перевіряли наявність панелі та віджетів у ній. У цьому прикладі ми перевіримо наявність панелі, щоб не виводити зайві HTML теги ( <ul id="sidebar">), якщо сайдбар порожній:
При реєстрації більше однієї панелі віджетів за допомогою register_sidebar() зручніше вказувати ID для кожної панелі.
Ми можемо не вказувати ID, тоді панель отримає порядковий номер. Але в цьому випадку, при редагуванні теми складно буде зрозуміти яка панель яка, адже числа 1, 2, 3 ні про що не говорять. Але якщо задати назву, стає набагато зрозуміліше:
З прикладу, видно, що з рядками зручніше: зазирнувши в тему і побачивши 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 ),
)));
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);
}