DYNAMIC_SIDEBAR() ─ Динамическая Боковая Панель в WordPress
Функция dynamic_sidebar() отображает динамическую боковую панель на вашем сайте.
По умолчанию она показывает боковую панель по умолчанию или 'sidebar-1'. Если ваша тема задаёт параметры 'id' или 'name' для зарегистрированных боковых панелей, вы можете передать ID или имя в качестве параметра $index. Кроме того, можно использовать числовой индекс для отображения боковой панели по этому индексу.
Хуки Функции
dynamic_sidebar_beforedynamic_sidebar_afterdynamic_sidebar_has_widgetsdynamic_sidebar_paramsdynamic_sidebar
Возврат Значения
Функция возвращает true или false. Возвращает true, если боковая панель с виджетами найдена и отображена. Возвращает false, если не найдена или не отображена.
Использование
dynamic_sidebar($index);
Параметры
$index(int|string) — индекс, имя или ID динамической боковой панели. По умолчанию: 1.
Примеры
Пример 1: Отображение боковой панели, если такая есть
Этот пример показывает, как вывести первую не пустую боковую панель или, если она не найдена, отобразить указанный код:
Пример 2: Отображение нужной боковой панели
Пример 3: Проверка наличия панели и её отображение
В этом примере мы проверяем, есть ли панель и её виджеты. Если боковая панель пуста, то дополнительные HTML-теги (<ul id="sidebar">) не отображаются:
Пример 4: Несколько боковых панелей
Когда вы регистрируете более одной боковой панели с помощью register_sidebar(), удобнее указать ID для каждой из них. Если ID не указан, панель получит порядковый номер. Однако в этом случае будет сложно понять, какая панель за что отвечает, потому что номера 1, 2, 3 ничего не говорят. Если же указать имя, становится гораздо яснее:
С числовыми ID:
// регистрация
register_sidebar();
// вывод
dynamic_sidebar(1);
С строковыми ID:
// регистрация
register_sidebar([ 'id' => 'top_menu' ]);
// вывод
dynamic_sidebar('top_menu');
Как видно из примера, использовать строки удобнее: когда вы смотрите в код темы и видите dynamic_sidebar('top_menu'), сразу ясно, что это панель главного меню.
Правила для ID
ID не должен содержать пробелов, заглавные буквы или нелатинские буквы. Можно использовать дефисы - и подчеркивания _. Он также должен быть уникальным. Указывая ID, вы можете также задать имя, описание и переводы для них:
register_sidebar([
'id' => 'top-menu',
'name' => __( 'Верхнее Меню', $text_domain ),
'description' => __( 'Эта боковая панель расположена над логотипом.', $text_domain ),
]);
Примечания
global $wp_registered_sidebars- массив зарегистрированных боковых панелей.global $wp_registered_widgets- массив зарегистрированных виджетов.
Изменения
Функция была введена в версии 2.2.0.
Код Функции DYNAMIC_SIDEBAR
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]) || !is_array($sidebars_widgets[$index])) {
do_action('dynamic_sidebar_before', $index, false);
do_action('dynamic_sidebar_after', $index, false);
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']);
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']
);
// Подстановка HTML атрибутов id и class в 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_);
$params = apply_filters('dynamic_sidebar_params', $params);
$callback = $wp_registered_widgets[$id]['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'];
}
do_action('dynamic_sidebar_after', $index, true);
return apply_filters('dynamic_sidebar_has_widgets', $did_one, $index);
}
Теперь вы знаете, как использовать и настроить динамическую боковую панель в WordPress!