XMLRPC интерфейс WordPress
Решил сделать из блога доску объявлений для этого надо чтобы пользователь без регистрации мог добавлять объявления. Создал пользователя «anonymous» теперь все записи будут от его имени идти. Писать напрямую скрипт, чтоб добавлял объявы некрасиво как-то и не безопасно.
Вспомнил про XMLRPC получается очень даже красиво : создаем скрипт ads.php, жестко прописываем нужные нам поля, ненужно выкидываем, через тот же xmlrpc получаем списочек категорий, обрабатываем их ну и если юзверь все ввел правильно отправляем пост под именем анонимуса в блог.
Долго искал интерфес xmlrpc для WP, ничего толкового не нашел только вот статеку http://phpclub.ru/detail/article/xmlrpc .
Потом просто открыл фай xmlrpc.php все оказалась на месте список интерфейсов в самом начале:
// WordPress API
'wp.getPage' => 'this:wp_getPage',
'wp.getPages' => 'this:wp_getPages',
'wp.newPage' => 'this:wp_newPage',
'wp.deletePage' => 'this:wp_deletePage',
'wp.editPage' => 'this:wp_editPage',
'wp.getPageList' => 'this:wp_getPageList',
'wp.getAuthors' => 'this:wp_getAuthors',
....
....
Теперь рассказываю как написать простенького клиента и запустить. ‘; ‘;
http://www.keithdevens.com/software/xmlrpc/source.php качаем отсюда библиотеку.
И простенький клиент
include_once 'keitXmlRpc.php';
$site = "domen.com";
$location = "/xmlrpc.php";
list($success, $response) = XMLRPC_request( $site, $location,'wp.getCategories',
array(0,'anonymous', 'pasword') );
echo '
'; print_r($success); echo '
echo ‘
'; print_r($response); echo '
Методом XMLRPC_request можно получить любые данные из вашего блога, или написать что-то в блог. Одна тонкость состоит в том чтобы знать порядок аргументов в массиве все методы разные и практически все требуют лоигин и пароль. Поэтому для каждого метода придется открывать xmlrpc.php что лежит в корне вашего блога и смотреть порядок аргументов. Например, чтобы получить список категорий находим метод mw_getCategories вы увидите нечто такое
function mw_getCategories($args) {
global $wpdb;
$this->escape($args);
$blog_ID = (int) $args[0];
$user_login = $args[1];
$user_pass = $args[2];
Ну думаю все понятно.
Далее по ходу работы обнаружился серьезный косяк в работе библиотеки Keith Devens это которая у нас include_once ‘keitXmlRpc.php’; если если отправлять в качестве данных типа string html текст, в функции XML_serialize, когда происходит ее рекурсивный вызов, происходит многократное кодирование строки данных функцией htmlspecialchars($value) в результате < кодируется сначала < и потом повторно кодируется < ну в общем подправил немного это дело таким вот образом
$xml_serialized_string = str_replace(array('&','<','>','"'),
array('&','<','>','"'),$xml_serialized_string);
Привожу пример нескольких функции.
function editAds($id, $title, $content, $text_more, $mt_keywords, $mt_allow_comments,$categorie,$adsPassword) { global $site, $location, $login, $password; $content_struct = array( 'title'=>$title, 'description'=>$content, 'mt_text_more'=>$text_more, 'categories' => array($categorie), 'mt_keywords'=>$mt_keywords, 'mt_allow_comments'=>$mt_allow_comments, 'mt_allow_pings'=>'closed', 'wp_slug' => $adsPassword ); $arg = array((int)$id , $login, $password, XMLRPC_prepare($content_struct), 1); return XMLRPC_request($site, $location , 'metaWeblog.editPost', $arg); } function delete($id) { global $site, $location, $login, $password; $arg = array(0=>'null',1=>(int)$id , 2=>$login, 3=>$password, 4=>0); return XMLRPC_request($site, $location , 'metaWeblog.deletePost', $arg); } function uploadFile($fileName){ global $site, $location, $login, $password; if(preg_match('~\.(jpe|jpeg|jpg)$~si',$fileName)) $mimeType = 'image/jpeg'; //elseif(preg_match('~\.gif$~',$fileName)) $mimeType = 'image/gif'; //elseif(preg_match('~\.png$~',$fileName)) $mimeType = 'image/png'; else return false; if (is_file($fileName)) { $fd = fopen ($fileName, "r"); $bits = fread ($fd, filesize ($fileName)); } $content_struct = array( 'name'=>$fileName, 'type'=>$mimeType, 'bits' => base64_encode ($bits), 'bits type'=>'base64', 'overwrite' => 0 ); $arg = array(0,$login,$password, XMLRPC_prepare($content_struct)); $result = XMLRPC_request($site, $location , 'wp.uploadFile', $arg); return $result; }