Создаем виджеты для Wordpress

В предыдущей статье мы рассмотрели функции WordPress API, предназначенные для работы с виджетами и динамическими сайдбарами. Теперь мы займёмся самим процессом создания виджетов, их настройкой и показом на сайте.

Добавить виджет можно двумя способами:

  1. добавив код в файл functions.php текущей темы;
  2. создав плагин с кодом виджета.

Эти два способа создания виджетов мы и рассмотрим в данной статье на примере добавления виджета, заменяющего стандартный виджет Meta, выводящий несколько ссылок в колонке вашего блога.

При этом подразумевается, что ваша тема поддерживает работу с динамическими сайдбарами и виджетами. Если же это не так, то вам необходимо добавить поддержку виджетов в вашу тему, как это сделать можно прочитать в моей статье "Делаем тему для WordPress виджет-совместимой".


Определение, активизация и деактивизация виджета в файле functions.php активной темы

Добавление виджета в файл functions.php, на мой взгляд, является самым простым способом создания виджетов. Хотя таким способом, я читаю, лучше добавлять только простые виджеты, использующие либо стандартные функции, либо функции из плагинов, и лучше только виджеты, разработанные специально для конкретной темы. Если же виджет должен самостоятельно проводить большую работу с данными и будем большим по объёму кода и является универсальным, то его необходимо добавлять с помощью плагина. Это позволит, один раз подключив плагин, показывать виджет при включении любой темы.

Попробуем написать виджет, который заменит стандартный виджет Meta(Мета).

Стандартный виджет выводит список ссылок: Вход(если вы не вошли), Панель управления, Выход(если вы уже залогинились), Записи в RSS, RSS-лента комментариев, WordPress.org.

Я хочу, чтобы мой виджет Meta выводил только первые 3 ссылки, а для RSS ссылок я хочу сделать отдельный виджет.

Для начала создаём файл functions.php(если его еще нет) в корне каталога темы, т.е. он должен находится по пути вроде такого:

/home/пользователь/public_html/wp-content/themes/имя_темы/functions.php

В этот файл пока добавляем только две строки:

<?php
?>

Добавляем в него callback-функцию, которая будет использована для регистрации виджета:

function a2p_themename_widget_meta($args) {
    extract($args, EXTR_SKIP);
    $options = get_option('a2p_themename_widget_meta');
    $title = empty($options['title']) ? 'Meta' : $options['title'];    
?>
        <?php echo $before_widget?>
            <?php echo $before_title $title $after_title?>
            <ul>
                <?php wp_register() ?>
                <li><?php wp_loginout() ?></li>
                <?php wp_meta() ?>
            </ul>
        <?php echo $after_widget?>
<?php
}

Данная функция соответствует рекомендуемому шаблону написания виджетов. Функция принимает один аргумент $args, который представляет из себя ассоциативный массив, элементы которого перечислены выше при описании функции register_sidebar. Этот массив преобразуется в локальные переменные PHP функцией extract.

Во второй строке функции мы получаем значения опций, задаваемые при настройке виджета, если он это поддерживает. В нашем случае, мы получаем значение для заголовка виджета.

Для того, чтобы иметь возможность задавать заголовок для виджета на странице управления виджетами, нам необходимо еще написать и зарегистрировать callback-функцию, отвечающую за вывод формы настройки виджета. Создаем эту функцию:

function a2p_themename_widget_meta_control() {
    $options = $newoptions = get_option('a2p_themename_widget_meta');
    if ( $_POST["a2p_themename_meta-submit"] ) {
        $newoptions['title'] = strip_tags(stripslashes($_POST["a2p_themename_meta-title"]));
    }
    if ( $options != $newoptions ) {
        $options = $newoptions;
        update_option('a2p_themename_widget_meta', $options);
    }
    $title = htmlspecialchars($options['title'], ENT_QUOTES);
?>
            <p><label for="a2p_themename_meta-title"><?php _e('Title:'); ?> <input style="width: 250px;" id="a2p_themename_meta-title" name="a2p_themename_meta-title" type="text" value="<?php echo $title?>" /></label></p>
            <input type="hidden" id="a2p_themename_meta-submit" name="a2p_themename_meta-submit" value="1" />
<?php
}

В этой функции мы выводим только необходимые поля ввода. Формирование тэга form и отправка формы производится самой системой. Если параметры изменены, они сохраняются.

Теперь мы должны зарегистрировать обе callback-функции. Регистрация виджетов и контролов должна проводится только после описания самих функций.

register_sidebar_widget('Meta', 'a2p_themename_widget_meta');
register_widget_control('Meta', 'a2p_themename_widget_meta_control', 300, 90);

При регистрации контрола, третий и четвёртый параметр задают соответственно ширину и высоту формы настройки виджета.

Все, теперь вы можете зайти на страницу управления виджетами, перетащить виджет с именем Meta в колонку, кликнуть на иконку настройки и задать заголовок для виджета. После нажатия на кнопку "Сохранить изменения", наш виджет должен появится в выбранной колонке и с заданным заголовком.

Содержание файла functions.php, при условии, что он создан нами, должно получится таким:

<?php
function a2p_themename_widget_meta($args) {
    
extract($argsEXTR_SKIP);
    
$options get_option('a2p_themename_widget_meta');
    
$title = empty($options['title']) ? 'Meta' $options['title'];    
?>
        <?php echo $before_widget?>
            <?php echo $before_title $title $after_title?>
            <ul>
                <?php wp_register() ?>
                <li><?php wp_loginout() ?></li>
                <?php wp_meta() ?>
            </ul>
        <?php echo $after_widget?>
<?php
}

function 
a2p_themename_widget_meta_control() {
    
$options $newoptions get_option('a2p_themename_widget_meta');
    if ( 
$_POST["a2p_themename_meta-submit"] ) {
        
$newoptions['title'] = strip_tags(stripslashes($_POST["a2p_themename_meta-title"]));
    }
    if ( 
$options != $newoptions ) {
        
$options $newoptions;
        
update_option('a2p_themename_widget_meta'$options);
    }
    
$title htmlspecialchars($options['title'], ENT_QUOTES);
?>
            <p><label for="a2p_themename_meta-title"><?php _e('Title:'); ?> <input style="width: 250px;" id="a2p_themename_meta-title" name="a2p_themename_meta-title" type="text" value="<?php echo $title?>" /></label></p>
            <input type="hidden" id="a2p_themename_meta-submit" name="a2p_themename_meta-submit" value="1" />
<?php
}

register_sidebar_widget('Meta''a2p_themename_widget_meta');
register_widget_control('Meta''a2p_themename_widget_meta_control'30090);
?>

Вот и все. Мы заменили стандартный виджет своим. В данном случае, замена произошла потому, что мы регистрировали свой виджет с тем же именем, что и имеющийся стандартный. Так как имена у виджета уникальные, то при регистрации виджета с тем же именем, что и у уже имеющегося виджета происходит замена callback-функции на последнюю указанную.

Контрол регистрируется с тем же именем что и виджет.

Не забывайте, что виджет созданный в файле functions.php темы доступен только при активизации именно этой темы. Иначе будет показываться стандартный виджет.
Для создания виджета для любой активной темы, мы создадим плагин, в котором опишем и зарегистрируем наш виджет.

Определение, активизация и деактивизация виджета в плагине

В плагин мы добавим тот же виджет, заменяющий стандартный виджет Meta. Поэтому, для чистоты эксперимента, код, добавленный в файл functions.php нужно закомментировать или включить другую тему.
Для добавления плагина, мы просто создадим файл со своим именем в каталоге
/home/пользователь/public_html/wp-content/plugins/
, например, a2p_meta_plugin.php в котором пропишем пока только тэги php-кода, а также обязательные комментарии, в которых указывается имя плагина, информация о создателе плагина и др.:

<?php
/*
Plugin Name: A2P Meta Plugin
Plugin URI: http://a2p.net.ru/
Description: Meta Widget.
Author: Alexey Apanovich
Version: 1.0
Author URI: http://a2p.net.ru/
*/ 

?>

Добавим теперь в этот файл код виджета(callback-функции) и контрола. Он будет аналогичен тому, что мы прописывали в файле functions.php, только с небольшими изменениями:

function a2p_plugin_widget_meta($args) {
    extract($args, EXTR_SKIP);
    $options = get_option('a2p_plugin_widget_meta');
    $title = empty($options['title']) ? 'Meta' : $options['title'];    
?>
        <?php echo $before_widget?>
            <?php echo $before_title $title $after_title?>
            <ul>
                <?php wp_register() ?>
                <li><?php wp_loginout() ?></li>
                <?php wp_meta() ?>
            </ul>
        <?php echo $after_widget?>
<?php
}

function 
a2p_plugin_widget_meta_control() {
    
$options $newoptions get_option('a2p_plugin_widget_meta');
    if ( 
$_POST["a2p_plugin_meta-submit"] ) {
        
$newoptions['title'] = strip_tags(stripslashes($_POST["a2p_plugin_meta-title"]));
    }
    if ( 
$options != $newoptions ) {
        
$options $newoptions;
        
update_option('a2p_plugin_widget_meta'$options);
    }
    
$title htmlspecialchars($options['title'], ENT_QUOTES);
?>
            <p><label for="a2p_plugin_meta-title"><?php _e('Title:'); ?> <input style="width: 250px;" id="a2p_plugin_meta-title" name="a2p_plugin_meta-title" type="text" value="<?php echo $title?>" /></label></p>
            <input type="hidden" id="a2p_plugin_meta-submit" name="a2p_plugin_meta-submit" value="1" />
<?php
}

Далее нам необходимо зарегистрировать вышеприведенные функции. Это можно было сделать так же, как мы сделали в файле functions.php. Но здесь я приведу более надежный вариант. Так как очень часто виджеты могут использовать функции, описанные в других плагинах или библиотеках, необходимо быть уверенным, что при регистрации callback-функции, все необходимые файлы уже загружены. Для этого мы можем использовать механизм хуков(hooks). Данный механизм позволяет "навесить" вашу функцию на какое-либо событие(action) или обработку данных(filter). Подробнее про это можно прочитать на сайте WordPress Codex.

Мы используем хук для события "init", которое вызывается после загрузки всех файлов, но перед отправкой каких-либо заголовков. Таким образом, мы должны определить функцию, в которой будет проводится регистрация виджета и контрола и "навесить" эту функцию на событие "init":

function a2p_plugin_init() {
    register_sidebar_widget('Meta', 'a2p_plugin_widget_meta');
    register_widget_control('Meta', 'a2p_plugin_widget_meta_control', 300, 90);
}

add_action('init', 'a2p_plugin_init');

Все содержание файла плагина должно получится таким:

<?php
/*
Plugin Name: A2P Meta Plugin
Plugin URI: http://a2p.net.ru/
Description: Meta Widget.
Author: Alexey Apanovich
Version: 1.0
Author URI: http://a2p.net.ru/
*/ 

function a2p_plugin_widget_meta($args) {
    
extract($argsEXTR_SKIP);
    
$options get_option('a2p_plugin_widget_meta');
    
$title = empty($options['title']) ? 'Meta' $options['title'];    
?>
        <?php echo $before_widget?>
            <?php echo $before_title $title $after_title?>
            <ul>
                <?php wp_register() ?>
                <li><?php wp_loginout() ?></li>
                <?php wp_meta() ?>
            </ul>
        <?php echo $after_widget?>
<?php
}

function 
a2p_plugin_widget_meta_control() {
    
$options $newoptions get_option('a2p_plugin_widget_meta');
    if ( 
$_POST["a2p_plugin_meta-submit"] ) {
        
$newoptions['title'] = strip_tags(stripslashes($_POST["a2p_plugin_meta-title"]));
    }
    if ( 
$options != $newoptions ) {
        
$options $newoptions;
        
update_option('a2p_plugin_widget_meta'$options);
    }
    
$title htmlspecialchars($options['title'], ENT_QUOTES);
?>
            <p><label for="a2p_plugin_meta-title"><?php _e('Title:'); ?> <input style="width: 250px;" id="a2p_plugin_meta-title" name="a2p_plugin_meta-title" type="text" value="<?php echo $title?>" /></label></p>
            <input type="hidden" id="a2p_plugin_meta-submit" name="a2p_plugin_meta-submit" value="1" />
<?php
}

function 
a2p_plugin_init() {
    
register_sidebar_widget('Meta''a2p_plugin_widget_meta');
    
register_widget_control('Meta''a2p_plugin_widget_meta_control'30090);
}

add_action('init''a2p_plugin_init');
?>

После сохранения файла, переходим на страницу управления плагинами и активизируем наш плагин. Теперь, если перейти к управлению виджетами, можно увидеть, что наш виджет показывается в блоке доступных виджетов. При этом он будет доступен независимо от выбранной темы.

На этом я, пожалуй, и завершу свое описание процесса создания виджетов. Готов ответить на любые вопросы, которые могут возникнуть при попытке применения того, что я тут написал.

Комментариев: 14

  1. Дата: Сентябрь 6, 2007, 23:28 | Ссылка

    Спасибо за статью огромное

  2. Дата: Сентябрь 22, 2007, 09:48 | Ссылка

    Big thanks…
    благодаря вашей статье быстро написал собственный простенький виджет для добавления на блог поисковой формы яндекса.

  3. Дата: Сентябрь 22, 2007, 10:12 | Ссылка

    Только я бы функцию a2p_plugin_init()
    назвал подругому…
    а то припопытке создания второго плагина получился сюрприз :)

  4. Дата: Май 14, 2008, 11:49 | Ссылка

    Приятная статья, мне даже очень и очень понравилось!
    Полезные скрипты, надо взять на вооружение. Спасибо!

    Не в тему, замечательно, что у вас комментарии отделены от трекбеков.

  5. Дата: Июль 5, 2008, 10:44 | Ссылка

    Статья супер, оч много для себя нашел.

  6. Дата: Июль 6, 2008, 14:00 | Ссылка

    Спасибо, пригодилось

  7. Дата: Июль 24, 2008, 18:14 | Ссылка

    Спасибо за информацию. Пригодилась.

  8. Дата: Июль 25, 2008, 12:29 | Ссылка

    Да уж, супер. Вот только непонятно, смеяться или плакать…

  9. Дата: Июль 25, 2008, 16:15 | Ссылка

    Спасибо за отличный материал Вам! Буду у Вас частым гостем)

  10. Дата: Август 1, 2008, 12:13 | Ссылка

    статья конечно интересная. огорчает, только, что таких на сегодняшнее время маловато:(

  11. Дата: Август 28, 2008, 15:00 | Ссылка

    Прекрасный блог, прошу вас и дальше писать столь интересно и вразмутельно. Сейчас сам захотел заняться парой проектов - не простое это дело, уходит все свободное время.

  12. Дата: Сентябрь 5, 2008, 13:11 | Ссылка

    Всем спасибо за ссылки, пригодилось.

  13. Дата: Сентябрь 29, 2008, 20:04 | Ссылка

    Отличный блог, подобраны интересные статьи. Мне почти все в нем нравится, а над дизайном надо немного паработать ;-)

  14. Дата: Ноябрь 12, 2008, 17:44 | Ссылка

    Давно не встречал такой подробной статьи.

На эту страницу размещено 4 ссылок

  1. Дата: Июль 2, 2007, 18:19

    Создаем виджеты для Wordpress […]

  2. Дата: Сентябрь 22, 2007, 10:25

    […] о создании виджетов можно почитать здесь. Очень хороший материал. Если раньше по поводу и без […]

  3. Дата: Сентябрь 25, 2007, 00:00

    […] о создании виджетов можно почитать здесь. Очень хороший материал. Если раньше по поводу и без […]

  4. Дата: Октябрь 4, 2008, 22:49

    […] В предыдущей статье мы рассмотрели функции WordPress API, предназначенные для работы с виджетами и динамическими сайдбарами. Теперь мы займёмся самим процессом создания виджетов, их настройкой и показом на сайте. Статья находится по аресу [http://a2p.net.ru/wordpress/17/widgets_creation/] […]

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

Обязательные поля отмечены знаком *

*
*

Powered by WP Hashcash

аватары баги безопасность беларусь блог браузер браузеры верстка виджеты закладки интерфейсы контекст монетизация плагины программирование раскрутка ссылки статистика темы топ формы хостинг шаблоны яндекс .htaccess api b2evolution bookmarks bugs chrome code CPanel CSS error exploit firefox freeBSD Google gravatar gzip HTML JavaScript linux mod-rewrite MySQL ob-start PHP plugins rss sape.ru SEO sitemap sniplets sql tar TinyMCE utf8 wget widgets WordPress WYSIWYG xmlrpc yandex