Последнее время мне довольно часто приходится заниматься разработкой виджетов для WordPress и иногда возникают ситуации, когда стандартных возможностей движка не хватает.
Сегодня я хочу показать прием, который позволяет назначить виджетам (которые находятся внутри одного сайдбара) индивидуальные CSS стили.
Прежде всего, разберемся, о каких именно стилях идет речь.
Вообще содержимое виджета и его разметка определяются разработчиком. Но для того, чтобы виджеты красиво вписывались в дизайн темы предусмотрены 4 параметра, которые должны использовать разработчики виджетов (по крайней мере в теории 🙂 ).
Эти параметры задаются разработчиком темы при создании сайдбара. Например, так:
register_sidebar(array( ..., 'before_widget' => '<li id="%1$s" class="widget %2$s">', 'after_widget' => '</li>', 'before_title' => '<h2 class="widgettitle">', 'after_title' => '</h2>' ));
Разработчики виджетов обычно используют их внутри метода widget. Взгляните на фрагмент примера из кодекса.
class My_Widget extends WP_Widget {
...
function widget($args, $instance) {
extract( $args );
$title = apply_filters('widget_title', $instance['title']);
?>
<?php echo $before_widget; ?>
<?php if ( $title )
echo $before_title . $title . $after_title; ?>
Hello, World!
<?php echo $after_widget; ?>
<?php
}
}
Как видите, в параметре before_widget использованы две переменные: %1$s и %2$s (их значения подставляются с помощью функции sprintf). В результате для текстового виджета получим что-то вроде.
<li id="text-3" class="widget widget_text">
Т.е. мы можем задать стили отдельно для каждого типа виджетов. Но представьте, что нам нужно вывести заголовки каждого четного виджета в сайдбаре темно-синим, а каждого нечетного – серым цветом. И при этом цвет не зависит от типа виджета, а определяется исключительно порядком размещения виджетов и если пользователь переставит виджеты местами, то и цвета должны измениться.
Использовать параметр id для этих целей вряд ли получится. Он создается при вставке виджета в сайдбар и не изменяется при перемещении виджета.
Решение довольно простое.
Добавьте в файл functions.php следующий код.
function custom_widget_counter($params) {
global $widget_counter;
if ($params[0]['id'] == 'my_sidebar') {
$widget_counter++;
If ($widget_counter % 2 == 0) {
$params[0]['before_title'] = '<h2 class="even">';
}
else {
$params[0]['before_title'] = '<h2 class="odd">';
}
}
return $params;
}
add_filter('dynamic_sidebar_params','custom_widget_counter');
«Фокус» заключается в использовании фильтра dynamic_sidebar_params, который позволяет изменять параметры, указанные при создании сайдбара (функция register_sidebar).
Установка атрибута class выполняется функцией custom_widget_counter (её имя мы указываем при добавлении фильтра). В первом параметре эта функция получает массив с текущими настройками.
Затем мы объявляем глобальную переменную $widget_counter, которая используется в качестве счетчика виджетов в сайдбаре.
Учитывая, что сайдбаров может быть несколько, проверяем id сайдбара и если он равен my_sidebar, устанавливаем параметр before_title. Для этого достаточно просто присвоить соответствующему элементу массива новое значение.
Если текущий виджет четный, устанавливаем <h2 class="even">, в противном случае — <h2 class="odd">.
И, самое главное, нужно обязательно вернуть (return) изменённый массив, иначе наши изменения применены не будут.
После этого остаётся только добавить соответствующие CSS правила в таблицу стилей.
И ещё раз хочу обратить ваше внимание. Этот метод будет работать для виджетов, которые разработаны в соответствии с рекомендациями кодекса (используются переменные before_widget, before_title и т.д. в разметке виджета).
Если есть вопросы или замечания пишите, буду рад обсудить 😉
До встречи!
Интересно почитать
Нужно продвижение ресторана? Попробуйте муляжи блюд от японских дизайнеров
Качественные и удобные промо сумки на заказ от швейного цеха


