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

Мне кажется, что развитие отечественной блогосферы идет семимильными шагами и недалек тот день, когда все русскоязычные фрилансеровские биржи будут в буквальном смысле завалены предложениями по разработке плагинов для известных блог-движков. Поэтому сегодня я хочу рассказать о том, как можно, не прилагая особых усилий, программно добавить пост к WordPress блогу используя XML-RPC API. По своему опыту скажу, что больше половины заказов, которые я выполнил на западной бирже RentACoder было связано именно с WordPress. Как известно, то что популярно на западе сейчас, через некоторое время становится популярным и в нашей стране.

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

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

Конечно, создавать подобный сервис с нуля — задача затратная и несомненно бессмысленная. В Сети существует огромное количество фреймворков, которые львиную долю операции берут на себя (имеется в виду работа с базой данных, формирование XML-RPC запросов и т.д.). Например, в данном случае я использовал известный фреймворк CodeIgniter, в базовый комплект которого входит библиотека — ‘xmlrpc’, с помощью которой делались все запросы к WP.

В WordPress за вызов удаленных процедур отвечает скрипт xmlrpc.php. Те кто заглядывал в этот скрипт знают, что WordPress поддерживает аж четыре известных API — WordPress API, Blogger API, MetaWeblog API и MovableType API. Я решил использовать MetaWeblog API, потому, что на тот момент я был знаком с ним лучше всего (правда в процессе развития проекта пришлось познакомиться и с другими API, так как заказчик захотел поддержки не только WordPress-а, но и Blogger-а с MovableType на пару).

Сама функция, реализующая добавление нового поста в блог на WordPress, находилась в соответствующей модели CodeIgniter и выглядела примерно так:

// Добавление поста в удаленный блог на WordPress,
// где $blogUrl - адрес удаленного блога.
function wp_post( $blogUrl, $username, $password, $title, $content, $catsArray )
{
$this->load->library(‘xmlrpc’);

$this->xmlrpc->server($blogUrl, 80);
$this->xmlrpc->method(‘metaWeblog.newPost’);

$request = array( array(‘ABCD’, ’string’), // Первый параметр - это blog_id, который WP не поддерживает
                                array($username, ’string’),
                                array($password, ’string’),
                                array( array(
                                        ‘title’                => array(stripslashes($title),’string’),
                                        ‘description’   => array(stripslashes($content),’string’),
                                        ‘categories’    => array($catsArray,‘array’)
                                ), ’struct’),
                                array(‘publish’, ’string’)
                        );

$this->xmlrpc->request($request);

if ($this->xmlrpc->send_request()) {
        return ‘Пост ‘ . $title . ‘ опубликован в : ‘ . $blogUrl;

} else {
        return ‘Ошибка публикации поста’ . $title . ‘ в ‘ . $blogUrl;
}
}


Немного поясню, что происходит в данном методе:
  • Загружается библиотека XML-RPC и указывается адрес блога, для которого будет идти публикация (отмечу, что если необходимо опубликовать пост в несколько блогов, то метод вызывается для каждого URL-а отдельно)

  • Формируется XML-RPC запрос. Здесь следует обратить внимание на то, что за формирование XML представления запроса отвечает библиотека xmlrpc, на вход которой подается массив соответствующий структуре будущего XML-запроса. Чтобы понять почему порядок следования аргументов именно такой, рекомендую посмотреть функцию mb_newPost из файла xmlrpc.php входящего в WordPress;

  • В завершении сформированный XML запрос отправляется на сервер, и в зависимости от ответа принимается решение о результатах публикации.



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