Многие, наверное, знают, что в WordPress можно публиковать записи удаленно. Есть куча клиентов для этого, но самое интересное, что с помощью этой функции можно наполнять сетку сайтов через единый веб интерфейс. У такого способа масса преимуществ. Безопасность ( вход в админки сайтов закрыт по IP ), более работа с копирайтерами и редакторами ( они работают в едином, более упрощенном, интерфейсе и не имеют доступа собственно сайтам ), к такому веб интерфейсу можно прикрутить кучу разных плюшек, которые на самих wordpress сайтах не нужны.
Но сегодня я выложу немного кода, который позволяет мне постить статьи на WordPress сайтах через XML-RPC MetaWeblog API. Я использую PHP, Yii, Incutio XML-RPC library. Фреймворк и библиотека не принципиальны конечно. В CodeInteger например xml-rpc библиотека встроена по умолчанию, и, кстати, нравится мне значительно больше, чем Incutio.
Для начала ссылки
Кодекс по функциям MetaWeblog API
Incutio XML-RPC library
Настройка WordPress
- Ну во-первых ваш PHP должен быть собран с функцией libxml и php5-xmlrpc. Я не сталкивался с хостингами, где бы этого не было, но может быть всякое.
- В версиях WordPress выше 3.5 удаленная публикация включена по умолчанию. В более старых версиях её надо включить Settings > Writing > Remote Publishing.
- И, наконец, вам нужен юзер из под которого будут публиковаться удаленные статьи. Из под админа это делать не разумно. Поэтому заведите отдельного пользователя с правами автора.
Публикация поста через MetaWeblog API
Читайте комменты в коде:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Yii::import('application.extensions.xmlrpc.xmlrpc', true); // Специфично для Yii, по сути просто подключение библиотеки XML-RPC $client = new IXR_Client('https://azzrael.ru/wp/xmlrpc.php', false, 80, 45); // путь до вашего XML-RPC, зависит от путей установки $client->debug = false; // Отладка возможна $data = array( 0, //blog id - если у вас один сайт в этом Wordpress - ставьте 0 и не заморачивайтесь 'azzrael', // логин юзера от которого будет публикация. Использовать админа не стоит. 'Fhdk1637sk', // пароль array( 'title' =>$post_title, // Заголовок поста 'mt_allow_comments' =>1, // Разрешить комменты 'mt_allow_pings' =>0, // Разрешить пиги 'description' =>$post_content, // Содержимое поста ( html ) 'categories' =>array('Программирование','Сервера на azzrael.ru'), // С этим я долго намучался // Именно массив, именно названий рубрик ( не ID, не слаги, а именно полнотекстовые названия рубрик ) ), false //true - немедленная публикация, false - идет на модерацию ); if(!$client->query('metaWeblog.newPost',$data)) throw new Exception('Cant create new post metaWeblog.newPost'); |
Публикация изображения через MetaWeblog API
С публикацией поста все просто. С публикацией картинки веселее. Особенно если нужно привязать картинку к посту, и вставить загруженную картинку в пост. То есть сначала надо загрузить картинку, получить ссылки на разные её размеры, потом добавить картинки в текст поста, пост опубликовать, и проставить картинке привязку к посту.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
// Читаем картинку так чтобы получить MIME и заодно проверить её доступность по заданному пути if(!$im = @getimagesize($imgFile)) throw new Exception('Cant get image'); // Библиотека XML-RPC для работы с WP Yii::import('application.extensions.xmlrpc.xmlrpc', true); // Пароли к сайтам $xmlrpc = 'https://azzrael.ru/wp/xmlrpc.php'; $usr = 'azzrael'; $pwd = 'password'; // Отправляем и обрабатываем ответ $client = new IXR_Client($xmlrpc, false, 80, 45); $client->debug = false; $params = array( 'name' => 'image_filename.jpg', 'type' => $im['mime'], 'bits' => new IXR_Base64($imgData), // Этот класс есть в Incutio XML-RPC library. // В CI, например, её нет и приходится писать. // Пробленое место 'overwrite' => true ); // Загружаем картинку и получаем её ID if(!$client->query('wp.uploadFile',1, $usr, $pwd, $params)) throw new Exception('Cant SEND image throw wp.uploadFile'); // и получаем её ID $ret_arr = $client->getResponse(); // Получаем по ID картинки её метадату ( урл, тумбы ) if(!$client->query('wp.getMediaItem',1, $usr, $pwd, $ret_arr['id'])) throw new Exception('Cant SEND image rhrow wp.getMediaItem'); // Возвращаем урлы для вставки в пост $ret_arr = $client->getResponse(); // Маленькая картинка // http://codex.wordpress.org/XML-RPC_WordPress_API/Media // medium, large, thumbnail $img_lnk = $ret_arr['metadata']['sizes']['medium']['file']; |
Как то так получается. Обвязку вокруг показывать не вижу смысла, сами свое допишете. Если что — спрашивайте в комментариях.
Wild 2017-02-08