Динамическая боковая панель в WordPress: функция dynamic_sidebar()

DYNAMIC_SIDEBAR() ─ Динамическая Боковая Панель в WordPress

Функция dynamic_sidebar() отображает динамическую боковую панель на вашем сайте.

По умолчанию она показывает боковую панель по умолчанию или 'sidebar-1'. Если ваша тема задаёт параметры 'id' или 'name' для зарегистрированных боковых панелей, вы можете передать ID или имя в качестве параметра $index. Кроме того, можно использовать числовой индекс для отображения боковой панели по этому индексу.

Хуки Функции

  • dynamic_sidebar_before
  • dynamic_sidebar_after
  • dynamic_sidebar_has_widgets
  • dynamic_sidebar_params
  • dynamic_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!

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *