WordPress как на ладони
Наставник Трепачёв Д.П., phphtml.net wordpress jino

register_sidebar() WP 2.2

Регистрирует панель виджетов (место, куда размещаются виджеты в админ-панели, чтобы потом вывести их в лицевой части).

register_sidebar() регистрирует панель (место, контейнер) для виждетов и формат вывода для каждого виджета: html тег заголовка, html тег до и после виджета. Зарегистрировав панель, в админ-панели появится место, куда можно помещать виджеты. Разместив виджеты в панели, мы сможем вывести панель с виджетами в шаблоне с помощью функции dynamic_sidebar(), (см. пример 2).

Функцию нужно подключать к событию widgets_init.

Функция поддержки виджетов: add_theme_support('widgets') должна быть активирована для темы, в functions.php. Если этого нет, то register_sidebar() активирует её автоматически.

Не используйте названия идентификаторов для параметра ID из этого списка. Там же, по ссылке, вы найдете небольшую функцию, которая собирает уже используемые ID в WordPress.

Используйте register_sidebars(), чтобы создать несколько панелей за раз. Это позволит создать уникальное имя для каждой панели, например: "Правый сайдбар", "Левый сайдбар". Несмотря на то, что эти названия видны только в админ-панели, важно дать пользователю представление о том где будет выводиться панель.

register_sidebars() также рекомендуется использовать, если нужно зарегистрировать несколько однотипных панелей для виждетов (названия отличаются числами), например: Панель 1, Панель 2, Панель 3.

Дефолтные значения параметров before/after рассчитаны на темы, которые создают боковые панели в виде LI списка с заголовками в H2 теге. Такая регистрация рекомендуется разработчиками WordPress для всех тем.

Если по каким-то причинам, маркировку нужно изменить, рекомендуется скопировать id (id="%1$s") и class (class="widget %2$s") атрибуты как указано по умолчанию и не указывать их жестко. Нужно это, чтобы они создавались динамически с помощью функции sprintf().

Нельзя оставлять параметры name и id пустыми!

Их можно либо не указывать вообще, либо обязательно указать при этом, нужно чтобы они были уникальными и не пустыми.

Если не определить id или name, то для них будут использованы значения по умолчанию с инкрементом:

'name' => sprintf(__('Sidebar %d'), $i ),
'id' => "sidebar-$i",

Где $i будет числом равным кол-ву панелей на сайте + 1.

Используется в: register_sidebars().
Хуки из функции:
Возвращает

Строку. Идентификатор переданный в параметре ID.

Использование

register_sidebar( $args );

Шаблон использования

add_action( 'widgets_init', 'register_my_widgets' );
function register_my_widgets(){
	register_sidebar( array(
		'name'          => sprintf(__('Sidebar %d'), $i ),
		'id'            => "sidebar-$i",
		'description'   => '',
		'class'         => '',
		'before_widget' => '<li id="%1$s" class="widget %2$s">',
		'after_widget'  => "</li>\n",
		'before_title'  => '<h2 class="widgettitle">',
		'after_title'   => "</h2>\n",
	) );
}
$args(строка/массив)

Аргументы для регистрации панели виджетов. Можно указывать в виде строки или массива:
Если в виде строки, тогда аргументы нужно разделять знаком &:

'name=Sidebar&id=my_prefix_sidebar'

Те же аргументы в массиве:

array(
	'name' => 'Sidebar',
	'id'   => 'my_prefix_sidebar',
)

По умолчанию: параметры по умолчанию.

Аргументы параметра $args

name(строка)
Название панели виджетов. Название будет видно в админ-панели WordPress. По умолчанию "Боковая колонка 1" (локализация от Sidebar $i, где $i порядковый номер сайдбара). Значение не должно быть пустым!
По умолчанию: sprintf(__('Sidebar %d'), $i )
id(строка)
Идентификатор виджета. Строка, в которой не должно быть заглавных букв и пробелов. Значение не должно быть пустым, если оставить этот параметр пустым, то в режиме разработки (при дебаге) получите заметку типа E_USER_NOTICE.
По умолчанию: "sidebar-$i"
description(строка)
Текст описывающий где будет выводиться панель виджетов. Показывается в панели управления виджетами.
По умолчанию: ''
class(строка)
CSS класс, который будет добавлен главному HTML тегу панели виджетов.
По умолчанию: ''
before_widget(строка)
HTML код, который будет расположен перед каждым виджетом в панели. Например: <li class="my-widget">. Конструкции %1$s и %2$s будут заменены на id и class используемого в сайдбаре виджета.
По умолчанию: '<li id="%1$s" class="widget %2$s">'
after_widget(строка)
HTML код, который будет расположен после каждого виджета в панели. Например: </li>.
По умолчанию: "</li>\n"
before_title(строка)
HTML код перед заголовком виджета.
По умолчанию: '<h2 class="widgettitle">'
after_title(строка)
HTML код после заголовка виджета.
По умолчанию: "</h2>\n"

Основное назначение этих аргументов, указать подходящие для темы теги оборачивающие каждый виджет и его заголовок. В WordPress принято оборачивать виджет в li тег, а заголовок виджета в тег h2.

Примеры

#1 Регистрация виджетов для боковой панели сайта

Код ниже, зарегистрирует панель под названием "Правая боковая панель сайта". Название панели будет обвёрнуто в теги <div class="title"> и </div>:

function register_my_widgets(){
	register_sidebar( array(
		'name' => "Правая боковая панель сайта",
		'id' => 'right-sidebar',
		'description' => 'Эти виджеты будут показаны с правой колонке сайта',
		'before_title' => '<h1>',
		'after_title' => '</h1>'
	) );
}
add_action( 'widgets_init', 'register_my_widgets' );

После того, как мы разместим этот код в файл темы functions.php, в админ-панели на странице виджетов, появится панель, куда мы сможем добавить виджеты. В шаблоне эта панель выводится с помощью функции dynamic_sidebar():

<?php
	if ( function_exists('dynamic_sidebar') )
		dynamic_sidebar('right-sidebar');
?>

#2 Зарегистрируем панель виджетов для главной страницы сайта

Добавим код в functions.php:

function register_my_widgets(){
	register_sidebar( array(
		'name' => 'Боковая панель на главной странице',
		'id' => 'homepage-sidebar',
		'description' => 'Выводиться как боковая панель только на главной странице сайта.',
		'before_widget' => '<li class="homepage-widget-block">',
		'after_widget' => '</li>',
		'before_title' => '<h2 class="widgettitle">',
		'after_title' => '</h2>',
	) );
}
add_action( 'widgets_init', 'register_my_widgets' );

В файл home.php вставим вывод панели:

<div class="custom">
	<?php
	if ( function_exists('dynamic_sidebar') )
		dynamic_sidebar('homepage-sidebar');
	?>
</div>

Код register sidebar: wp-includes/widgets.php WP 4.8.1

<?php
function register_sidebar($args = array()) {
	global $wp_registered_sidebars;

	$i = count($wp_registered_sidebars) + 1;

	$id_is_empty = empty( $args['id'] );

	$defaults = array(
		'name' => sprintf(__('Sidebar %d'), $i ),
		'id' => "sidebar-$i",
		'description' => '',
		'class' => '',
		'before_widget' => '<li id="%1$s" class="widget %2$s">',
		'after_widget' => "</li>\n",
		'before_title' => '<h2 class="widgettitle">',
		'after_title' => "</h2>\n",
	);

	$sidebar = wp_parse_args( $args, $defaults );

	if ( $id_is_empty ) {
		/* translators: 1: the id argument, 2: sidebar name, 3: recommended id value */
		_doing_it_wrong( __FUNCTION__, sprintf( __( 'No %1$s was set in the arguments array for the "%2$s" sidebar. Defaulting to "%3$s". Manually set the %1$s to "%3$s" to silence this notice and keep existing sidebar content.' ), '<code>id</code>', $sidebar['name'], $sidebar['id'] ), '4.2.0' );
	}

	$wp_registered_sidebars[$sidebar['id']] = $sidebar;

	add_theme_support('widgets');

	/**
	 * Fires once a sidebar has been registered.
	 *
	 * @since 3.0.0
	 *
	 * @param array $sidebar Parsed arguments for the registered sidebar.
	 */
	do_action( 'register_sidebar', $sidebar );

	return $sidebar['id'];
}

Cвязанные функции

Из метки: sidebar (widget Виджет)

register_sidebar 24 комментария
Полезные 2 Вопросы 2 Все
  • miha cайт: url.url

    Вопрос, как добавить класс обёртке ul???

    Ответить3 года назад #
    • Kama4477

      Про какую именно обертку идет речь?

      Панель виджетов (sidebar) сама по себе не имеет ul тега... Она по умолчанию оборачивается в li, а заголовок в h2. Эти теги (li h2) меняются в параметрах:
      before_widget after_widget before_title after_title

      Если вы о ul для, списка, допустим, рубрик. То это уже контент который выводится в панели виджетов, т.е. сам виджет...

      Ответить3 года назад #
      • Денис-1 cайт: denfrolov.ru

        Добрый день, у меня тоже самое. Все виджеты обернуты в ul без класса и индификатора. Незнаю как его убрать, не люблю лишних элементов в коде. Пробовал добавить 'container' => false, не помогает

  • Дамир
    @

    привет,
    а можно поподробней рассказать про вот эти вот штуки или где можно почитать об их описании?
    %1$s %2$s %d $i

    2
    Ответить2.6 года назад #
    • Kama4477

      $i - порядковый номер сайдбара ($i = count($wp_registered_sidebars) + 1;): пр. 1 если регистрируется первый бар, 2 если второй и т.д.

      name

      'name' => sprintf(__('Sidebar %d'), $i ),

      Если не указывать "name", то name будет равно локализованному "Sidebar 1", "Sidebar 2" (%d заменится на вычисленное $i).

      id

      'id' => "sidebar-$i",

      Если не указать "id", то id будет заменено на sidebar-1, sidebar-2.

      before_widget

      'before_widget' => '<li id="%1$s" class="widget %2$s">',

      Конструкции %1$s и %2$s будут заменены на id и class используемого в сайдбаре виджета. Пр: укажем в before_widget строку:
      <aside id="%1$s" class="widget %2$s">

      теперь добавим виджет последних комментариев в тему и увидим что виджет обернут в строку

      <aside id="recent-comments-2" class="widget widget_recent_comments">

      1
      Ответить2.6 года назад #
  • Наталья cайт: internetdlyachainikov.ru

    Здравствуйте, подскажите, пожалуйста, как заменить слова Рубрики на Каталог. Я поменяла с помощью плагина. Нашла что нужно найти строки
    <h3>Рубрики</h3>

    а где они находятся не пойму. Спасибо.

    Ответить2.6 года назад #
    • Дамир cайт: gabdrahimov.ru
      @

      просто зайдите "внешний вид > виджеты" и поменяйте в сайдбаре заголовки виджетов, никаких плагинов и кода не нужно

      Ответить2.3 года назад #
  • Алексей

    Подскажите пожалуйста можно ли задать параметры чтобы на сайте не отображалась "общая" рубрика

    1
    Ответить2.3 года назад #
    • Дамир cайт: gabdrahimov.ru
      @

      если хотите чтобы не отображалась конкретная рубрика, воспользуйтесь плагином (Category Order and Taxonomy Terms Order или Custom Taxonomy Order NE) или создайте вывод рубрик самостоятельно с помощью функции вывода рубрик wp_list_categories()

      Ответить2.1 года назад #
  • Дамир
    @

    А если сразу несколько садбаров зарегить (без использования register_sidebarS()), чтобы выводить их через условные теги, косяков потом не возникнет изза например несколько раз использования add_action( 'widgets_init'?

    function register_my_widgets1(){
    	register_sidebar( array(
    		...
    	) );
    }
    add_action( 'widgets_init', 'register_my_widgets1' );
    
    function register_my_widgets2(){
    	register_sidebar( array(
    		...
    	) );
    }
    add_action( 'widgets_init', 'register_my_widgets2' );
    
    function register_my_widgets3(){
    	register_sidebar( array(
    		...
    	) );
    }
    add_action( 'widgets_init', 'register_my_widgets3' );
    Ответить1.5 года назад #
  • Otshelnik-Fm179 cайт: across-ocean.otshelnik-fm.ru

    Тимур привет. Допиши про ID виджета: "Если вы не установите значение идентификатор аргумента, вы получите сообщения E_USER_NOTICE в режиме отладки, начиная с версии 4.2."

    • это с официальной документации.
      Столкнулись в своем плагине - автор темы вордпресса не указал ID - в итоге все виджеты у пользователя перемешались (наш плагин регистрировал 2 области - но у нас был ID). Так что его указание важно
    1
    Ответитьгод назад #
    • Kama4477

      Немного не понял что дописать и почему, и не нашел этого в документации...

      Если не установить id или name, то для них будут использованы значения по умолчанию с инкрементом...

      'name' => sprintf(__('Sidebar %d'), $i ),
      'id' => "sidebar-$i",

      Где $i будет увеличиваться автоматически на число: зарегистрированные на сайте панели + 1.

      Ответитьгод назад #
    • Kama4477

      Дополнил описание...

      Ответитьгод назад #
  • Максим

    Подскажите, есть ли возможность сделать обертку для поля "Содержимое"?
    Мой код:

    function header_info_init_widget() {
    	register_sidebar( array(
    		'name'          => 'Имя/название в header(е) сайта',
    		'id'            => 'header-info-widget',
    		'description'   => 'Укажите своё имя или название сайта в поле "Заголовок" и краткое описание в поле "Содержимое"',
    		'before_widget' => '<div class="author">',
    		'after_widget'  => '</div>',
    		'before_title'  => '<h1>',
    		'after_title'   => '</h1>',
    	));
    }
    add_action( 'widgets_init', 'header_info_init_widget' );

    Результат:

    <div class="author">
    <h1 style="opacity: 1;" class="animated fadeInDown">Заголовок</h1>
    <div class="textwidget">Описание</div>
    </div>

    А мне нужно, чтобы вместо div(а) с классом textwidget стоял тег

    1
    Ответить2 месяца назад #
  • Дамир

    Добрый день, если в register_sidebar(), стоит:

    'id' => "sidebar-$i",

    то это почему-то не работает:

    dynamic_sidebar('sidebar-$i');
    dynamic_sidebar('sidebar-0');
    
    Ответитьмесяц назад #
    • Kama4477

      dynamic_sidebar('sidebar-1'); должно сработать... $i динамичен - 1,2,3,4,5 и т.д.

      Ответитьмесяц назад #
      • Дамир

        Эти тоже не работают

        dynamic_sidebar('sidebar-1');
        dynamic_sidebar('sidebar');

        также не добавляется 'class' в главный тег

        Ответитьмесяц назад #
        • Kama4477

          Проверь все еще раз, панели баров имеют виджеты? По идее должно работать!

          Ответитьмесяц назад #

Здравствуйте, !

Ваш комментарий