Пошаговое руководство для создания плагина WordPress
WordPress приобретает все большую популярность с каждым днем, это уже не просто платформа для блогов, а полноценная система управления любым контентом. Поэтому расширение базовой функциональности становится просто необходимым для него. К счастью, разработчики это предвидели и предусмотрели возможность настройки базовой функциональности ВордПресс путем добавления плагинов.
По сути, WordPress Plugin является (более или менее) автономным фрагментом кода, который может быть выполнен в различных секциях, в пределах одной страницы или всего сайта.
Он может как улучшать уже встроенные по умолчанию возможности, так и добавлять совершенно новую функциональность.
Содержание
Основные правила при создании плагина
Перед тем, как начать писать собственный код, было бы неплохо ознакомиться с тем, что нужно делать, чтобы не появлялись дополнительные проблемы. Они касаются правильной структуры, наименований, а также, что немаловажно, безопасности сайта.
Структура
Если вы планируете реализацию сложной функциональности, то лучше разделить код на несколько файлов и папок. К примеру, в главном файле можно хранить основной класс, а дополнительные функции в отдельных. Кроме того, если вы хотите сделать собственные элементы управления в панели администратора ВордПресс, то можно создать отдельные папки для хранения CSS и JavaScript.
Имена функций и классов
Начиная создание плагина для wordpress, уделяйте должное внимание именам функций и классов. Например, если он будет предназначен для показа популярных постов, то вы, скорей всего, захотите дать ему название «Top Posts», а основной функции «top_posts», и это будет не правильным решением. Слишком очевидные названия могут послужить причиной появления проблем совместимости с другими расширениями, имеющими похожую функциональность.
Чтобы обойти эти проблемы, можно просто использовать уникальные префиксы. Придумайте случайный набор букв и добавляйте перед названием каждой функции, вот так: «came_top_posts». Чем нелогичней мы пишем префикс, тем меньше вероятность совпадений.
Безопасность
Безопасность всегда занимает наиважнейшее место в веб-разработке. Если в коде будут серьезные уязвимости, то взломщики смогут получить контроль над всем сайтом. В первую очередь, речь идет о фильтрации данных, введенных пользователями, и правильной выдачи привилегий. К счастью, в ВордПресс уже имеется множество способов для их обработки, от вас требуется только правильное использование.
Документация
Если вы рассчитываете на массовое распространение, то вы просто обязаны вести документацию в коде, тем более, что существует множество программ, упрощающих данное действие. Не забывайте, что комментирование кода никогда не бывает лишним. Разработчику трудно запоминать те части кода, которые были написаны несколько месяцев или лет назад. А особенно это актуально при работе в команде или большом количестве пользователей, тогда документирование становится необходимостью. Помимо этого, не игнорируйте стандарты кода, общепринятые в среде веб-разработчиков.
Удаление «хвостов»
Многие расширения оставляют после себя кучу ненужного мусора, такого как: отдельные таблицы в базе, мета-данные постов и комментариев, и т.д. Эта информация только захламляет ваш код и, соответственно, негативно влияет на скорость загрузки веб-сайта. К счастью, разработчики WordPress не упустили данный момент из виду и добавили несколько хуков для решения проблемы:
register_activation_hook ()
С помощью данного хука можно сделать так, чтобы ваш код выполнялся только тогда, когда плагин активирован. Он использует путь к файлу и название функции в качестве аргументов. Кроме того, им можно воспользоваться для того, чтобы проверить версию, обновления и правильность версии PHP.
register_uninstall_hook()
Когда администратор веб-сайта удаляет расширение, срабатывает именно этот хук. Он предназначен для очистки лишней информации, такой как: записи в БД, настройки и т.д. Единственным недостатком данного хука является то, что для его выполнения должно запускаться расширение. Если у вас этот способ не работает, то можно попробовать создать файл «uninstall.php». Подробности находятся в документации WordPress.
Имейте ввиду, если ваше расширение будет отслеживать популярность контента, то удаление данных о посещениях страницы статьи не очень мудрое решение. По крайней мере, предоставьте пользователю возможность выбора: удалять все или только само расширение.
Результатом всех этих манипуляций должно стать то, что пользователь сможет установить ваше расширение, пользоваться им 5 лет, а потом удалить, без следов в базе или файловой структуре веб-сайта.
Создание плагина
Теперь, когда вы проштудировали теоретическую часть, можно приступить непосредственно к практике. В качестве примера, можно реализовать не сложную функциональность отслеживания популярности статей на сайте, основанной на количестве просмотров.
Для начала, создайте новую папку по пути «wp-content/plugins» и назовите ее «cametopposts», например. В качестве ее содержимого создайте файл c аналогичным названием «cametopposts.php». Откройте файл в любом текстовом редакторе и вставьте следующие строки:
<?php
/*
Plugin Name: Came Top Posts
Plugin URI: http://www.cametopposts.ru
Description: This is my first simple plugin
Author: MyName
Version: 1.0
Author URI: http://www.mysite.ru
*/
?>
На самом деле, для успешного подключения собственного плагина в WordPress нужно написать только «Plugin Name», но если вы решите поделиться им в интернете, то желательно добавить больше информации.
Теперь, если все заполнено правильно, то «Came Top Posts» появится в панели администратора WordPress, с возможностью активации. Это пока только основа, не выполняющая никаких действий, но ее наличие необходимо.
Чтобы плагин действительно работал, нужно реализовать в нем следующий функционал:
- Запись значения в базу данных, когда пользователь открывает отдельную страницу статьи;
- Извлечение значения из базы данных;
- Отображение значения пользователю;
- Показ списка статей, отсортированных по этому значению.
Записываем количество просмотров
Первая функция, которую вам необходимо реализовать, будет обновлять счетчик посещения каждого поста, когда пользователь перейдет на его страницу. Она выглядит следующим образом:
function came_tposts_add_view() {
if(is_single()) {
global $post;
$curr_views = get_post_meta($post->ID, "came_tposts_views", true);
if(!isset($curr_views) OR empty($curr_views) OR !is_numeric($curr_views) ) {
$curr_views = 0;
}
$new_views = $curr_views + 1;
update_post_meta($post->ID, "came_tposts_views", $new_views);
return $new_views;
}
}
Как вы заметили, в первой строке идет проверка, находится ли в данный момент пользователь на странице статьи. Если это так, то мы берем глобальный объект, содержащий в себе некоторые данные о статье, такие как: ID, заголовок, дата публикации. После чего, мы берем значение количества посещений страницы этой статьи, записываем в переменную и делаем несколько проверок.
Проверки буду определять, что переменная содержит какое-то значение, что оно не пустое и имеет числовой тип. Если все верно, то мы добавляем к нему цифру 1, и обновляем соответствующую строку в базе данных. Если какое-то из описанных выше условий вдруг окажется не верным, то мы будем считать, что значение равно 0, добавим к нему 1 и запишем в базу данных.
Все готово, но наш код пока нигде не вызывается. Конечно, вы можете вызвать его напрямую из файла шаблона, но тогда он будет работать только с этим шаблоном и удалится после обновления. Намного удобней воспользоваться хуком «wp_head», находящимся в шапке практически каждого существующего шаблона. С ним наш код будет отрабатывать каждый раз, когда вызывается хук. Этот код нужно будет поместить в начало или конец предыдущего:
add_action ("wp_head", "came_tposts_add_view ");
Получаем и показываем количество просмотров
Для этих целей, проще всего воспользоваться вызовом стандартного «get_post_meta()», применявшегося для записи. Но лучше написать отдельную функцию, чтобы код был более гибким. Пишем вот так:
function came_tposts_get_view_count() {
global $post;
$cur_views = get_post_meta($post->ID, "came_tposts_views", true);
if(!isset($cur_views) OR empty($cur_views) OR !is_numeric($cur_views) ) {
$cur_views = 0;
}
return $cur_views;
}
С одной стороны, это дублирование кода, поскольку точно такие же строки были до этого, но данное решение пригодится в будущем. Например, можно будет добавить другую обработку нуля, а также обеспечить продолжение работы кода, если глобальный объект не доступен.
Мы получили значение количества просмотров, теперь остается передать его в шаблон. Вы можете решить, что нужно всего-навсего добавить в файл «single.php» строку «echo came_tposts_get_view_count() . «просмотров»;». Это действительно сработает, но отобразиться так как есть, без смены окончания при единичном числе. Согласитесь, это выглядит не очень красиво, поэтому лучше написать дополнительный код, чтобы учесть все возможные числовые варианты. Пишем так:
function came_tposts_show_views($before = "У этого поста: ") {
global $post;
$cur_views = came_tposts_get_view_count();
$views_text = $before . $cur_views . " ";
$n = $cur_views;
$plural = $n%10==1&&$n%100!=11?'просмотр':($n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?'просмотра':'просмотров');
$views_text .= $plural;
echo $views_text;
}
Список постов, основанный на популярности
Чтобы отобразить список статей, который будет строиться исходя из количества посещений их полных версий, нужно создать еще одну функцию, размещаемую в любом месте шаблона. Она будет обращаться к БД и отображать заголовки статей в списке. Пишем вот так:
function came_tposts_list($post_count = 10) {
$args = array(
"posts_per_page" => 10,
"post_type" => "post",
"post_status" => "publish",
"meta_key" => "came_tposts_views",
"orderby" => "meta_value_num",
"order" => "DESC"
);
$tposts_list = new WP_Query($args);
if($tposts_list->have_posts()) { echo "
- "; }
- '.the_title('', '', false).'
while ( $tposts_list->have_posts() ) : $tposts_list->the_post();
echo '
';
endwhile;
if$tposts_list->have_posts()) { echo "
";}
}
Как видите, сначала идет массив параметров, которые мы передадим классу «WP_Query», чтобы создать новый, содержащий посты, объект. Класс будет выполнять все основные действия: возьмет 10 постов из базы данных, имеющих наибольшее значение «came_tposts_views» в мета-таблице, и отсортирует их по мере уменьшения популярности.
Далее, если посты соответствуют всем критериям, мы создаем ненумерованный список, в котором будут находиться заголовки извлеченных статей, обернутые ссылкой на их полную версию. Теперь, размещение «came_tposts_list» в любом месте вашего шаблона будет генерировать список постов, отсортированных по популярности.
Чтобы обезопасить себя от возникновения ошибок, если расширение окажется выключенным, желательно указать условие, отображающее список только в том случае, когда существует «came_tposts_list»:
if (function_exists("came_tposts_list ")) {
came_tposts_list ();
}
Заключение
Создать свой собственный плагин для WordPress не так уж и сложно, по крайней мере, с такой элементарной функциональностью. Данный пример предназначен лишь для ознакомления с основами работы плагинов, он может быть значительно улучшен, например, добавлением возможности исключать запись повторных просмотров статьи, посещенной одним пользователем. Но это лучше делать самостоятельно, ведь изучая разработку на WordPress, вы получаете дополнительные навыки, которые пригодятся вам в других сферах веб-программирования.