Этот материал является переводом второй части серии материалов о концепциях WordPress для разработчиков Joomla автора Cory Webb - WordPress concepts for Joomla developers: Sidebars and Widgets.
В этом материале я рассмотрю сайдбары (sidebars) и виджеты (widgets). Если проводить аналогии с Joomla, то сайдбары и виджеты можно сравнить с позициями модулей и модулями. У них много общего, но также есть различия, которые могут заставить разработчика Joomla чесать затылок.
Сайдбары и позиции модулей
Сайдбары по сути являются контейнером для виджетов, также как позиции модулей являются контейнером для модулей. Сайдбар - это область в теме, где рендерятся виджеты с определённым набором правил макета. Позиция модуля - это область в шаблоне, где ренедерятся модули с определённым набором правил макета, которые называются хром модуля (module chrome).
Регистрация сайдбаров и регистрация позиций модуля
Чтобы выполнить рендеринг сайдбара, его сначала необходимо зарегистрировать. Это большое отличие от Joomla. Ведь, несмотря на то, что большинство шаблонов регистрируют позиции модулей в файле templateDetails.xml
, технически это делать не обязательно.
Сайдбары регистрируются в файле functions.php
темы, при помощи функции register_sidebar()
. Ниже пример типичного вызова такой функции:
register_sidebar( array(
'name' => __( 'Some Sidebar', 'theme-slug' ),
'id' => 'some-sidebar',
'description' => __( 'Widgets in this area will be shown on all posts and pages.', 'theme-slug' ),
'before_widget' => '<div id="%1$s" class="widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h2 class="widgettitle">',
'after_title' => '</h2>',
) );
Функция принимает единственную переменную $args
, которая является ассоциативным массивом аргументов с информацией о сайдбаре. Первый аргумент name – это имя сайдбара, которое отображается в списке сайдбаров. id
– это уникальный идентификатор сайдбара. description
– это описание сайдбара.
Остальные аргументы before_widget
, after_widget
, before_title
и after_title
являются WordPress эквивалентом module chrome. Они определяют HTML обёртку (wrapper) для каждого заголовка виджета. По моему мнению, это менее гибко, чем module chrome, но намного компактнее, и возможно проще для новичков.
Больше информации о функции register_sidebar()
вы можете получить здесь.
Рендеринг сайдбаров и рендеринг позиций модуля
Сайдбары рендерятся через тэг шаблона, а позции модулей обычно рендерятся с помощью тэга jdoc
разметки:
<jdoc:include type="modules" name="some-module-position" style="some-module-chrome-style" />
Тэг шаблона для рендеринга сайдбара – это dynamic_sidebar()
. Функция принимает единственный параметр, ID сайдбара. Например, если мы хотим вывести сайдбар, зарегистрированный выше, то это выглядело бы вот так:
<?php if ( is_active_sidebar( 'some-sidebar' ) ) : ?>
<div class="some-class">
<?php dynamic_sidebar( 'some-sidebar' ); ?>
</div>
<php endif; ?>
Обратите внимание на функцию is_active_sidebar('some-sidebar')
. В Joomla для этого используется $this->countModules('some-module-position')
. В WordPress функция вернёт true
или false
, в зависимости от того, есть ли в сайдбаре активные виджеты. В Joomla мы получим количество активных модулей в позиции. Эффект одинаков, так как обе используются для проверки, отображать или нет сайдбар или позицию модуля.
Виджеты и модули
Виджеты и модули практически идентичны по назначению и функциональности. Оба являются блоками HTML, которые должны быть отрендерены в определённых областях темы или шаблона. Оба могут использоваться для рендеринга меню, форм, кастомного HTML контента.
Виджеты могут быть отображены где угодно при помощи shortcodes, если у виджета есть соответствующий шорткод. Модули могут быть отображены с помощью тэга {loadmodule}
плагина Load Modules, но ограничены только материалами и не работаю везде.
Виджеты обычно определяются в плагинах с помощью API виджетов, но они также могут быть определены в файле functions.php
темы. Я не большой сторонник определения виджетов в теме, потому что это нарушает моё правило держать логику представления отдельно от логики данных. В Joomla модули всегда определяются как отдельные типы расширений. Каждый модуль является своего рода контейнером кода, который находится в папке /modules
. Это различие делает разработку виджетов более гибкой, и как разработчик Joomla, вы должны быть готовы к тому, что в WordPress не существует жёсткой структуры, когда дело доходит до разработки виджета.
Публикация на конкретных страницах
Одним огромным отличием между Joomla и WordPress, которое, как правило, расстраивает разработчиков Joomla, это невозможность в WordPress публиковать виджеты на конкретных страницах. В Joomla вы можете указать, какие модули, и на каких страницах публиковать, а в WordPress, опубликованный виджет публикуется на всех страницах, которые рендерят сайдбар с этим виджетом. Если честно, я не уверен, почему это до сих пор не решили в ядре WordPress.
К счастью, есть плагины, который заполняют эту дыру в функциональности WordPress.
Итоги и что дальше?
Сайдбары и виджеты очень похожи на позиции модулей и модули, но пока вы не поймёте различия, вы можете быстро разочароваться. Есть плюсы и минусы обоих подходов, и я верю в то, что Joomla и WordPress могут научиться друг у друга, реализовав лучшее в этой области.
Пока что я рассмотрел темы, а также сайдбары и виджеты. Но я всего лишь поцарапал поверхность. В следующем материале я рассмотрю иерархию шаблона WordPress и сопоставлю её с переопределениями в шаблонах Joomla.