Не смотря на то, что в WordPress есть масса возможностей из коробки, возникают ситуации, в которых нужен дополнительный функционал. Для этого у данной CMS есть механизм расширений, которые принято называть плагинами (plugins). Существует огромное количество плагинов для WordPress и вы можете найти в сети то, что вам нужно. Однако бывают такие технические требования, для которых найти готовое расширение не удается. И вот в таких ситуациях выкрутиться можно написав собственный WordPress plugin. В этой заметке я расскажу как это сделать. Вы увидите, что это совершенно не сложно.
Несколько строчек когда чаще всего могут сказать больше чем несколько страниц объяснений. Поэтому для примера мы создадим с вами простой WordPress plugin. По функционалу наверняка в сети вы найдете массу аналогов, массу плагинов которые имеют гораздо больше возможностей. Однако целью заметки является не рассказать а новом пагине, а рассказать об основных принципах, которые надо знать для написания собсвенного плагина для WordPress, и проиллюстрировать эти принципы на примерах кода.
ТЗ для примера будет следующим. Нам нужен плагин к WordPress, который позволяет пользователям ставить оценку посту вместе с добавлением своего комментария. Итоговая оценка на пост должна выводиться в том месте статьи, где автор статьи напишет специальный тег [my_rate].
Итак, начнем. Во-первых для того, чтобы ваш WorPress увидел ваш самописный plugin, вы должны поместить его в папку plugins. Я всегда создаю в папке plugins подпапку для разрабатываемого плагина WordPress и туда помещаю php-файл, в котором имеется такой заголовок в виде комментария:
/*
Plugin Name: My Rating
Plugin URI: https://web-linux.ru
Description: Users will have ability set rate for any post
Author: Igor Telmenko
Version: 0.1 10-06-2009
Author URI: https://web-linux.ru
*/
То, что вы пишите под заголовком Plugin Name будет именем плагина, под которым он будет виден в админке WordPress. Думаю назначение остальных заголовков понятно интуитивно.
Перейдем же теперь к реализации. Для того чтобы мы молги в нужном месте выполнить свой код в WordPress API существует набор хуков (так сказать, событий), к которым можно прикрепить свои обработчики. Хуки делятся на действия (actions) и фильтры (filters). Действия служат для выполнения каких-либо операий, а фильтры принимают на вход данные, обрабатывают их и возвращают результат в программу.
Добавим парочку обработчиков действий для нашего случая
add_action('comment_form', 'draw_rate_selector'); function draw_rate_selector() { echo "Title <input name='comment_title' type='text' /> Grade "; echo "<select name='my_rate'>". "<option value='$i'>".get_rate_label($i)."</option>". "<option value='$i'>".get_rate_label($i)."</option>". "</select>"; } add_action('comment_post', "save_rate"); function save_rate($id) { global $wpdb; $rate = $_POST['my_rate']; $title = $_POST['comment_title']; $data = array( 'comment_ID' =>$id, 'comment_rate' => $rate ); $wpdb->query($wpdb->prepare("UPDATE $wpdb->comments SET comment_rate = %s, comment_title = %s WHERE comment_ID = %d", $rate, $title, $id)); $rval = $wpdb->rows_affected; } function get_rate_label($rate) { if(isset($rate) AND !is_null($rate)) { $rates = array(1 => 'f', 'd-', 'd', 'd+', 'c-', 'c', 'c+', 'b-', 'b', 'b+', 'a-', 'a', 'a+'); $rate = round($rate, 0); return $rates[$rate]; } else { return 'none'; } }
Первый обработчик (comment_form) добавляет элемент управления к форме комментария и реагирует на событие отрисовки формы. Если вы посмотрите в код вашей темы WordPress, то увидите там
do_action('comment_form', $post->ID);
Сюда и будет вставлен результат, который выводит через echo функция draw_rate_selector().
Второй обработчик выполяется в момент сохранения комментария. Мы считываем данные о рейтинге из $_POST и пишем их в БД WordPress.
Функция get_rate_label() является просто вспомогательной и по номеру оценки возвращает ее название. Вы можете использовать свои названия (например, Отлично, Хорошо и т.д.)
Да, кстати, мы же сохраняем дополнительные данные в дополнительные поля таблицы БД WordPress. Чтобы каждый новый пользователь плагина не создавал эти поля руками добавим обработку хука инсталяции:
register_activation_hook( __FILE__, 'blist_rate_install'); function blist_rate_install() { global $wpdb; $table = $wpdb->prefix."bot_counter"; $alter = "ALTER TABLE $wpdb->comments ". "ADD comment_rate INT NULL AFTER comment_parent;"; $alter .= "ALTER TABLE $wpdb->comments ". "ADD comment_title VARCHAR(256) NULL AFTER comment_parent;"; $wpdb->query($alter); }
Вот теперь, заключительный хук. При выводе текста поста мы должны заменить специальный тег в тексте заметки на информации о рейтинге данного поста.
add_filter('the_content','show_blist_rate'); function show_blist_rate($content) { global $wpdb, $post; $result = $wpdb->get_var( "SELECT AVG(comment_rate) as blist_rate ". "FROM $wpdb->comments ". "WHERE comment_post_ID = $post->ID AND comment_rate IS NOT NULL " ); $content = str_replace('[my_rate]', get_rate_label($result), $content); return $content; }
Теперь в том месте, где автор поста введет последовательность символов [my_rate] будет выведен рейтинг данного поста. Плагин правда позволяет ставить одному пользоватею несколько оценок. Но написав несложный код можно будет запретить это. Вот и вся премудрость.
Хотя, конечно, возможности расширяемости WordPress не ограничиваются добавлением чего-либо на страницы и заменой строк к тексте заметок. Вы можете создавать отдельные секции и подсекции в админке, свои виджеты и многое другое. Но об этом в следующих статьях по теме WordPress. Чтобы не пропустить интересующие вас статьи, вы можете следить за появлением новой информации на сайте подписавшись на RSS-ленту.
Спасибо. Хотя скорее всего, проще просто доработать под себя какой-нибудь существующий плагин, благо их море. Хотя знания в любом случае пригодятся.