Журнал LinuxFormat - перейти на главную

LXF103:WordPress на свой лад

Материал из Linuxformat
Перейти к: навигация, поиск
Плагин за 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', );

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

Прикрутим интерфейс

Перед тем, как создать страницу с настройками плагина в административной панели, давайте вкратце разберем принцип ее работы.

На странице находится форма для ввода настроек и кнопка, при нажатии на которую эти настройки сохраняются в БД, а страница перегружается. При каждой загрузке страницы выполняются следующие действия:

  1. Проверяется, ввел ли пользователь данные в форму (при сохранении настроек).
  2. Если в форму были введены данные, то настройки сохраняются в БД и выводится сообщение о том, что настройки обновлены.
  3. Выводится форма для ввода настроек плагина.

Все эти действия реализует функция 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 Применяется к постоянной ссылке перед вызовом одноименной функции Нет
Персональные инструменты
купить
подписаться
Яндекс.Метрика