Отложенная публикация постов в WordPress с помощью XML-RPC

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

wordpress-xml-rpc

Я думаю, многие блоггеры пользуются возможностью отложенной публикации постов в WP. Действительно, функция очень удобная, т.к. позволяет публиковать новые материалы через более-менее равномерные промежутки времени. К тому же для ее использования делать практически ничего не нужно, достаточно просто указать в админке WordPress дату публикации.

Но недавно у меня возникла задача публиковать посты через XML-RPC и, сразу же обнаружилось несколько не совсем очевидных нюансов, которые касаются указания даты. О них я и хочу сегодня рассказать.

Для начала немного теории.

WordPress имеет встроенный XML-RPC сервер, который позволяет выполнять практически все операции с постами и страницами (создание/чтение/изменение/удаление).

Примечание. По-умолчанию в целях безопасности поддержка XML-RPC отключена. Вы можете включить ее на странице SettingsWritingEnable the WordPress, Movable Type, MetaWeblog and Blogger XML-RPC publishing protocols.

Для публикации поста нужно сформировать и отправить XML-RPC запрос со всеми необходимыми данными.

Естественно, формировать его вручную не самое увлекательное занятие. Гораздо удобнее использовать одну из многочисленных библиотек для работы с XML-RPC.

Для этого примера я решил использовать библиотеку под названием IXR_Library, которую, кстати, использует и движок WordPress.

Только WP ее использует для создания XML-RPC сервера, а нам нужен XML-RPC клиент.

Нам потребуется выполнить 3 несложных действия.

1) Создать объект типа IXR_Client (XML-RPC клиент).

2) Создать массив с данными.

3) Опубликовать пост с помощью метода query.

Наибольшие проблемы вызывает второй этап. При формировании массива важно не ошибиться с именами ключей массива и форматом значений, которые в них передаются.

Взгляните на пример кода.

include('IXR_Library.inc');

$client = new IXR_Client('http://myblog.com/xmlrpc.php');

$requestData = array(
	0,
	$userName,
	$userPass,
	array(
		'title'=>'Заголовок поста',
		'mt_allow_comments'=>1,
		'mt_allow_pings'=>0,
		'mt_keywords'=>'tag1, tag2',
		'dateCreated'=>new IXR_Date('20091021T12:23:10'),
		'description'=>'Тут нужно вставить текст поста ...'
	),
	TRUE
);

$resp = $client->query('metaWeblog.newPost', $requestData);
$postId = $client->getResponse();

Мы подключили библиотеку, создали объект типа IXR_Client (при этом мы указали адрес блога) и начали заполнять массив с данными ($requestData).

Первым элементом этого массива должен быть id автора. Если вы единственный автор блога, ставьте 0.

Второй и третий элементы – ваши логин и пароль.

Четвертый элемент — массив с данными. Это ассоциативный массив, поэтому последовательность элементов роли не играет. В данном случае мы указали заголовок поста (title), разрешили комментарии (mt_allow_comments) и запретили пинги (mt_allow_pings).

Обратите внимание. Элементам mt_allow_comments и mt_allow_pings нужно присвоить числовые значения, элементу title – текстовое.

Затем мы указали перечень тегов (mt_keywords) и добавили текст поста (description).

Теперь о дате. Передавать нужно объект типа IXR_Date, а в его конструкторе указать дату в формате «ггггммддТчч:мм:сс». Букву «Т» в принципе можно заменить любой другой или пробелом, она просто игнорируется. Но все остальные значения должны быть введены в строгом соответствии с этим форматом, а длина строки должна равняться 17-ти символам.

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

Пятый элемент массива – булево значение, указывает, публиковать пост или нет. Если дата, указанная в элементе dateCreated еще не наступила, то статус поста будет scheduled.

Для отправки поста мы используем метод query. В его первом параметре указываем название функции XML-RPC сервера, которую мы хотим вызвать. В данном случае это metaWeblog.newPost. Во втором – передаем массив с данными.

Примечание. Подробнее о функциях, которые поддерживает XML-RPC сервер WP можно почитать в статье «Публикация постов в WordPress с помощью XML-RPC и CodeIgniter». Но основными источниками информации остаются Codex WP и, конечно, сам файл xmlrpc.php.

Получить id опубликованного поста можно с помощью метода getResponse.

Как видите, ничего принципиально сложного нет. Главное правильно сформировать массив с данными 😉

А вообще XML-RPC интерфейс позволяет делать очень интересные вещи. Например, можно сделать общую панель управления несколькими блогами или систему для получения расширенной статистики (частота публикаций, среднее количество комментариев и т.п.).

Возможности ограничены только вашей фантазией 🙂

  • А можно взять мой класс wp-poster, и там объекту wp-post сделать setDate(strtotime('время'));

    • WP-post — я правильно ссылку поставил?

      Очень хорошее решение.

      Один вопрос. Есть ли способ указать параметры для которых нет соответствующего метода? Вроде mt_allow_pings.

    • Вопрос снимается, уже нашел 🙂

  • А можно взять мой класс wp-poster, и там объекту wp-post сделать setDate(strtotime('время'));

    • WP-post — я правильно ссылку поставил?

      Очень хорошее решение.

      Один вопрос. Есть ли способ указать параметры для которых нет соответствующего метода? Вроде mt_allow_pings.

    • Вопрос снимается, уже нашел 🙂

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

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

  • Благодаря вашей статье убедился, что XML-RPC действительно позволяет делать интересные вещи. Благодарствую.

  • Благодаря вашей статье убедился, что XML-RPC действительно позволяет делать интересные вещи. Благодарствую.

  • Хм, действительно, сам часто пользую на некоторых блогах функцию эту, незнал, что так может быть!

  • Хм, действительно, сам часто пользую на некоторых блогах функцию эту, незнал, что так может быть!

  • Очень хороший плагин для саттелитов.Ведь сейчас,чтоб саттелит долго приносил прибыль,надо сделать его в глазах поисковика СДЛ`ом.ДЛя этого нужно подождать 2-3 месяца и регулярно добавлять статьи

  • Очень хороший плагин для саттелитов.Ведь сейчас,чтоб саттелит долго приносил прибыль,надо сделать его в глазах поисковика СДЛ`ом.ДЛя этого нужно подождать 2-3 месяца и регулярно добавлять статьи

  • А я вообще плагин искала, который позволял бы публиковать посты в разное время )) Все-таки полезно иногда почитать о системе с которой работаешь.

  • А я вообще плагин искала, который позволял бы публиковать посты в разное время )) Все-таки полезно иногда почитать о системе с которой работаешь.

  • Привет! Спасибо за пост. Нашел, что искал. Вопросик вот созрел небольшой. Я слышал что можно как то публиковать сразу несколько постов одновременно и ставить для них разные даты и тоесть публикация получается наперед. К примеру 10 статей разбить на будущую публикацию на 10 дней, по 1 в день. Как такое можно осуществить?

    • Разбивать статью нужно вручную, т.е. отправить 10 XML-RPC запросов с кусками статьи. А дату публикации просто ставите ту, которая нужна. WP сам опубликует пост когда эта дата наступит.

  • Привет! Спасибо за пост. Нашел, что искал. Вопросик вот созрел небольшой. Я слышал что можно как то публиковать сразу несколько постов одновременно и ставить для них разные даты и тоесть публикация получается наперед. К примеру 10 статей разбить на будущую публикацию на 10 дней, по 1 в день. Как такое можно осуществить?

    • Разбивать статью нужно вручную, т.е. отправить 10 XML-RPC запросов с кусками статьи. А дату публикации просто ставите ту, которая нужна. WP сам опубликует пост когда эта дата наступит.

  • Lusy

    А как правильно написать строку

    'dateCreated'=>new IXR_Date('20091021T12:23:10'),

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

  • Наверное, вы хотели спросить: «Куда ее вставить?» Т.к. записывается строка точно также.

    Вставлять нужно в poster.php во вложенный массив (строки 38-42).

  • Lusy

    Когда точно так же записывала ошибку выдавала,
    'dateCreated' => array($data,'dateTime.iso8601'),
    а так все работает, но когда $data читаю из файла получаю The XML data receieved was either invalid or not in the correct form for XML-RPC. Turn on debugging to examine the XML data further.
    Не подскажите в чем проблема?

  • Lusy

    Вопрос снимается все работает. Спасибо за статьи.

  • B0rn

    Прошу помощи, делаю тот же самый код для портала diary.ru, пишет ошибку: Incorrect parameters passed to method: No method signature matches number of parameters

    как обойти?
    код: (извините не знаю какой тэг обертки кода здесь)
    $client = new IXR_Client('www.diary.ru','/client/mwa.php');
    $requestData = array(
    0,
    «name»,
    «pswrd»,
    array(
    'title'=>'Заголовок поста',
    'mt_allow_comments'=>1,
    'mt_allow_pings'=>0,
    'mt_keywords'=>'tag1, tag2',
    'dateCreated'=>new IXR_Date('20091021T12:23:10'),
    'description'=>'Тут нужно вставить текст поста …'
    ),
    TRUE
    );
    if (!$resp = $client->query('metaWeblog.newPost', $requestData)) {
    die('Something went wrong — '.$client->getErrorCode().' : '.$client->getErrorMessage());
    }
    $postId = $client->getResponse();

  • А вы уверены, что diary.ru работает на WP?

  • B0rn

    бившись день, все таки удалось кое что достичь.
    этой функцией возвращаю все блоги — все ок (diary.ru поддерживает metaWeblog API and Blogger API)
    public function getUsersBlogs($name, $password)
    {
    $client = new IXR_Client(self::DIARY_HOST, self::DIARY_PATH);
    $resp = $client->query('blogger.getUsersBlogs', // method
    self::BLOGGER_APPKEY, // appkey default
    $name, // username
    $password // password
    );
    if (!$resp) {
    die('Something went wrong — ' . $client->getErrorCode() . ' : ' . $client->getErrorMessage());
    }
    $blogs = $client->getResponse();
    print_r($blogs);

    // возвращаем информацию о полученных блогах
    return $blogs;
    }

    но когда я вытаюсь вызвать функцию metaWeblog.getRecentPosts то всегда пишет ошибку что нет такого ID блога. (для ЖЖ и ли.ру все работает хорошо с теми же функциями. )

    что может быть?

  • Можете показать что выводит
    print_r($blogs);
    ?

  • Seshaln_reg

    А как удалять посты ?

  • B0rn

    Something went wrong — 805 : wrong JournalId
    обнаружил совсем случайно вот какую вещь: при изменении поста (функцией апи) — айди поста тоже не принимало, вместо числа вставил tag:diary.ru,2008:blog-1852795.post1179060299 — заработало, что за дела..

  • Есть специальный метод
    blogger.deletePost
    параметры следующие
    $post_ID = (int) $args[1];
    $username = $args[2];
    $password = $args[3];
    $publish = $args[4];
    последний (publish), судя по всему, нигде не используется.

  • А в БД id поста не менялся?

  • Emiljen

    Здравствуйте! Хотелось узнать, получилось ли запостить на diary.ru? Столкнулся с аналогичной задачей и аналогичными проблемами при попытке запостить на diary.ru. Перебрали кучу документации, но так и не поняли как обойти эту проблему.

  • К сожалению, я не знаю чем закончилась история с diary.ru.