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

Владимир | | CodeIgniter, PHP, Web разработка, WordPress.

codeigniter wordpress xml-rpc

Движок 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";

Интерфейс. Т.к. пример демонстрационный, ограничимся одной формой.

Форма для постинга с помощью XML-RPC

Т.е. пользователь указывает 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.

Пост получился довольно длинным 😉 и если у вас возникли вопросы – пишите в комментариях.

До встречи!

Интересно почитать:

Как легально продавать аффилиэйт-продукты на eBay.

  • Pingback: Публикация постов в WordPress с помощью XML-RPC()

  • Зачем всё так сложно?
    На сервисе от WP, где я сижу это делается так: http://blogion.ru/faq
    Word-2007 рулит. Даже таблицы можно в блог постить. TinyMCE (или как его там), по-моему, таблицы создавать не умеет.

    • Так Word использует этот же метод. У вас в инструкции написан пример подключения:

      Пример: blogion.ru/ivanov/xmlrpc.php

      Т.е. Word используется как обычный блог-клиент. А когда вы пишите собственное приложение, то можете делать что угодно. Например, автоматический постинг в несколько блогов.

  • Зачем всё так сложно?
    На сервисе от WP, где я сижу это делается так: http://blogion.ru/faq
    Word-2007 рулит. Даже таблицы можно в блог постить. TinyMCE (или как его там), по-моему, таблицы создавать не умеет.

    • Так Word использует этот же метод. У вас в инструкции написан пример подключения:

      Пример: blogion.ru/ivanov/xmlrpc.php

      Т.е. 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.

  • Интересное использование клиентской 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. Он довольно длинный, но имена переменных говорят сами за себя 😉 .

      • pafa

        а в версии >3 (более старые просто не пробовал) категории обязательно должны существовать, иначе они игнорируются

  • Очень полезная статья!
    Только есть вопрос: А как передать рубрику, в которой должен опубликоваться пост?

    • Принцип такой же как и с тегами.
      Список рубрик передается в структуре с данными, параметр называется categories. В этом примере я его просто пропустил, т.к. использовал теги.
      Посмотрите метод mw_newPost в файле xmlrpc.php. Он довольно длинный, но имена переменных говорят сами за себя 😉 .

  • Андрей

    Хорошая статья! Но у меня такой вопрос — если в ВП установлен плагин кросс-постинга в ЖЖ (ljxp), запустится ли автомитически и он, или надо передавать какие-то дополнительные данные?

    • Интересно… никогда не пользовался этим плагином.
      Лучше всего попробовать 😉
      По идее должно работать, ведь в любом случае все сводится к вызову wp_insert_post.

  • Андрей

    Хорошая статья! Но у меня такой вопрос — если в ВП установлен плагин кросс-постинга в ЖЖ (ljxp), запустится ли автомитически и он, или надо передавать какие-то дополнительные данные?

    • Интересно… никогда не пользовался этим плагином.
      Лучше всего попробовать 😉
      По идее должно работать, ведь в любом случае все сводится к вызову wp_insert_post.

  • io

    достаточно много неясного в статье.

    для какой версии wordpress-а это работает? на 2.7.1 не работает например, публикуются пустые посты с пустыми метками.

    К тому же надо было догадаться, чтобы в админке выставить разрешение публикации через XML-RPC

    и еще пользователю чей логин и пароль указывается в коде нужно выставить статус «редактор»

    и после всех этих манипуляций стали добавляться пустые посты

  • io

    достаточно много неясного в статье.

    для какой версии wordpress-а это работает? на 2.7.1 не работает например, публикуются пустые посты с пустыми метками.

    К тому же надо было догадаться, чтобы в админке выставить разрешение публикации через XML-RPC

    и еще пользователю чей логин и пароль указывается в коде нужно выставить статус «редактор»

    и после всех этих манипуляций стали добавляться пустые посты

  • io

    но все-равно спасибо)

  • io

    но все-равно спасибо)

  • По-моему я тестировал на 2.5.
    Разрешение публикации через XML-RPC и права редактора это часть системы безопасности WP. И я действительно забыл о них упомянуть.
    Если посты публикуются, значит система работает. Нужно посмотреть какие параметры нужны функции mw_newPost (находится в файле xmlrpc.php) и сравнить их с массивом, который передается в запросе (строки 32-47, предпоследний листинг).

  • По-моему я тестировал на 2.5.
    Разрешение публикации через XML-RPC и права редактора это часть системы безопасности WP. И я действительно забыл о них упомянуть.
    Если посты публикуются, значит система работает. Нужно посмотреть какие параметры нужны функции mw_newPost (находится в файле xmlrpc.php) и сравнить их с массивом, который передается в запросе (строки 32-47, предпоследний листинг).

  • io

    спасибо за ответ, Владимир

    сейчас заметил, что если название поста, теги и контент — русские буквы — то они публикуются пустыми. С английскими — все в порядке.

    сейчас буду думать, что не так

  • io

    спасибо за ответ, Владимир

    сейчас заметил, что если название поста, теги и контент — русские буквы — то они публикуются пустыми. С английскими — все в порядке.

    сейчас буду думать, что не так

  • io

    не пойму в чем дело, может быть нужно делать перекодировку функцией iconv() как это тут делается http://www.charnad.com/blog/postim-v-wordpress-cherez-xml-rpc-ch2-kategorii-tegi/ ?

  • io

    не пойму в чем дело, может быть нужно делать перекодировку функцией iconv() как это тут делается http://www.charnad.com/blog/postim-v-wordpress-cherez-xml-rpc-ch2-kategorii-tegi/ ?

  • io

    действительно, в файле poster.php после 24 строки добавил строки:

    $postTitle = iconv('cp1251', 'utf-8',$postTitle);
    $postTags = iconv('cp1251', 'utf-8',$postTags);
    $postText = iconv('cp1251', 'utf-8',$postText);

    и все стало работать нормально

    • Странно, форма должна отправляться сразу в UTF-8. И в заголовке страницы у меня эта кодировка прописана. Наверное, вы или сохранили скрипт представления в win-1251 или наложились настройки вашего сервера.
      Кстати, вместо iconv можно использовать mb_convert_encoding, результат будет тот же.

      • io

        наверное дело в том, что я файлы блокнотом редактирую (через total commander), а при сохранении обычным блокнотом кодировка файла windows-1251 (насколько мне известно)

  • io

    действительно, в файле poster.php после 24 строки добавил строки:

    $postTitle = iconv('cp1251', 'utf-8',$postTitle);
    $postTags = iconv('cp1251', 'utf-8',$postTags);
    $postText = iconv('cp1251', 'utf-8',$postText);

    и все стало работать нормально

    • Странно, форма должна отправляться сразу в UTF-8. И в заголовке страницы у меня эта кодировка прописана. Наверное, вы или сохранили скрипт представления в win-1251 или наложились настройки вашего сервера.
      Кстати, вместо iconv можно использовать mb_convert_encoding, результат будет тот же.

      • io

        наверное дело в том, что я файлы блокнотом редактирую (через total commander), а при сохранении обычным блокнотом кодировка файла windows-1251 (насколько мне известно)

  • io

    Владимир, а подскажите пожалуйста, можно ли встроить эту форму добавления в сам вордпресс. Т.е. сейчас форма добавления записи доступна по адресу site.com/system/index.php/poster/

    Я создаю страницу в вордпрессе «добавить» (site.com/add/) — она доступна через админку вордпресса

    вопрос: как сделать, чтобы форма добавления была по адресу site.com/add/ ?

  • io

    поправка: сейчас форма добавления записи доступна по адресу site.com/system/

    • Вам нужно вставить форму на страницу, созданную в WP (site.com/add/) и добавить обработчик этой формы, т.е. php код.
      Существует плагин (сейчас не вспомню как он называется, но думаю вы его легко найдете), который позволяет добавлять php код на страницу WP.

      Честно говоря, не могу понять зачем вам это нужно 😉

  • io

    Владимир, а подскажите пожалуйста, можно ли встроить эту форму добавления в сам вордпресс. Т.е. сейчас форма добавления записи доступна по адресу site.com/system/index.php/poster/

    Я создаю страницу в вордпрессе «добавить» (site.com/add/) — она доступна через админку вордпресса

    вопрос: как сделать, чтобы форма добавления была по адресу site.com/add/ ?

  • io

    поправка: сейчас форма добавления записи доступна по адресу site.com/system/

    • Вам нужно вставить форму на страницу, созданную в WP (site.com/add/) и добавить обработчик этой формы, т.е. php код.
      Существует плагин (сейчас не вспомню как он называется, но думаю вы его легко найдете), который позволяет добавлять php код на страницу WP.

      Честно говоря, не могу понять зачем вам это нужно 😉

  • Андрей

    Владимир, не подскажете, почему пропадают все угловые скобки при передаче? Точнее, на каком этапе они могут обрезаться?

    • Угловые скобки — это спецсимвол xml, если вы вставите их в текст, то «поломаете» запрос.
      Можно заменить их эскейп последовательностями, т.е. < на &lt;

      • Андрей

        Попробовал заменить на <. В посте осталось только lt; без амперсанда. Может как-то иначе нужно делать?

        • Прошу прощения, предыдущий совет был неправильный. Поспешил и написал первое, что в голову пришло.

          Нужно вставить ваш текст внутрь блока CDATA.
          <![CDATA[» ваш текст с любыми символами «]]>

          Более подробный пример.

      • Андрей

        Странно, но это не помогает. Причем, похоже, что дело в XML-RPC сервере, так как клиент отдает «необрезанный» контент. Но в посте опять-таки все «урезано».

        • А это похоже работают фильтры WordPress. Попробуйте вставить ваш текст в редакторе WP.

          В этом случае можно объединить оба способа. Использовать CDATA и прекодировать угловые скобки в эскейп-последовательности.

  • Андрей

    Владимир, не подскажете, почему пропадают все угловые скобки при передаче? Точнее, на каком этапе они могут обрезаться?

    • Угловые скобки — это спецсимвол xml, если вы вставите их в текст, то «поломаете» запрос.
      Можно заменить их эскейп последовательностями, т.е. < на &lt;

      • Андрей

        Попробовал заменить на <. В посте осталось только lt; без амперсанда. Может как-то иначе нужно делать?

        • Прошу прощения, предыдущий совет был неправильный. Поспешил и написал первое, что в голову пришло.

          Нужно вставить ваш текст внутрь блока CDATA.
          <![CDATA[» ваш текст с любыми символами «]]>

          Более подробный пример.

      • Андрей

        Странно, но это не помогает. Причем, похоже, что дело в XML-RPC сервере, так как клиент отдает «необрезанный» контент. Но в посте опять-таки все «урезано».

        • А это похоже работают фильтры WordPress. Попробуйте вставить ваш текст в редакторе WP.

          В этом случае можно объединить оба способа. Использовать CDATA и прекодировать угловые скобки в эскейп-последовательности.

  • Андрій

    Все чудово працює , гарно відправляє . А у кого рученята кривуваті , ну що тут поробиш . Кирилицю відправляє як і повинно бути . Мінуси- довга робота , але ,якщо врахувати , що це тільки «пища» для роздумів , досить не погано . Респект!!!

    • Мінуси- довга робота

      Тут сложно что-то сделать. Разработчик обычно не в состоянии контролировать скорость отправки запроса. Можно максимально ускорить его обработку (на стороне сервера), но на время передачи запроса влияет множество дополнительных факторов (например, скорость доступа к инету, нагрузка на сервера провайдера и хостера и т.п.), и с этим приходится мириться.
      В такой ситуации задача разработчика — максимально снизить количество запросов (желательно до 1).

  • Андрій

    Все чудово працює , гарно відправляє . А у кого рученята кривуваті , ну що тут поробиш . Кирилицю відправляє як і повинно бути . Мінуси- довга робота , але ,якщо врахувати , що це тільки «пища» для роздумів , досить не погано . Респект!!!

    • Мінуси- довга робота

      Тут сложно что-то сделать. Разработчик обычно не в состоянии контролировать скорость отправки запроса. Можно максимально ускорить его обработку (на стороне сервера), но на время передачи запроса влияет множество дополнительных факторов (например, скорость доступа к инету, нагрузка на сервера провайдера и хостера и т.п.), и с этим приходится мириться.
      В такой ситуации задача разработчика — максимально снизить количество запросов (желательно до 1).

  • Владимир здравствуйте! Хотел узнать а можно ли через xml-rpc выдернуть из WP только не опубликованные посты? Хотелось бы редактировать посты не заходя в блог. Что бы скрипт выдергивал первый не опубликованный пост и отдавал его мне, а я его уже редактировал бы! Ткните пожалуйста где почитать про это! Спасибо!

    • Смотреть в любом случае нужно xmlrpc.php 😉
      Но подходящей функции я там не нашел. Скорее всего придется получать общий список, а потом определять какие посты не опубликованы.

      • Меня тут «осенило»! А если закинуть скрипт в корень или не в корень блога, который будет выдергивать из базы нужный мне пост, а после редактирования будет записывать его в базу! и не нужно ни какими фреймворками пользоваться!

        • А почему тогда его из WP не отредактировать?

  • Владимир здравствуйте! Хотел узнать а можно ли через xml-rpc выдернуть из WP только не опубликованные посты? Хотелось бы редактировать посты не заходя в блог. Что бы скрипт выдергивал первый не опубликованный пост и отдавал его мне, а я его уже редактировал бы! Ткните пожалуйста где почитать про это! Спасибо!

    • Смотреть в любом случае нужно xmlrpc.php 😉
      Но подходящей функции я там не нашел. Скорее всего придется получать общий список, а потом определять какие посты не опубликованы.

      • Меня тут «осенило»! А если закинуть скрипт в корень или не в корень блога, который будет выдергивать из базы нужный мне пост, а после редактирования будет записывать его в базу! и не нужно ни какими фреймворками пользоваться!

        • А почему тогда его из WP не отредактировать?

  • отличная статейка !
    как раз автопостингом в WP решил заняться
    ток я бы во вьюшку еще такую строку добавил

    а то в теле то кодировка передается, а вот в заголовках нет, из за этого я не мог никак в читабельной кодировке посмотреть ответ.

    за 49ю строку — отдельное спасибо 🙂 помогла !

  • отличная статейка !
    как раз автопостингом в WP решил заняться
    ток я бы во вьюшку еще такую строку добавил

    а то в теле то кодировка передается, а вот в заголовках нет, из за этого я не мог никак в читабельной кодировке посмотреть ответ.

    за 49ю строку — отдельное спасибо 🙂 помогла !

  • ещё metaWeblog API не умеет рубрики создавать, поэтому если указанных рубрик нет, а нужно чтоб создавались — надо другой API юзать

    • Да, поддержки рубрик нет, но можно создавать теги. В принципе это взаимозаменяемые вещи.

  • ещё metaWeblog API не умеет рубрики создавать, поэтому если указанных рубрик нет, а нужно чтоб создавались — надо другой API юзать

    • Да, поддержки рубрик нет, но можно создавать теги. В принципе это взаимозаменяемые вещи.

  • Pingback: Серый SEO комбайн | Заработок в интернете - о способах и инструментах()

  • Будет очень огромная польза, если Вы напишете пример клиента не привязывая его к WP.

    • Я не против. Но есть проблема. Пример клиента нельзя привести без сервера. Т.е. клиент и сервер обмениваются между собой данными и структура этих данных должна быть заранее определена. Поэтому писать абстрактный клиент нет никакого смысла (работать он не будет).
      А WP я взял потому что это один из самых распространенных движков, о котором все знают.

  • Будет очень огромная польза, если Вы напишете пример клиента не привязывая его к WP.

    • Я не против. Но есть проблема. Пример клиента нельзя привести без сервера. Т.е. клиент и сервер обмениваются между собой данными и структура этих данных должна быть заранее определена. Поэтому писать абстрактный клиент нет никакого смысла (работать он не будет).
      А WP я взял потому что это один из самых распространенных движков, о котором все знают.

  • Ну, можно написать клиента к MetaWeblogAPI, т.к. он поддерживается большенством CMS.

    • Извините, данный пример приведен именно для этого API.

  • Ну, можно написать клиента к MetaWeblogAPI, т.к. он поддерживается большенством CMS.

    • Извините, данный пример приведен именно для этого API.

  • Тогда можно перефразировать вопрос!
    Если я правильно понял: эти два файла добавляются к уже работающему WordPress и позволяют добавлять новые посты в другие блоги на WP.
    А как сделать так, чтобы RPC-клиент лежал на сервера, где нет WP (просто, в корне лежит два файла poster.php и postform.php)?

    • Нет, эти два файла могут находится где угодно, на вашем локальном компьютере, на отдельном сервере, на том же сервере где и WP — это не важно. Главное, у вас должен быть доступ (через интернет) к серверу на котором находится WP.

      При вызове (строка 30 второго листинга)
      $this->xmlrpc->server(…)
      вы указываете адрес нужного сервера, т.е. что-то вроде
      _http://my_wp_blog.com/xmlrpc.php
      и запросы будут отправляться к нему.

      • То есть я могу разместить эти два файла на удаленном сервере Apache+PHP, где больше ничего нет и подкючатся к другому удаленному RPC-серверу WordPress`а? При этом содержимое файлов у меня будет такое же как и у Вас (не считая логина и пароля)?
        Можно подробнее рассказать о пункте: Настраиваем CodeIgniter. Где это делать? ))
        Заранее спасибо

  • Тогда можно перефразировать вопрос!
    Если я правильно понял: эти два файла добавляются к уже работающему WordPress и позволяют добавлять новые посты в другие блоги на WP.
    А как сделать так, чтобы RPC-клиент лежал на сервера, где нет WP (просто, в корне лежит два файла poster.php и postform.php)?

    • Нет, эти два файла могут находится где угодно, на вашем локальном компьютере, на отдельном сервере, на том же сервере где и WP — это не важно. Главное, у вас должен быть доступ (через интернет) к серверу на котором находится WP.

      При вызове (строка 30 второго листинга)
      $this->xmlrpc->server(…)
      вы указываете адрес нужного сервера, т.е. что-то вроде
      _http://my_wp_blog.com/xmlrpc.php
      и запросы будут отправляться к нему.

      • То есть я могу разместить эти два файла на удаленном сервере Apache+PHP, где больше ничего нет и подкючатся к другому удаленному RPC-серверу WordPress`а? При этом содержимое файлов у меня будет такое же как и у Вас (не считая логина и пароля)?
        Можно подробнее рассказать о пункте: Настраиваем CodeIgniter. Где это делать? ))
        Заранее спасибо

  • Последнее сообщение можно удалить))
    Поправте путь до библиотеки, он битый.

    У меня после нажатия кнопки отправить выдает ошибку
    The requested URL /your_wp_blog/index.php/poster/sendpost was not found on this server.

    • А какой именно путь битый? У меня все работает.

      /your_wp_blog/index.php/poster/sendpost — странный адрес
      должно быть
      _http://your_wp_blog.com/index.php/poster/sendpost

  • Последнее сообщение можно удалить))
    Поправте путь до библиотеки, он битый.

    У меня после нажатия кнопки отправить выдает ошибку
    The requested URL /your_wp_blog/index.php/poster/sendpost was not found on this server.

    • А какой именно путь битый? У меня все работает.

      /your_wp_blog/index.php/poster/sendpost — странный адрес
      должно быть
      _http://your_wp_blog.com/index.php/poster/sendpost

  • Победил последнюю ошибку!)))
    Теперь уже отсылает и говорит: Did not receive a '200 OK' response from remote server.

    P.S. Чувствую себя спамером))

  • Победил последнюю ошибку!)))
    Теперь уже отсылает и говорит: Did not receive a '200 OK' response from remote server.

    P.S. Чувствую себя спамером))

  • Владимир спасибо! Немного пришлось побадаться, но в результате всё заработало. К сожалению не на любом блоге есть возможность включить xmlrpc (я про фришные сервисы). Иконв пришлось вставить, тоже с кодировками были косяки.

    • Пожалуйста!
      Я обычно вместо iconv использую mb_convert_encoding.

  • Владимир спасибо! Немного пришлось побадаться, но в результате всё заработало. К сожалению не на любом блоге есть возможность включить xmlrpc (я про фришные сервисы). Иконв пришлось вставить, тоже с кодировками были косяки.

    • Пожалуйста!
      Я обычно вместо iconv использую mb_convert_encoding.

  • andrey

    А можно ли передавать через xmlrpc meta name «keywords» (отличные от wp tags), meta name «description» и tilte, отличный от заголовка поста. В общем то, что предлагает плаггин All in one SEO pack?

    • Да, можно. Правда плагин All in one SEO pack (или анологичный) должен быть установлен. В структуре с данными вы можете передать любые метаданные (это записи, которые хранятся в таблице wp_postmeta). Вам нужно посмотреть ключи значений плагина All in one SEO pack (поле meta_key) и передавать нужные значения.

  • andrey

    А можно ли передавать через xmlrpc meta name «keywords» (отличные от wp tags), meta name «description» и tilte, отличный от заголовка поста. В общем то, что предлагает плаггин All in one SEO pack?

    • Да, можно. Правда плагин All in one SEO pack (или анологичный) должен быть установлен. В структуре с данными вы можете передать любые метаданные (это записи, которые хранятся в таблице wp_postmeta). Вам нужно посмотреть ключи значений плагина All in one SEO pack (поле meta_key) и передавать нужные значения.

  • andrey

    Владимир, большое спасибо!

  • andrey

    Владимир, большое спасибо!

  • GiN

    Владимир, спасибо огромное за пример.
    А не могли бы Вы написать еще пример постинга в ЖЖ через xml-rpc?

    • Конечно могу! Но боюсь меня уже опередили. 🙂

      Если вам нужен более сложный пример, то пишите, что именно интересует, я попробую ответить, а может и пост будет 😉

      • GiN

        Честно признаться я не смог CI-шный xml-rpc под это подвязать.
        Со сторонними библиотеками все проще.
        Проблема в формировании массива с данными — то xml-rpc ошибку вываливает, то LJ возвращает непонтяные perl-овые ошибки.
        Так, если будет желание! и возможность написать — буду признателен =)

        • ОК, я понял в чем проблема. Поэкспериментирую на днях.

  • GiN

    Владимир, спасибо огромное за пример.
    А не могли бы Вы написать еще пример постинга в ЖЖ через xml-rpc?

    • Конечно могу! Но боюсь меня уже опередили. 🙂

      Если вам нужен более сложный пример, то пишите, что именно интересует, я попробую ответить, а может и пост будет 😉

      • GiN

        Честно признаться я не смог CI-шный xml-rpc под это подвязать.
        Со сторонними библиотеками все проще.
        Проблема в формировании массива с данными — то xml-rpc ошибку вываливает, то LJ возвращает непонтяные perl-овые ошибки.
        Так, если будет желание! и возможность написать — буду признателен =)

        • ОК, я понял в чем проблема. Поэкспериментирую на днях.

  • Pingback: Особое программирование » Post Topic » WordPress расширение возможностей встроенного XML-RPC сервера()

  • Oleg

    Fatal error: Call to undefined function site_url()…. Что делать

  • Alibabaevich7

    Подскажите, пожалуйста, как получить список id всех постов доступных на блоге?

    • blogger.getRecentPosts подойдет?

      • Alibabaevich7

        да, спасибо!
        Еще маленький вопросик, ответ от сервера приходит в странной кодировке, по ходу iso-8859-1. Как его «переключить» на отправку ответов в utf8?

      • Alibabaevich7

        Уже разобрался. Ответ и был в utf-8. Я немного натупил )

  • А в самом вордпрессе ничего включать не надо? А то попробовал с вордпресс клиента написать в свой бложек, а он меня послал 🙁

    • Конечно, нужно 🙂
      На странице Settings -> Writing в разделе Remote Publishing отметьте чекбокс напротив XML-RPC.
      Опция отключена по-умолчанию в целях безопасности.