Пишем плагин-виджет для WordPress с использованием нового Widgets API

29 Июн
2009

Одно из основных нововведений WordPress 2.8 это новый API для создания виджетов, делающий создание виджетов очень простым. Я расскажу, как сделать плагин добавляющий виджет на примере плагина-виджета “будущие посты”.

Для начала немного о том, как работает новый API.

Теория

Начиная с WordPress 2.8 виджет, это не просто набор функций. Виджет, это класс наследующий класс WordPress под названием WP_Widget, в php как и в любом ООП языке программирования, класс наследник получает методы класса родителя. Проще говоря в своем виджете мы можем пользоваться уже готовыми функциями написанными разработчиками Вордпресс в классе WP_Widget.

Практика

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


<?php
/*
Plugin Name: Future Posts
*/
?>
<?

class FuturePosts extends WP_Widget {
function FuturePosts() {
parent::WP_Widget(false, $name = 'Future Posts');
}

function widget($args, $instance) {
extract( $args );
?>
<?php echo $before_title
. $instance['title']
. $after_title;
query_posts('order=ASC&post_status=future');
while (have_posts()) : the_post(); ?>
<li><?php the_title();?></li>
<?php endwhile; ?>

<?php
}

function update($new_instance, $old_instance) {
return $new_instance;
}

function form($instance) {
$title = esc_attr($instance['title']);
?>

<p>
<label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?>
<input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" />
</label>
</p>

<?php
}

}
add_action('widgets_init', create_function('', 'return register_widget("FuturePosts");'));

?>

По большому счету всё поведение виджета описано в трех функциях, widget – непосредственно вывод виджета в блог, update – обновление виджета, form – форма изменения настроек виджета в панели администрирования. Найдя эти функции в вашем виджете, WordPress сам сделает остальное, выведет текст виджета в блог, запишет данные в БД, сделает форму управления виджетом. По большому счету виджету для работы достаточно функции


function widget() {

echo "Я виджет";

}

всё остальное уже сделано за нас разработчиками.

Для каждого виджета wordpress автоматически создает поле в таблице БД и записывает туда все данные о виджете, включая все переменные, отправленные через форму. Эти данные доступны в функциях плагина через массив $instance.

Рассмотрим код плагина подробно.


<?php
/*
Plugin Name: Future Posts
*/
?>

Эта часть необходима для того, что бы WordPress понял, что файл является плагином, в Plugin Name нужно написать название нашего плагина.


class FuturePosts extends WP_Widget {

Эта строка открыавет класс нашего виджета и наследует его от WP_Widget, все функции нашего виджета будут находится в этом классе.


function FuturePosts() {
parent::WP_Widget(false, $name = 'Future Posts');
}

Функция конструктор необходимая для создания виджета, как вы наверное уже догадались, $name = ‘Future Posts’ это название нашего виджета. Название этой функции должно совпадать с названием класса.

Функция widget – непосредственно функция вывода виджета в блог. Функция выводит

заголовок, который берется из БД через массив $instance, если заголовок не определен, это не вызовет ошибок.


echo $before_title
. $instance['title']
. $after_title;

а затем список постов, запрошенных при помощи стандартной функции wordpress query_posts


query_posts('order=ASC&post_status=future');
while (have_posts()) : the_post(); ?>
<li><?php the_title();?></li>
<?php endwhile; ?>

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


function update($new_instance, $old_instance) {
return $new_instance;
}

WordPress пишем widget

Функция form является панелью управления нашим виджетом, рассмотрим подробнее, что в ней происходит


$title = esc_attr($instance['title']);

Эта строчка получает заголовок нашего виджета, если он есть в БД.


<label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?>
<input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" />
</label>

А дальше идет простое поле обычной HTML формы для ввода заголовка нашего виджета, если заголовок уже есть в БД он будет виден в форме. После отправки формы, заголовок будет автоматически записан в БД. Предположим, под заговоком мы хотим разместить описание виджета, достаточно добавить в форму еще одно поле для ввода описания и оно будет записано в БД при отправке формы и будет доступно, как и другие переменные виджета в массиве $instance, в том числе из функции widget.

И последний шаг, наш виджет нужно включить, для этого после класса нашего виджета находится строка указывающая на то, что наш класс “FuturePosts” необходимо зарегистрировать.


add_action('widgets_init', create_function('', 'return register_widget("FuturePosts");'));

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

Вот несколько ссылок, которые помогут в создании виджетов:

Страница официальной документации по новому API

Код стандартных виджетов с использованием нового API

Код класса WP_Widget, все функции достаточно подробно описаны

Похожие посты:

  1. 24 WordPress хака от WPEngineer
  2. Плагин “Будущие посты”
  3. Использование стилей в зависимости от контекста в WordPress
  4. Шпаргалка по WordPress

11 Комментариев к статье Пишем плагин-виджет для WordPress с использованием нового Widgets API

Avatar

Jekyll

29th Июнь 2009 в 12:47

Есть у меня мысль сделать один плагин к WP, но сам я от программирования далек.Поэтому хочу задать глупый вопрос – насколько сложно разобраться в PHP и WP API на уровне, достаточном для выполнения задуманного? Понимаю, что при желании можно все сделать, но, может будут какие-либо советы?

Avatar

Wordpresser

29th Июнь 2009 в 13:14

@Jekyll
Все зависит от того, что хотите реализовать, в принципе выше вполне рабочий плагин, можно сделать по аналогии, все функции php и wp хорошо документированны. Есть и сложные плагины, что бы такой написать нужно хорошо владеть php

Avatar

Flex Guy

30th Июнь 2009 в 12:49

Спасибо. Очень интересная статья. Надо будет попробывать сделать что нибудь. ;)

Avatar

trendbender

30th Июнь 2009 в 17:04

круто)

Avatar

Илья

19th Июль 2009 в 20:40

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

Avatar

Wordpresser

20th Июль 2009 в 09:17

@Илья
Илья, не очень понял, что вы хотите узнать. Вобще файл плагина загружается на сайт а потом в админке включается плагин.

Avatar

post

1st Сентябрь 2009 в 06:43

Спасибо! Сделал свой плагин на основе Вашего примера

Avatar

Wordpresser

1st Сентябрь 2009 в 12:45

post :

Спасибо! Сделал свой плагин на основе Вашего примера

Рад что моя статья помогла!

Avatar

RaftKorn

27th Май 2010 в 09:53

Wordpresser, подскажите – как сделать так, чтоб при отключении виджета, и повторном его включении сохранялись введенные в нем ранее данные?

Avatar

wordpresser.ru

27th Май 2010 в 21:29

RaftKorn, вообще по идее содержимое виджета должно сохранятся, так как хранится эта информация в базе.

Avatar

Артем

18th Июнь 2010 в 14:42

Помогите найти нужный плагин!!!! Нигде его не видел, уже месяц ищу…

Плагин который для каждой страницы создает виджет с html кодом конкретно для данной страницы. Я сам заполняю html для каждой страницы (ну или поста). Это нужно для того, чтобы я мог прикреплять ссылки или постовые не к посту снизу, а выводить сбоку в виджете!

Ответьте пожалуйста!!! Спасибо.

Оставить комментарий к "Пишем плагин-виджет для WordPress с использованием нового Widgets API"

Наверх