LXF103:WordPress на свой лад
|
|
|
- Плагин за 10 минут Расширяем функциональность самого популярного в мире блог-движка
Содержание |
Пишем плагин для WordPress
- Считаете, что WordPress хорош, но ему не достает одной ма-а-а-аленькой штучки? Или просто хотите прославиться на весь мир свободного ПО? Валентин Развозжаев научит, что нужно делать.
На сегодняшний день WordPress является самым популярным блоговым движком с открытым исходным кодом – именно ему отдают предпочтение более 70% пользователей, ведущих автономные сетевые дневники. Движок прост в установке, очень удобен, для него написано огромное количество плагинов, способных удовлетворить все мыслимые и немыслимые потребности пользователей (LXF99). Но что делать, если нужного вам плагина еще нет? Напишите его сами! В качестве примера мы рассмотрим простенький плагин, добавляющий рекламный блок в конце каждой записи. HTML- код блока можно будет задать в настройках плагина в административной панели.
Плагины в Wordpress
Все плагины Wordpress находятся в каталоге wp-content/plugins/. Для того, чтобы сдобавить еще один, нужно скопировать файлы плагина в этот каталог и активировать плагин в панели управления администратора (Плагины > Плагины > Управление плагинами).
При этом для каждого плагина желательно придерживаться следующей структуры каталогов:
- Каталог плагина >
- Основной файл плагина
- Подкаталог js (скрипты JavaScript)
- Подкаталог css (таблицы стилей CSS)
- Подкаталог php (остальные файлы)
Если весь код плагина содержится в одном файле, то можно просто скопировать его в каталог wp-content/plugins/.
После того, как вы активируете плагин, его код будет загружаться на каждой странице Wordpress, поэтому с добавлением большого количества плагинов работа движка замедляется.
Скелет модуля
Основной файл плагина начинается с блока комментария, который содержит название, версию и URI плагина, а также сведения об авторе.
Для нашего плагина он будет выглядеть так:
<?php /* Plugin Name: SimpleAdvert Plugin URI: http://www.pluginsite.com/simpleadvert Description: A plugin that adds advertising block to the end of each topic. Author: homo.creativus Version: 1.0 Author URI: http://www.authorsite.com */ ?>
Этот блок обязателен: если его нет, то плагин не будет добавлен в список плагинов административной панели.
Во избежание конфликтов в именах функций, для каждого плагина желательно создавать отдельный класс:
if (!class_exists( “SimpleAdvert”)) { class SimpleAdvert { function SimpleAdvert() { // конструктор ... } } }
После объявления класса плагина следует создать объект:
if (class_exists( “SimpleAdvert”)) { $simple_advert = new SimpleAdvert(); }
А затем нужно объявить обработчики событий Wordpress и фильтры:
if (isset($simple_advert)) { // Обработчики событий ... // Фильтры ... }
Ими-то мы сейчас и займемся.
Реагируем на внешний мир
В Wordpress есть стандартные события (например, публикация поста, изменение темы или открытие страницы в административной панели), которые при необходимости можно обработать, вызвав одну из функций плагина. Вызываемая функция может выполнить следующие действия:
- записать данные в БД;
- отправить сообщение электронной почты;
- изменить содержимое загружаемой страницы.
Для добавления обработчика используется функция add_action:
add_action('hook_name','your_function_name',[priority],[accepted_args]);
Рассмотрим ее параметры:
- 'hook_name – событие, которое будет обработано (некоторые события приведены ниже, а их полный список можно найти на странице http://codex.wordpress.org/Plugin_API/Action_Reference);
- your_function_name – имя функции плагина, которая будет вызвана для обработки события;
- priority – необязательный параметр, отвечающий за то, в каком порядке будут вызваны функции, обрабатывающие конкретное событие; по умолчанию приоритет равен десяти; функции с меньшим значением приоритета будут вызваны раньше других;
- accepted_args – число параметров функции (по умолчанию 1).
В свою очередь, фильтры – это специальные функции, которые производят промежуточную обработку данных перед их записью в БД или отображением на экране. При генерации страниц фильтры являются промежуточным звеном между БД и браузером, а при создании или изменении записей и комментариев – между браузером и БД. Большинство потоков данных в Wordpress проходят по меньшей мере через один фильтр.
Для добавления фильтра используется функция add_filter:
add_filter('hook_name', 'your_filter', [priority], [accepted_args]);
Здесь hook_name – используемый фильтр (некоторые из них приведены ниже, а полный список – на странице http://codex.wordpress.org/Plugin_API/Filter_Reference), your_function_name – имя функции плагина, которая будет вызвана, аргументы priority и accepted_args имеют тот же смысл, что и в функции add_action.
В нашем плагине мы используем фильтр the_content для добавления рекламного блока в конец каждой записи:
add_filter('the_content', 'AddAdvertFilter');
Функция AddAdvertFilter будет содержать код для добавления рекламного блока:
function addAdvert($content = '') { global $simple_advert; $code = get_option($simple_advert->adminOptionName); $content .= “<p>$code</p>”; return $content; }
Взаимодействие с БД
Существует два способа взаимодействия плагина с базой данных Wordpress: с помощью опций и через объект базы данных.
Опция представляет собой пару «имя – значение» и хранится в таблице wp_options. Имя опции должно быть уникальным.
Функция add_option($name, $value, $description, $autoload)
добавляет в базу данных опцию с именем $name и значением $value. Параметр $description содержит описание опции, параметр $autoload ('yes', 'no') определяет, будет ли значение опции получено автоматически функцией get_alloptions.
Чтобы получить значение опции, используется функция
get_option($name);
Функция update_option($option_name, $newvalue) обновляет значение существующей опции.
Для работы с БД через объект базы данных нужно объявить ссылку на этот объект в функции плагина:
function sample_function() { global $wpdb; $request = “SELECT post_id,post_title FROM $wpdb->posts”; $results = $wpdb->get_results($request); ... }
Наш плагин будет использовать единственную опцию simpleadvert_code, содержащую код рекламного блока:
add_option('simpleadvert_code', );
Чтобы пользователь мог ввести рекламный код, нам придется поработать с административной панелью.
Прикрутим интерфейс
Перед тем, как создать страницу с настройками плагина в административной панели, давайте вкратце разберем принцип ее работы.
На странице находится форма для ввода настроек и кнопка, при нажатии на которую эти настройки сохраняются в БД, а страница перегружается. При каждой загрузке страницы выполняются следующие действия:
- Проверяется, ввел ли пользователь данные в форму (при сохранении настроек).
- Если в форму были введены данные, то настройки сохраняются в БД и выводится сообщение о том, что настройки обновлены.
- Выводится форма для ввода настроек плагина.
Все эти действия реализует функция printAdminPage, которая и генерирует страничку с настройками. Вот ее код:
function printAdminPage() { $Option = $this->getAdminOption(); if (isset($_POST['update_simpleAdvertSettings'])) { if (isset($_POST['simpleadvert_code'])) { $Option = $_POST['simpleadvert_ code']; } update_option($this->adminOptionsName, $Option); ?><div class=»updated»><p><strong><?php _e(«Settings Updated.»,»SimpleAdvert»);?></strong></p></div><?php } ?> <div class=wrap> <form method=»post» action=»<?php echo $_ SERVER[«REQUEST_URI»]; ?>»> <h2>Simple Advert</h2> <h3>Advert Code to Add to the End of a Post</h3> <textarea name=»simpleadvert_code» style=»width: 80%; height: 100px;»></textarea> <div class=”submit”> <input type=»submit» name=»update_simpleAdvertSettings» value=»<?php _e('Update Settings', 'SimpleAdvert') ?>» /></div> </form> </div> <?php }
Чтобы добавить страницу в административный раздел, необходимо вызывать функцию add_options_page и передать ей ссылку на функцию printAdminPage:
if (!function_exists( “SimpleAdvert_ap”)) { function SimpleAdvert_ap() { global $simple_advert; if (!isset($simple_advert)) { return; } if (function_exists('add_options_page')) { add_options_page('Simple Advert', 'Simple Advert', 9, basename(__FILE__), array(&$simple_advert, 'printAdminPage')); } } }
Кроме этого нужно зарегистрировать функцию SimpleAdvert_ap в качестве обработчика события admin_menu:
add_action('admin_menu', 'SimpleAdvert_ap');
Готово. Скопируйте исходный файл плагина (его можно найти на нашем DVD) в каталог wp-content/plugins и активируйте его в административной панели. В настройках плагина (Настройки > Simple Advert) задайте код рекламного блока и нажмите на кнопку Update Settings. После этого выбранный вами рекламный блок будет появляться в конце каждой записи.
В заключение
Итак, мы написали простейший плагин для Wordpress. Вооружившись полученными сегодня знаниями, вы вполне сможете написать свой плагин или доработать уже существующий. Подробную документацию по разработке плагинов для Wordpress можно найти на странице http://codex.wordpress.org/Writing_a_Plugin. Удачного кодирования! LXF
События
Действие | Описание | Параметры функции плагина |
---|---|---|
Edit_post | Вызывается при изменении записи или страницы (включая добавление или удаление комментариев) | ID записи или страницы |
publish_post | Вызывается при публикации записи или при редактировании уже опубликованной заметки | ID записи |
save_post | Вызывается при сохранении или обновлении записи или страницы | ID записи или страницы |
delete_post | Вызывается при удалении записи или страницы | ID записи или страницы |
comment_post | Вызывается после добавления нового комментария в базу данных | ID комментария и его статус («spam», 0 – отклонен, 1 – одобрен) |
edit_comment | Вызывается после изменения комментария в базе данных | ID комментария |
delete_comment | Вызывается перед удалением комментария из базы данных | ID комментария |
switch_theme | Вызывается при изменении текущей темы | Название новой темы |
wp_login | Вызывается при входе пользователя в систему | Нет |
wp_logout | Вызывается при выходе пользователя из системы | Нет |
Фильтры
Действие | Описание | Параметры функции плагина |
---|---|---|
content_edit_pre | Применяется к содержимому записи перед ее открытием для редактирования | Нет |
the_content | Применяется к содержимому записи, полученному из БД, перед ее отображением на экране | Нет |
title_edit_pre | Применяется к названию записи перед ее открытием для редактирования | Нет |
the_title | Применяется к названию записи, полученному из БД, перед ее отображением на экране | Нет |
content_save_pre | Применяется к содержимому записи перед ее сохранением в БД | Нет |
title_save_pre | Применяется к названию записи перед ее сохранением в БД | Нет |
comment_text | Применяется к тексту комментария, полученному из БД, перед его отображением на экране | Нет |
pre_comment_content | Применяется к тексту комментария перед его сохранением в БД | Нет |
the_permalink | Применяется к постоянной ссылке перед вызовом одноименной функции | Нет |