Сайдбар с различными вариантами оформления виджетов в WordPress

  • 12.05.15
  • 21:44
  • 755
  • 0
Правый сайдбар

Правый сайдбар

Задача: сайдбары темы должны поддерживать несколько вариантов оформления виджетов (см. рис.) Соответствие вариантов виджетам задано в виде двухуровневого хеша:

id сайдбара => id_base типа виджета => вариант оформления.

Т. е. режим отображения виджета следует получать так:

Все режимы являются частью шаблонов (содержат фрагменты вёрстки) и не имеют настраиваемых параметров. Поэтому они заданы в виде массива $AVAILABLE_MODES прямо в коде темы.

Массив соответствия вариантов виджетам $a_widget_modes является настраиваемым и каким-либо образом задаётся администратором.

Решение задачи сводится к коррекции передаваемых виджету параметров сайдбара before_widget, after_widget, before_title и after_title.

Корректировка проводится фильтром 'dynamic_sidebar_params'. Фильтруемым значением является числовой массив, содержащий два элемента:

  • [0] — параметры сайдбара, идентификатор и имя виджета;
  • [1] — хеш с номером виджета.

Структура фильтруемого значения (обозначим его как $params) такова:

Сайдбар над футером

Сайдбар над футером

Здесь примечательны id, widget_id и before_widget.

Параметр id — идентификатор сайдбара. Это первый ключ в хеше $a_widget_modes.

Второй ключ можно извлечь из идентификатора виджета — параметра widget_id — который всегда имеет вид "{$id_base}-{$number}":

Параметр before_widget является уже обработанной форматной строкой: при регистрации сайдбара он был задан как '<div id="%1$s" class="widget-wrap %2$s">'. Идентификатор и классы (кроме 'widget-wrap') должны быть сохранены. Поэтому заменить его на заранее заготовленную строку нельзя, и если вёрстка виджета определяется к.-л. дополнительным классом этого блока, его потребуется изменять регулярным выражением:

Если добавления класса окажется не достаточно, то требуемую строку удобнее будет формировать вызовом vsprintf($format, $args). Для этого параметр before_widget при регистрации сайдбара следует задать в виде '%1$s|%2$s', тогда аргумент $args можно получить с помощью explode. Форматные строки $format находятся в $AVAILABLE_MODES, их вид аналогичен параметрам before_widget в вызовах register_sidebar для обычных сайдбаров. Фильтрация в этом случае примет такой вид:

Коррекция этого параметра должна происходить для всех без исключения виджетов данного сайдбара. Поэтому нужен «вариант оформления по умолчанию». Назовём его 'default' и будем дополнять его параметрами все остальные варианты. Он также относится к сайдбару и определяется его идентификатором. Получение параметров варианта усложнится:

Остальные параметры сайдбара — before_title, after_title, after_widget — просто строки, значения им можно просто присвоить.

Костыль будет удобен для сайдбаров с одинаковыми параметрами. Таковыми обычно являются части горизонтальных сайдбаров (напр., в футере). Чтобы не дублировать описания их режимов в $AVAILABLE_MODES, надо ввести массив соответствия такого вида:

Перед получением $mode_id идентификатор $sidebar_id должен быть скорректирован:

Такие идентификаторы — значения $IDENTICAL_SIDEBARS — следует использовать вместо идентификаторов одинаковых сайдбаров при написании $AVAILABLE_MODES и при формировании $a_widget_modes.

Результат выглядит так (всё лишнее вырезано):

Замечания:

  • строка 15: локализуемые строки должны быть англоязычными, потому что пользователи с неподдерживаемыми локалями будут читать исходный текст;
  • строки 71-72: открывать блоки в after_title нежелательно, если это приводит к несбалансированным before_widget и after_widget: так как при пустом заголовке окружающий его код выводить не принято, блок виджета может оказаться некорректным и нарушить отображение страницы. Решение проблем, возникающих в подобных случаях, рассматривается в статье «Темы WordPress и пустые заголовки виджетов».
  • строки 122-128: параметр before_widget_format должен задаваться только для сайдбаров с before_widget равным '%1$s|%2$s', иначе сформируется тарабарщина;
  • строки 130-136: содержимое параметра before_widget_classes добавляется к первому атрибуту class, найденному в before_widget. Т. е. в вариант вроде классы будут добавлены к классу «outer» первого тега.
Оставить комментарий

Добавить комментарий