Создание виджет-совместимой темы для WordPress

В этом посте я расскажу как создать тему, поддерживающую виджеты и как превратить облако меток в список тегов.

У нас есть (у меня есть) папка с темой в одну колонку и таким содержимым:

  • images\
  • style.css
  • index.php
  • comments.php
  • footer.php
  • header.php
  • functions.php
  • screenshot.png

Подробнее о теме в одну колонку, всех этих файлах и их содержимом можно прочитать в моих первом и втором постах.

Для создания темы, поддерживающей виджеты, нужен сайдбар (sidebar.php). Он может быть один (например правый), а может случится так, что вам понадобится несколько (2 правых, 2 левых, правый и левый, может еще нижний – это уже для шаблонов с множеством колонок). Но обо всем по порядку.

Предположим, нам нужен один сайдбар, правый. Будем использовать стандартные виджеты (т.е. те, что настраиваются в админке – Дизайн – Виджеты). Чтобы они работали и вордпресс не писал, что тема не виджет-совместимая, мы ее (тему) будем адаптировать.

Создаем файл sidebar.php:

[sourcecode language='php']



[/sourcecode]

В functions.php пишем (если такого файла нет, то создаем его, а затем добавляем следующий код):

[sourcecode language='php']
 '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', )); ?> [/sourcecode]

Подключаем наш сайдбар в index.php (сразу после подключения шапки) с помощью

<?php get_sidebar(); ?>

Заходим в админку, меню Дизайн, пункт Виджеты и видим список доступных виджетов. Выбираем нужные. У меня это выглядит так

widgets-view-index5

Обратите внимание на список меток – он представлен облаком (выводится с помощью виджета “Облако меток”), а все остальные виджеты выводят список списком. Лично мне захотелось привести все к единому виду, чтобы было читабельнее. Для этого нужно немного поднапрячься и превратить стандартный виджет “Облако меток” в нестандартный.

Создаем папку includes, в ней файл widget_tags.php, в нем такой код:

[sourcecode language='php']
%s

';
    $tags_li_pattern = '
  • %s%s
  • '; $tag_count_pattern = ' (%s)'; $tags_li = ''; foreach ($tags as $tag) { $tags_li .= sprintf( $tags_li_pattern, get_tag_link($tag->term_id), $tag->name, ($tag->count) ? sprintf($tag_count_pattern, $tag->count) : '' ); } echo $before_widget; echo $before_title . 'Теги' . $after_title; printf($tags_ul_pattern, $tags_li); echo $after_widget; } // Register widgets: register_sidebar_widget('Теги', 'widget_tags'); [/sourcecode]

    Если вы пытались отобразить облако в виде списка, то должны были столкнуться с функцией wp_tag_cloud(), но от нее ничего не добьешься. Функция get_tags() позволяет управлять полученными данными и при этом обладает такими же параметрами как и wp_tag_cloud(). Я использую сортировку тегов по популярности.

    В functions.php подключаем созданный нами виджет

    include ‘includes/widget_tags.php’;

    В админке в меню Дизайн пункте Виджеты появился наш нестандартный виджет – Теги. Подключаем (настроек у него нет) и оцениваем результат.

    tags-count5

    Теги выводятся списком. Обратите внимание на число в скобках – это количество постов, в которых встречается тег.

    Теперь усложняем задачу – предполагаем, что у вас несколько сайдбаров (к примеру 2). Тогда корректируем functions.php:

    [sourcecode language='php']
     'first',
            'before_widget' => '
    
    ', 'after_widget' => '
    ', 'before_title' => '

    ', 'after_title' => '

    ', )); register_sidebar(array( 'name' => 'second', 'before_widget' => '', 'after_widget' => '', 'before_title' => '', 'after_title' => '', )); } ?> [/sourcecode]

    Как видите, во втором сайдбаре нет никаких тегов, классов. Это не ошибка. Вы можете не оборачивать заголовок виджета и список, тогда у вас будет просто текст (а не заголовок h2, как в первом случае) и просто список.

    В корне папки с темой создаем два файла sidebar-first.php и sidebar-second.php с таким содержимым:

    [sourcecode language='php']
    
    
    
    
    [/sourcecode]

    Первый отличается от второго именем файла (если sidebar-first.php, то используется ‘first’, если  sidebar-second.php, то используется  ‘second’) в строке

    || !dynamic_sidebar(‘first’) ) : ?>

    Если вам понадобится больше сайдбаров, то вы знаете как увеличить их число – создаем нужное количество файлов sidebar-*, не забываем их регистрировать в functions.php, указывая номер.

    Для отображения двух сайдбаров заменяем в index.php строку

    <?php get_sidebar(); ?>

    на две

    <?php get_sidebar(‘first’); ?>
    <?php get_sidebar(‘second’); ?>

    и в админке настраиваем оба сайдбара, добавив виджеты.

    two-sidebars-tags5

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

    Комментарии

    Avtogiro

    в 13:06, 29.03.2010

    Который раз уже убеждаюсь в том, что много клонов тут.

    Spacereal

    в 12:05, 13.04.2010

    Зачем писать такое, можно и подумать иногда.

    Какая талантливая мысль

    Оставить комментарий