Как создать плагин для WordPress

WordPress плагин – это PHP-скрипт, который вносит изменения в Ваш сайт. Это может быть небольшое нововведение в шапке сайта или же более радикальные преобразования (такие как, работа системы авторизации, автоматическая рассылка электронных писем и многое другое).

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

Тема или плагин?

Если Вы когда-либо настраивали темы вручную, то, вероятно, знаете, что существует файл functions.php, который предоставляет Вам множество возможностей и позволяет создавать разнообразный функционал в теме. Так какой же тогда смысл в плагине, если есть этот замечательный файл functions.php? Когда использовать тему, а когда плагин?

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

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

Создание первого плагина

Всё, что нужно для создания плагина – создать папку и один файл внутри неё с содержанием в одну строку. Перейдите к wp-content/plugins и создайте новую папку с именем awesomeplugin. Внутри новой папки создайте файл с именем awesomeplugin.php. Откройте его в текстовом редакторе и скопируйте в него следующий фрагмент кода:

<?php
   /*
   Plugin Name: Awesomeness Creator
   Plugin URI: http://my-awesomeness-emporium.com
   Description: a plugin to create awesomeness and spread joy
   Version: 1.2
   Author: Mr. Awesome
   Author URI: http://mrtotallyawesome.com
   License: GPL2
   */
?>

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

Теперь осталось только активировать созданный плагин. Это всё! Конечно же, этот плагин бесполезен, но он активен и корректно создан.

Создание структуры плагина

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

Если функционал Вашего плагина базируется на одном основном классе, то лучшим вариантом будет вынести его в отдельный файл, а дополнительные функции разместить в других файлах. Для CSS иJavaScript-файлов имеет смысл создать отдельные папки.

Нужно стремиться к тому, чтобы найти золотую середину между правильной структурой, удобством в использовании и минимализмом. Разделите код плагина на несколько файлов в том случае, если это действительно необходимо, не нужно относиться к этому с фанатизмом. Думаем, Вам будет полезно взглянуть на структуру таких популярных плагинов как WP-PageNavi и Akismet.

Наименование плагина и его функций

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

Распространённым решением этой проблемы является использование уникальных префиксов. Вы можете использовать название “my_blognews” или что-то в этом роде, имеющее низкую вероятность быть продублированным.

Безопасность плагина

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

Безопасность Вашего плагина зависит от двух основных составляющихПервая составляющая заключается в фильтрации и экранировании данных, которые были введены пользователями. Это защитит от SQL-инъекций и подобных атак. Вторая составляющаязаключается в том, чтобы ограничить пользователей, не имеющих соответствующих привилегий от выполнения действий. Имеется в виду, что только администраторы и модераторы должны иметь доступ к удалению и редактированию содержимого сайта.

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

Очистка после удаления плагина

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

WordPress предоставляет три отличных хука, которые помогут позаботиться об этом:

  • register_activation_hook()
    Этот хук позволяет создать функцию, которая запускается сразу же после активации плагина. Он принимает путь к главному файлу плагина в качестве первого аргумента и функцию, которую Вы хотите использовать в качестве второго. Этот хук можно использовать для проверки обновлений для плагина, проверки используемой версии PHP и т.д.
  • register_deactivation_hook()
    Название говорит само за себя. Функция будет запущена сразу же после деактивации плагина. Держите этот хук в рукаве на всякий случай.
  • register_uninstall_hook()
    Этот хук срабатывает, когда плагин полностью удалён из WordPress. Он сообщает нам о самом подходящем моменте для удаления данных, которые использовались плагином.

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

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

Документация и стандарты кода

Если Вы разрабатываете плагин для большого сообщества, то документирование кода является хорошей манерой (и хорошей практикой). Для этого можно использовать phpDocumentor, например.

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

Хоть это и не так важно как документация, но следовать принятым в WordPress’ guidelines стандартам кода было бы неплохо.

Ближе к практике

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

Планирование

Перед тем, как заняться написанием кода, давайте тщательно всё спланируем и определим, какие функции нам понадобятся для правильной работы плагина. Вот что мы придумали:

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

Первые шаги

Сначала нужно создать папку для плагина и подготовить файловую структуру. Создайте новую папку с именем awesomely_popular. В этой папке создайте файл с именем awesomely_popular.php и добавьте в него примерно следующее содержимое:

<?php
   /*
   Plugin Name: Awesomely Popular
   Plugin URI: http://awesomelypopularplugin.com
   Description: A plugin that records post views and contains functions to easily list posts by popularity
   Version: 1.0
   Author: Mr. Awesome
   Author URI: http://mayawesomefillyourbelly.com
   License: GPL2
   */
?>

Запись количества показов статьи

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

/**
 * Adds a view to the post being viewed
 *
 * Finds the current views of a post and adds one to it by updating
 * the postmeta. The meta key used is "awepop_views".
 *
 * @global object $post The post object
 * @return integer $new_views The number of views the post has
 *
 */
function awepop_add_view() {
   if(is_single()) {
      global $post;
      $current_views = get_post_meta($post->ID, "awepop_views", true);
      if(!isset($current_views) OR empty($current_views) OR !is_numeric($current_views) ) {
         $current_views = 0;
      }
      $new_views = $current_views + 1;
      update_post_meta($post->ID, "awepop_views", $new_views);
      return $new_views;
   }
}

Как Вы, наверное, заметили, мы используем документирующий блок в стиле phpDocumentor перед функцией. Прежде всего, мы проверяем в условном выражении, какой тип страницы пользователь просматривает.

Если пользователь просматривает нужный нам тип страницы, мы воспользуемся объектом $post, который содержит информацию о текущей статье (идентификатор, название, дата публикации, количество комментариев и т.д.). Затем мы получаем количество просмотров, которое уже набрала эта статья, добавляем 1 к этому значению и перезаписываем информацию в базе данных. Для того, чтобы всё прошло максимально гладко, мы используем несколько проверок переменной, хранящей количество просмотров.

Текущее количество просмотров в любом случае должно быть задано и не быть пустым, а также тип переменной обязательно должен быть integer. Если хоть одно из этих условий не выполняется, то мы будем использовать 0 в качестве текущего количества просмотров. После чего мы добавим 1 и обновим его значение в базе данных. В заключении мы возвращаем обновлённое значение.

Всё это хорошо, но эта функция никогда не будет вызвана и соответственно использована. В этом моменте на помощь придут хуки. Конечно же, Вы можете открыть файлы Вашей темы и вызывать функцию вручную прямо оттуда, но тогда при смене темы функциональность плагина будет потеряна. Хук wp_head присутствует в большинстве популярных тем, поэтому мы можем использовать нашу функцию каждый раз, когда он срабатывает. Вот так:

add_action("wp_head", "awepop_add_view");

Вот и вся “мистика” хуков. По сути, мы сказали, что хотим, чтобы функция awepop_add_viewвызывалась каждый раз, когда срабатывает хук wp_head. Этот код можно разместить до или после самой функции.

Получение и отображение количества просмотров

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

/**
 * Retrieve the number of views for a post
 *
 * Finds the current views for a post, returning 0 if there are none
 *
 * @global object $post The post object
 * @return integer $current_views The number of views the post has
 *
 */
function awepop_get_view_count() {
   global $post;
   $current_views = get_post_meta($post->ID, "awepop_views", true);
   if(!isset($current_views) OR empty($current_views) OR !is_numeric($current_views) ) {
      $current_views = 0;
   }
   return $current_views;
}

Этот фрагмент кода уже использовался нами в функции awepop_add_view(). В данном случае это является дублированием кода, что не хорошо, но в будущем при внесении изменений это придаст плагину гибкости.

Пока мы только получали информацию. Теперь давайте отобразим её на экране. Вы можете подумать, что это совсем просто, что нужно просто распечатать значение, возвращаемое функцией awepop_get_view_count() на экран. Это, конечно же, сработает, но что если просмотр только 1? Нам нужно будет использовать слово “view” в единственном числе. Также можно окружить это значение сопровождающим текстом. Поэтому давайте создадим отдельную простую функцию:

/**
 * Shows the number of views for a post
 *
 * Finds the current views of a post and displays it together with some optional text
 *
 * @global object $post The post object
 * @uses awepop_get_view_count()
 *
 * @param string $singular The singular term for the text
 * @param string $plural The plural term for the text
 * @param string $before Text to place before the counter
 *
 * @return string $views_text The views display
 *
 */
function awepop_show_views($singular = "view", $plural = "views", $before = "This post has: ") {
   global $post;
   $current_views = awepop_get_view_count();

   $views_text = $before . $current_views . " ";

   if ($current_views == 1) {
      $views_text .= $singular;
   }
   else {
      $views_text .= $plural;
   }

   echo $views_text;
}

Отображение списка статей отсортированных по количеству просмотров

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

/**
 * Displays a list of posts ordered by popularity
 *
 * Shows a simple list of post titles ordered by their view count
 *
 * @param integer $post_count The number of posts to show
 *
 */
 function awepop_popularity_list($post_count = 10) {
 	$args = array(
 		"posts_per_page" => 10,
 		"post_type" => "post",
 		"post_status" => "publish",
 		"meta_key" => "awepop_views",
 		"orderby" => "meta_value_num",
 		"order" => "DESC"
 	);

 	$awepop_list = new WP_Query($args);

 	if($awepop_list->have_posts()) { echo "
<ul>"; }

 	while ( $awepop_list->have_posts() ) : $awepop_list->the_post();
 		echo '
<li><a href="'.get_permalink($post->ID).'">'.the_title('', '', false).'</a></li>

';
 	endwhile;

 	if($awepop_list->have_posts()) { echo "</ul>
";}
 }

Мы начинаем с того, что передаём большое количество параметров классу WP_Query, чтобы создать объект, содержащий статьи. Этот класс сделает за нас всю грязную работу: он извлечёт 10самых популярных статей и отсортирует их в порядке убывания.

Если объект со статьями не пуст, мы создадим элемент ненумерованного списка. А затем в цикле пройдёмся по всем статьям, которые извлекли из базы данных, отображая заголовок каждой в качестве ссылки на её полную версию. Когда все статьи будут отображены, мы поставим закрывающий тэг списка. Поместив функцию awepop_popularity_list() в любом месте темы, мы получим список статей упорядоченных по популярности.

В качестве дополнительной меры предосторожности добавьте проверку на существование функции:

if (function_exists("awepop_popularity_list")) {
   awepop_popularity_list();
}

Это обезопасит нас от PHP-ошибок, на сайте, если вдруг плагин будет отключён. Список просто не будет отображаться.

Выводы

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

Источник: smashingmagazine.com

Posted in CMS, Wordpress, Плагины and tagged , , .

1 Comments

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.