Не смотря на то, что в 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-&gt;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-ленту.

Tags:

One Response to “Создаем расширение для WordPress”

  1.  ulitkus Says:

    Спасибо. Хотя скорее всего, проще просто доработать под себя какой-нибудь существующий плагин, благо их море. Хотя знания в любом случае пригодятся.