Публикация постов в WordPress с помощью XML-RPC и CodeIgniter

Движок WordPress буквально «нашпигован» различными функциями и возможностями. В этой статье я расскажу, как написать небольшое web приложение, из которого вы сможете публиковать посты в ваш блог.
Как вы понимаете, писать такое приложение имеет смысл только в том случае, если оно расширяет стандартные возможности движка.
На мой взгляд, есть две области, для которых такие приложения подходят лучше всего.
Первая – это блог-клиенты. Тут преимущество в том, что вы можете писать пост без доступа в интернет и сохранить его на винчестере, а позже подключиться и опубликовать в блоге.
Вторая – различные программы для сеошников. Здесь смысл в том, чтобы публиковать посты автоматически в нескольких блогах.
Эта статья больше ориентирована на второй вариант.
Немного теории.
WordPress имеет два механизма публикации постов. Первый – web интерфейс (в данном случае он нас не интересует). И второй – с помощью XML-RPC. RPC расшифровывается как Remote Procedure Call (удаленный вызов процедур/функций). В принципе эта технология очень похожа на обычные запросы. От клиента к серверу передается строка с данными. Но XML-RPC требует, чтобы эта строка имела специальный формат.
Примечание. По большому счету существует еще и третий вариант – использование встроенных функций WordPress. Но он доступен только для плагинов.
Используя XML-RPC можно опубликовать пост с помощью всего одного запроса, а специальные библиотеки позволяют не углубляться в тонкости стандарта. Таким образом, не сложно написать программу, которая будет отправлять пост сразу в сотню-другую блогов.
Примечание. Естественно, сначала вам придется сделать эти посты «уникальными», но это отдельная тема.
Переходим к практике.
Инструменты.
Сформировать вручную XML-RPC запрос довольно сложно, поэтому удобно использовать специальную библиотеку. Кроме того, сеошные приложения не ограничиваются только постингом, а имеют ряд других не менее полезных функций.
Т.е. лучше с самого начала использовать фреймворк. Для этого примера я выбрал CodeIgniter, который очень прост в изучении и имеет встроенную библиотеку для работы с XML-RPC.
Также нам понадобится документация по функциям, которые поддерживает WordPress. XML-RPC определяет только формат запросов, а уже разработчик приложения решает какие функции будут поддерживаться.
WordPress поддерживает сразу четыре API:
1) WordPress API.
2) Blogger API.
3) metaWeblog API ().
4) Movable Type API.
Но, насколько я знаю, они не взаимозаменяемые. Например, Wordpress API не имеет функции для публикации поста (wp.newPage публикует страницу, а не пост, и при этом используется функция mw_newPost из MetaWeblog API).
В общем, для публикации постов мы будем использовать MetaWeblog API.
Настраиваем CodeIgniter.
Для данной задачи настроек минимум.
Открываем system\application\config\autoload.php и подключаем url helper.
-
$autoload['helper'] = array('url');
В файле system\application\config\config.php указываем адрес приложения
-
$config['base_url'] = ….;
И указываем имя контроллера, который будет использоваться по-умолчанию (файл system\application\config\routes.php).
-
$route['default_controller'] = "poster";
Интерфейс. Т.к. пример демонстрационный, ограничимся одной формой.

Т.е. пользователь указывает URL блога (с http:// и без слеша в конце адреса), заголовок поста, теги и текст. И после нажатия на кнопку «Отправить» мы публикуем пост.
Примечание. Естественно, в реальном приложении адреса блогов лучше хранить в базе, а не вводить каждый раз.
Напишем представление, которое создаст эту форму (postform.php).
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="ru-RU">
-
<head>
-
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
-
<title><?php echo $title; ?></title>
-
</head>
-
-
<body>
-
-
<?php
-
if (isset($mes)) {
-
echo '<p>'.$mes.'</p>';
-
}
-
?>
-
<form method="post" action="<?php echo site_url("poster/sendpost"); ?>">
-
<p>
-
<label for="blogurl">URL блога</label>
-
<input name="blogurl" id="blogurl" type="text" size="20" />
-
(c http:// и без слеша в конце)
-
</p>
-
<p>
-
<label for="posttitle">Заголовок поста</label>
-
<input name="posttitle" id="posttitle" type="text" size="20" />
-
</p>
-
<p>
-
<label for="posttags">Теги</label>
-
<input name="posttags" id="posttags" type="text" size="20" />
-
</p>
-
<p>
-
<label for="posttext">Тескт поста</label>
-
<textarea name="posttext" id="posttext" cols="20" rows="5"></textarea>
-
</p>
-
<p>
-
<input type="submit" name="sbmbtn" id="sbmbtn" value="Отправить" />
-
</p>
-
</form>
-
</body>
-
</html>
Как видите – это обычная страница с формой. Сразу после тега <body> мы добавили код, который будет показывать сообщение с результатами отправки (строки 11-15).
Переходим к контроллеру (poster.php).
-
<?php
-
-
class Poster extends Controller {
-
-
function Poster()
-
{
-
parent::Controller();
-
}
-
-
function index()
-
{
-
$pageData['title'] = "Отправка постов в WordPress";
-
$this->load->view('postform', $pageData);
-
}
-
-
function sendpost() {
-
$this->load->library('xmlrpc');
-
-
$pageData['title'] = "Отправка постов в WordPress";
-
-
$blogUrl = $this->input->post('blogurl');
-
$postTitle = $this->input->post('posttitle');
-
$postTags = $this->input->post('posttags');
-
$postText = $this->input->post('posttext');
-
-
if (!$blogUrl || !$postTitle || !$postTags || !$postText) {
-
$pageData['mes'] = 'Нужно заполнить форму';
-
}
-
else {
-
$this->xmlrpc->server($blogUrl.'/xmlrpc.php', 80);
-
$this->xmlrpc->method('metaWeblog.newPost');
-
$request = array(
-
array(0, 'int'), //blog id
-
array('admin', 'string'), //username
-
array('your_pass', 'string'), //password
-
array(
-
array(
-
'title'=>array($postTitle, 'string'),
-
'description'=>array($postText, 'string'),
-
'mt_keywords'=>array(split(',\s*', $postTags), 'array'),
-
'mt_allow_comments'=>array(1, 'int'),
-
'mt_allow_pings'=>array(0, 'int'),
-
),
-
'struct'
-
), //content
-
array(TRUE, 'boolean') //publish
-
);
-
$this->xmlrpc->request($request);
-
// $this->xmlrpc->set_debug(TRUE);
-
-
if ( ($res = $this->xmlrpc->send_request()) === FALSE) {
-
$pageData['mes'] = $this->xmlrpc->display_error();
-
}
-
else {
-
$pageData['mes'] = 'Пост опубликован';
-
}
-
}
-
$this->load->view('postform', $pageData);
-
}
-
}
-
?>
Его разберем подробнее.
Метод index (строки 10-14) просто показывает пустую форму. При нажатии на кнопку «Отправить» будет вызван метод sendpost.
Метод sendpost работает следующим образом.
1) Подключаем библиотеку для работы с XML-RPC (строка 17).
2) Получаем введенные в форму данные и проверяем их (строки 21-28) (в реальном приложении эта проверка будет сложнее).
3) Формируем запрос.
С помощью методов server и method указываем адрес сервера и название функции (metaWeblog.newPost) соответственно.
Примечание. К адресу блога мы добавляем название скрипта (xmlrpc.php), который обрабатывает XML-RPC запросы. Во втором параметре указываем порт сервера, на котором работает WordPress.
Теперь нужно сформировать массив с данными (строки 32-47). Это, наверное, самая сложная часть.
В массиве нужно указать не только значения, но и тип данных. Например, в строке 34 мы указали логин пользователя (admin) и тип данных (string). Точно также в строке 46 значение – TRUE, а тип – boolean (этот параметр означает, что пост должен быть опубликован, а не сохранен как черновик).
Кстати, параметры в этом массиве должны идти в том порядке, в котором они описаны в документации (нормальной справки я, к сожалению, не нашел, поэтому лучший источник информации – файл xmlrpc.php).
Исключение из этого правила составляет структура с данными (четвертый параметр). Она задается как массив и имеет тип struct (строки 36-44). Вообще эта структура может содержать больше полей, чем использовано в этом примере. Например, нет особого смысла указывать wp_author_id, т.к. WordPress автоматически подставит id автора, под логином которого вы подключились.
Теперь обратите внимание на строку 40. Здесь мы добавили параметр, который имеет тип array и содержит массив с тегами поста. Исходную строку с тегами мы преобразовали в массив с помощью функции split (разделитель – запятая и любое количество пробелов после нее).
Несколько замечаний по поводу тегов.
Для группировки постов WordPress позволяет использовать теги, рубрики или и то, и другое одновременно. Но работать с тегами, на мой взгляд, немного удобнее. Вы просто передаете массив с ними, а дальше все делает WordPress. Если тег с таким же именем существует, то используется он, если нет – то создается новый.
Единственное, что от вас потребуется – это добавить облако тегов в сайдбар. Для стандартного шаблона открываем файл wp-content\themes\default\sidebar.php, находим строку
<?php wp_list_categories('show_count=1&title_li=<h2>Categories</h2>'); ?>
и после нее добавляем код
-
<?php if ( function_exists('wp_tag_cloud') ) : ?>
-
<li>
-
<h2>Popular Tags</h2>
-
<ul>
-
<?php wp_tag_cloud('smallest=8&largest=22'); ?>
-
</ul>
-
</li>
-
<?php endif; ?>
Естественно, место размещения и настройки вы выбираете сами.
4) Возвращаемся к контроллеру.
Массив с данными сформирован. С помощью метода request добавляем его в запрос (строка 48) и отправляем (строка 51, метод send_request).
Обратите внимание на строку 49 – очень полезно для отладки
5) После отправки запроса мы загружаем страницу с формой.
Как видите, использовать XML-RPC не сложно, главное - правильно сформировать массив с данными.
Скачать пример.
Если хотите поэкспериментировать – качайте архив с примером. Он содержит папку application с контроллером и представлением. Эту папку нужно скопировать в папку system фреймворка.
И, естественно, для работы вам нужно будет установить WordPress.
Пост получился довольно длинным
и если у вас возникли вопросы – пишите в комментариях.
До встречи!
Интересно почитать:
Понравилась статья? Подпишитесь на продолжение
!
Опубликовано в CodeIgniter, PHP, Web разработка, WordPress
Комментарии (7)
Вы можете отслеживать обсуждение записи с помощью RSS 2.0 ![]()
Вы также можете оставить комментарий, или трекбек с Вашего сайта.
Оставить комментарий







[...] Движок WordPress буквально «нашпигован» различными функциями и возможностями. В этой статье я расскажу, как написать небольшое web приложение, из которого вы сможете публиковать посты в ваш блог. Как вы понимаете, писать такое приложение имеет смысл только в том случае, если оно расширяет стандартные возможности движка. Далее… [...]
Зачем всё так сложно?
На сервисе от WP, где я сижу это делается так: http://blogion.ru/faq
Word-2007 рулит. Даже таблицы можно в блог постить. TinyMCE (или как его там), по-моему, таблицы создавать не умеет.
Так Word использует этот же метод. У вас в инструкции написан пример подключения:
Т.е. Word используется как обычный блог-клиент. А когда вы пишите собственное приложение, то можете делать что угодно. Например, автоматический постинг в несколько блогов.
Интересное использование клиентской RPC библиотеки CodeIgniter. К сожалению, к WordPress нет подробной спецификации на все интерфейсы, приходится читать исходный код библиотеки.
Для решения подобной задачи я поступил чуть проще - отследил передаваемые BlogJet'ом запросы и формировал скриптом аналогичные. Просто функциями для работы со строками
Что, конечно, не так красиво и правильно, как использование специальных функций для создания XML-пакета.
Есть нюанс, который может быть важным. При обновлении WordPress с помощью metaWeblog.newPost в отдельной структуре нужно передавать список пингуемых серверов. Дефолтный список пинг-сервисов при обновлении по данному методу не пингуется (пробовал на WP 2.5).
Было бы интересно использовать CodeIgniter для создания сервера RPC-запросов, т.е. альтернативу использования Wordpress'а. Может быть подскажете простой, быстрый и надежный фреймворк/набор библиотек для создания приложения, обновляющегося по XML-RPC?
Я пока что думаю, что CodeIgniter подойдет…
>> список пингуемых серверов
здесь есть еще один нюанс - бан за частые пинги. В обычном режиме работы я использую MaxBlogPress Ping Optimizer. Но я не знаю работает ли он при постинге через XML-RPC. По-идее, должен, т.к. для публикации поста используется одна и таже функция, но я не проверял.
Да, стандартная библиотека CI позволяет создать XML-RPC сервер. Насколько я знаю, вполне нормально работает. Правда, читал, что были проблемы в версии 1.6.2.
Очень полезная статья!
Только есть вопрос: А как передать рубрику, в которой должен опубликоваться пост?
Принцип такой же как и с тегами.
.
Список рубрик передается в структуре с данными, параметр называется
categories. В этом примере я его просто пропустил, т.к. использовал теги.Посмотрите метод mw_newPost в файле xmlrpc.php. Он довольно длинный, но имена переменных говорят сами за себя