Сегодня поделюсь своим C# сниппетом ZennoPoster для удаленного постинга в WordPress с помощью XML-RPC.
На самом деле, для этого существуют специальные библиотеки, но у меня завести их так и не получилось. Может руки кривые или либа не рабочая — не знаю. Однако почитав информацию по стандарту XML-RPC и проглядев примеры реализаций на php, у меня появилась кое-какая информация для начала работы.
ДИСКЛЕЙМЕР
Я писал этот код еще когда был совсем-совсем зеленым в c#, потому он такой громоздкий и некрасивый. Сейчас я понимаю, что конвертировать в нужный формат можно гораздо проще. А в идеале, я бы воспользовался готовой библиотекой, чтобы не изобретать велосипед. Но и это решения я удалять не хочу, так как оно неплохо должно подойти совсем новичкам.
Приступаем.
XML-RPC принимает POST-запросы. Уже хорошо, значит сможем обойтись без выкрутасов. Осталось определиться с тем, в каком формате данные. На замечательнейшем сайте stackoverflow.com был найден хороший код на php. Смотрим, анализируем и убираем лишнее.
cat test.php <? $content = array( 'post_type' => 'post', 'post_content' => 'This is the post content', 'post_title' => 'This is the post title', 'post_name' => 'testpost', 'post_thumbnail' => 'http://img.dni.ru/binaries/v2_articlepic/792413.jpg', 'terms' => array('category' => array( 'Top News' ) ), ); // parameters are blog_id, username, password and content $params = array(1, 'login', 'password', $content); $params = xmlrpc_encode_request('wp.newPost', $params); var_dump ($params); ?>
Здесь я уже убрал все лишнее: нам не нужно постить, только посмотреть какие данные передаются, потому как их надо обработать xmlrpc_encode_request, коего нет в C#. Выполняем
php test.php string(1382) "<?xml version="1.0" encoding="iso-8859-1"?> <methodCall> <methodName>wp.newPost</methodName> <params> <param> <value> <int>1</int> </value> </param> <param> <value> <string>login</string> </value> </param> <param> <value> <string>password</string> </value> </param> <param> <value> <struct> <member> <name>post_type</name> <value> <string>post</string> </value> </member> <member> <name>post_content</name> <value> <string>This is the post content</string> </value> </member> <member> <name>post_title</name> <value> <string>This is the post title</string> </value> </member> <member> <name>post_name</name> <value> <string>testpost</string> </value> </member> <member> <name>post_thumbnail</name> <value> <string>http://img.dni.ru/binaries/v2_articlepic/792413.jpg</string> </value> </member> <member> <name>terms_names</name> <value> <struct> <member> <name>category</name> <value> <array> <data> <value> <string>Top News</string> </value> </data> </array> </value> </member> </struct> </value> </member> </struct> </value> </param> </params> </methodCall> "
как видим, ничего сложного. Берем этот код и сохраняем.
ZennoPoster
Мне очень захотелось сделать все одним кубиком, поэтому используем только C#, хотя при желании можно сделать и на кубиках замены текста, запросов и т.д..
ВАЖНО! Не забываем заменить спецсимволы
Ну и не буду томить, вот сам сниппет
string login, password, url, title, keywords, content, data, name, cats, img; //логин login = project.Variables["b_login"].Value.Trim(); //пароль password = project.Variables["b_password"].Value.Trim(); //адрес интерфейса url = "https://"+project.Variables["b_domain"].Value.Trim()+"/xmlrpc.php"; //тайтл записи title = project.Variables["p_title"].Value.Trim(); //картинка записи img = project.Variables["p_img"].Value.Trim(); //в какую категорию постить. если такой нет - то будет создана cats = project.Variables["p_category"].Value.Trim(); content = project.Variables["p_content"].Value; //заменяем спецсимволы content = content.Replace("&","&").Replace("\"",""").Replace("\'","'").Replace("<","<").Replace(">",">"); //формируем данные для передачи data = "<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>wp.newPost</methodName><params> <param><value> <int>1</int></value> </param> <param><value> <string>"+login+"</string></value> </param> <param><value> <string>"+password+"</string></value> </param> <param><value> <struct><member> <name>post_type</name> <value><string>post</string> </value></member><member> <name>post_content</name> <value><string>"+content+"</string> </value></member><member> <name>post_title</name> <value><string>"+title+"</string> </value></member><member><name>post_status</name><value><string>publish</string></value></member><member><name>terms_names</name><value><struct><member><name>category</name><value><array><data><value><string>"+cats+"</string></value></data></array></value></member></struct></value></member></struct></value> </param></params></methodCall>"; //выполняем запрос var resultHttpPost = ZennoPoster.HttpPost(url, data , "text/xml", "", "utf-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly); return resultHttpPost;
Ну вроде бы все просто и надежно. На выходе получаем XML ответ с результатом: там или индекс поста или код ошибки. Но у меня работает хорошо.
Привет,
Спасибо за код! Но что-то картинки не заливаються! Добавил в data еще post_thumbnail»+img+», но перестало создавать пост! Не поможешь?
И как вообще после того как залилась картинка, вставить ее в нужный код? Допустим у меня уже есть готовый текст для поста вида:
текст
в src=»» какой урл добавить после заливки?
Еще кстати не знаешь как можно обновлять посты?
Спасибо!
я немного по-другому сделал:
в контенте ставил тэг img с путем до картинки (ее можно залить куда угодно, например на имгур), на цмс ставил два плагина: один автоматом подтягивал все внешние картинки, второй автоматом создавал миниатюры из первой картинки поста.
А по поводу изменений, там сложнее: нужно в начале получить айди поста, и потмо уже с ним манипулировать. Давно это было, так сходу не скажу.
Здравствуйте! Самое банальное можно написать клиент для WordPress. Я правда такими никогда не пользовался, меня веб-интерфейс WP более чем устраивает.
а если нужно залить 2-3к постов? или наполнять равномерно десяток блогов?
благодарю автора за ценный снипет. Но к сожалению тут так и не реализовано добавление картинок.
И я так понимаю что именно из-за них и подключаются всевозможные библиотеки.
Пожалуйста добавьте снимет добавления картинок в эти статьи
Хм…возможно, ближайшее время появится такое: у самого возникла необходимость. Так что ждите)