Индивидуальное оформление виджетов для WordPress

Последнее время мне довольно часто приходится заниматься разработкой виджетов для 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 и т.д. в разметке виджета).

Если есть вопросы или замечания пишите, буду рад обсудить ;)

До встречи!
Теги:
оформление виджетов
Добавлено: 22 Апреля 2018 10:54:19 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...