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 и выглядела примерно так:
// где $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 запрос отправляется на сервер, и в зависимости от ответа принимается решение о результатах публикации.
Как видите все просто, но только в том случае когда мы используем хорошие инструменты, если бы заказчик настаивал на использовании только моих собственных разработок, то процесс создания проекта мог бы затянуться надолго. К счастью, подобных неадекватов мало и мне удавалось их успешно избегать.
Как всегда жду ваших комментариев по теме данной заметки.
Отдельно хочу обратиться к господам, которые любят писать абсолютно пустые и бессмысленные комментарии - можете особо не стараться, все равно подобные комментарии либо не будут опубликованы, либо ссылка на ваш ресурс будет удалена.
Статья предназначена для размещения на блоге www.codeart.ru
Владимир
Гость
Интересная статья.
Возник небольшой вопрос, существуют ли библиотеки, которые объединяют все эти API? Т.е. позволяют задать данные и нужный API.
Evgeny Sergeev
Веб-разработчик, автор блога codeart.ru
>Возник небольшой вопрос, существуют ли библиотеки, которые объединяют все эти API?
Не встречал, но если у кого-то есть информация о подобной библиотеки, буду признателен за ссылку.
Гвидон Маляров
Гость
Вряд ли есть подобные API. Слишком трудоемкая работа их делать бесплатно;). Однако есть сервисы, которые помогают постить сразу в несколько блог сервисов, это не секрет наверно:)
Freak
Гость
Библиотеки есть…но они стоят немалых денег)
Станислав Малкин
Гость
По-моему для реализации данной задачи (объединения) - отлично подойдет паттерн Factory.
Достаточно создать несколько бекендов для работы с разными API, а потом в фабричном методе просто вызывать то, что требуется и работать прозрачно.
Это, имхо, вполне реально и не должно стоить много денег. Пяти звезд во лбу это не требует.
Сергей
Гость
А где можно почитать про функции XML-RPC, используемые в вордпрессе? Я конечно понимаю, что можно поковырять соответствующий файл, но хотелось бы с комментариями.
Evgeny Sergeev
Веб-разработчик, автор блога codeart.ru
Можгно поискать описание указанных мной API через Гугл или Яндекс(например http://www.xmlrpc.com/metaWeblogApi). Но здесь нужно понимать, что в WP данный API реализован не в полном объеме.
Хотя я бы все же посоветовал зяглянуть в xml-rpc.php. Поверьте, ничего сложного там нет.
Владимир
Гость
api достаточно просты чтобы громоздить на их основе библиотеки - все достаточно просто. Уддивил громоздкий когд вызова xml-rpc, в wordpress есть замечательный модуль class-IXR.php который делает все что надо, ну например не нужно в явном виде указывать ттип аргументов - все делает библиотека.
Я вот написал собственное апи для работы с комментариями wordpress для коммент клиента. Получилось интересное приложение - типа почтового клиента, но для комментариев, плюс всякие дополнительные бонусы типа социального комментирования или запуск клиента по клику по ссылки на форме комментария: для этого коммент клиент регистрирует в системе протокол commenton, возможность отправлять комментари через свой блог - таким образом ваш комментарий будет на двух блогах сразу.
Вообще xml-rpc, soap очень интересные вещи, позволяющие роботизировать некоторые задачи…
Evgeny Sergeev
Веб-разработчик, автор блога codeart.ru
Владимир, интересно посмотреть на Ваш апи для работы с комментариями.
P.S. Вышеуказанный пример приведен для стандартных библиотек CodeIgniter, но никто не мешает взять class-IXR и приспособить под свои нужды.
P.P.S для тех кому интересен IXR могут прочитать мануал на него - http://scripts.incutio.com/xmlrpc/manual.php
Владимир
Гость
Первое время я апи для комметариев держал в отдельном файле и его надо было класть рядом с xmlrpc.php и соответствено урл для апи был специальный, потом переделал все в плагин и теперь все мои xml-rpc функции доступны по стандартномуадресу, который отдается в заголовках X-Ping Скачать плагин коммент сервер можно отсюда:
http://blogclient.ru/download/commentserver.zip
А Windows программу для управления комментариями здесь (1.6Mb):
http://blogclient.ru/download/wpcommentclientsetup.exe
Сергей
Гость
>Хотя я бы все же посоветовал зяглянуть в xml-rpc.php. Поверьте, ничего сложного там нет.
В принципе, я так и поступил. Да, все просто
sheller
Гость
Сетка блогов? а исходники ее остались?
Evgeny Sergeev
Веб-разработчик, автор блога codeart.ru
sheller, остались конечно.
[YS.PRO]
Гость
Евгений, а у вас ошибка в коде:
‘description’ => array(stripslashes($contents),’string’),
переменная $contents не определена, $content должно быть
[YS.PRO]
Гость
и еще ( пропущена в return в двух случаях
копирайтер
Гость
Для того, чтобы без забот постить в блоги есть специальная программа, которая и морфологию ошибок проверяет, а называется она Live Writer, зачем придумывать велосипед.
[YS.PRO]
Гость
@Студия электронного дизайна, ради интереса… какие возможности у удобного плэйн-текстового редактора? )
Integralbe
Гость
Добрый День.
Женя, не подскажите, есть ли возможнотсть, используя xmlrpc.php в WordPress’e устанавливать данные для блога, которые при ручной публикации идут в блоке SEO All io one, тоесть страницы, (keywords, description..)?
Evgeny Sergeev
Веб-разработчик, автор блога codeart.ru
Integralbe, думаю, что нельзя. Знаю, что можно теги добавлять, но думаю, что это не совсем то, что Вам нужно.
Integrable
Гость
Привет Евгений.
Насчет мета-данных - есть возможность их устанавливать. Данные задаются в поле “custom_fields” массива, причем в хтмл-коде все выглядит будто это плагин All in one втулил их…
Evgeny Sergeev
Веб-разработчик, автор блога codeart.ru
Integrable, спасибо за информацию. Буду иметь в виду.
Integrable
Гость
добрый день.
Работая с xml-rpc, заметил что xmlrpc не понимает символов типа: ‘…’, ‘•’ и мн.других. В результате, если текст блога содержит такие символы, выдается ошибка Я так понимаю проблема на уровне xml, поскольку у водрпресса проблем с такими символами нет. Может вы встречались с таким?
Evgeny Sergeev
Веб-разработчик, автор блога codeart.ru
Integrable, какая ошибка выдается?
Integrable
Гость
-32700 : parse error. not well formed
при этом, если выставить $client->debug = true,
то xml коде, который выводится, “плохие символы” заменяются пустыми квадратиками…
Evgeny Sergeev
Веб-разработчик, автор блога codeart.ru
Integrable, приношу свои извинения, что не ответил своевременно, но в конце года у меня остается очень мало свободного времени. С ходу сказать в чем причина я не могу. Надо тестировать и разбираться. Так что помочь не могу.
Если разберешься в чем дело, то отпиши здесь, буду очень благодарен.
P.S. еще раз извини за долгий ответ!
Evgeny Sergeev
Веб-разработчик, автор блога codeart.ru
Integrable, попробуй вот что - в файле /wp-includes/class-IXR.php найди закомментированные строки (в классе IXR_Message):
die(sprintf(’XML error: %s at line %d’,
xml_error_string(xml_get_error_code($this->_parser)),
xml_get_current_line_number($this->_parser)));
и разкомментируй их. После чего смотри какую ошибку выдает тебе XML парсер.
Integrable
Гость
спасибо, будем разбираться!
PAG
Гость
Integrable, Скорее всего кодировку используете не UTF-8
Mut@NT
Гость
Вы говорили, что для заказчика сделали постинг в MovableType. Можете привести пример реализации. ОООчень интересно. Так как пытаюсь для себя сделать постер в CMS TXP, а она схожа по синтаксису с первым
Николай
Гость
Здравствуйте. У меня кокраз возникла необходимость синхронизации постов между двумя wordpress блогами - клонами. Подскажите пожалуйста куда копать. С ворпресом только начал работать. Искать ли плагин или ковырять код?
Евгений Фоменко
Гость
Жень, такой вопрос к вам - вы выше советовали:
“Integrable, попробуй вот что - в файле /wp-includes/class-IXR.php найди закомментированные строки (в классе IXR_Message):
die(sprintf(’XML error: %s at line %d’,
xml_error_string(xml_get_error_code($this->_parser)),
xml_get_current_line_number($this->_parser)));
и разкомментируй их. После чего смотри какую ошибку выдает тебе XML парсер.”
Но я не нашел, где именно должна отображаться ошибка - я на старом WP работаю и после смены хостинга тупо не работают удаленные публикации.
Самое неприякольное, что у меня WP работает на cp1251, потому ошибку тяжело найти - предполагаю, что где-то что-то не так происходит с определением версии php…
Что-то подскажете по данному вопросу. Какие данные/файлы нужны, чтобы понять, в чем дело?
Евгений Фоменко
Гость
Есть еще предположение, что это libxml - сейчас отписал хостеру, что он не хостер, а куча гемора, жду от него ответа…
Evgeny Sergeev
Веб-разработчик, автор блога codeart.ru
Евгений Фоменко,
1. Из какой программы работает с XML-RPC
2. Какие версии WP, PHP
3. В настройках WP разрешено использование XML-RPC