Загружаем изображения с помощью XML-RPC и PHP в WordPress

Допустим, что вы уже знакомы с протоколом XML-RPC и понимаете, как он работает. Возможно, вы использовали его при добавлении записей, удалении страниц и т.д. С текстом проблем обычно не возникает. Давайте теперь предположим, что нам необходимо отправить изображения в WordPress. Как это сделать?

В данном учебном руководстве мы покажем, как можно отправить изображения в WordPress, чтобы они отобразились в секции Медиа панели администратора. Мы будем использовать PHP для загрузки изображения. Таким образом, вы можете в случае необходимости оформить код в виде отдельного плагина или темы.

План

Чтобы вы могли получить общее представление о том, чем мы будем заниматься, мы привели небольшой план действий. В частности, все наши усилия будут направлены на написание PHP-скрипта, который будет загружать некоторый файл (jpeg-изображение) в локальную сборку WordPress. Для создания XML-RPC клиента в PHP мы воспользуемся дополнительной библиотекой, позволяющей установить соединение с XML-RPC сервером WordPress и передать ему наши данные. В качестве такого клиента будет выступать PHP-библиотека, носящая название “The Incutio XML-RPC Library for PHP”. Она может быть загружена по следующей ссылке.

Подготовка рабочей среды

Первое, что потребуется нам для выполнения шагов в данном учебном руководстве, — это рабочая версия WordPress и Apache-сервер с установленными PHP и MySQL. Мы рекомендуем отработать представленный пример на локальном сервере, чтобы избежать различных ошибок.

Еще одна вещь, которая нам понадобится, — это библиотека XML-RPC, используемая в представленном руководстве. Библиотека является свободно распространяемой по лицензии BSD Licence. Скачать ее можно с сайта scripts.incutio.com.

Библиотека представляет собой обычный PHP-файл под названием IXR_Library.php. Именно этот файл понадобится нам для дальнейших действий. Также нам потребуется создать каталог в htdocs (или в корневой директории) вашего локального сервера, после чего скопировать в него файл IXR_Library.php. Создадим также в этой папке файл index.php. На текущий момент файл должен быть пустым.

Теперь важно провести активацию службы XML-RPC. По умолчанию она деактивирована в WordPress, таким образом нам понадобится включить ее вручную. Чтобы сделать это, перейдите в панель управления, выберите раздел Параметры – Написание. Под заголовком Удаленная Публикация вы найдете опцию XML-RPC. Включите ее и сохраните изменения.

Теперь мы можем связываться с сервером XML-RPC, который встроен в WordPress.

Начинаем писать код

Откроем созданный ранее файл index.php в любом текстовом редакторе, который вам больше нравится.

Первое, что мы должны сделать, — это подключить библиотеку для последующего использования. Добавим в файл index.php следующий код:

<?php
include_once('IXR_Library.php');
?>

Для полноценной работы скрипта больше ничего не требуется. Теперь мы можем перейти к клиентской части библиотеки.

Перед нами стоит задача – отправить файл jpeg в WordPress. Как это сделать? Решение состоит в том, что мы будем передавать файл в битовом формате. Но для начала нам необходимо будет это изображение, а точнее его контент, преобразовать в биты. Файл (мы назвали его test.jpg) будет расположен в той же самой папке, что и index.php. В следующем сниппете мы считываем контент файла и сохраняем его в переменную для последующего использования.

$myFile = "test.jpg";
$fh = fopen($myFile, 'r');
$fs = filesize($myFile);
$theData = fread($fh, $fs);
fclose($fh);

В коде мы создаем новую переменную $myfile строкового типа, в которой будет храниться название файла. Так как файл расположен в той же самой папке, что и index.php, нам не понадобится добавлять сложные конструкции к адресу файла, ограничившись лишь его названием, test.jpg.

Затем мы должны открыть файл, что делается функцией fopen, в которой мы используем два параметра. В качестве первого параметра используется переменная $myFile, в качестве второго – индикатор операции, которую необходимо совершить с файлом. В данном случае ‘r’ означает ‘reading’, то есть чтение. Результат операции по открытию файла будет храниться в переменной $fh.

Теперь нам необходимо узнать длину контента, для чего нам понадобится переменная $fs со значением, возвращенным функцией $filesize.

За чтение контента ответственна функция fread, которая заносит весь контент в переменную $theData. Эта функция использует два параметра, полученные ранее: переменную $fh и переменную $fs.
Наконец, мы закрываем открытый ранее файл с помощью функции fclose и ее параметра $fh. На данном этапе у нас есть контент jpg-файла, который нам требуется передать XML-RPC-серверу WordPress.

Создание XML-RPC-клиента

В этой части мы будем пользоваться библиотекой, которую мы импортировали ранее. Она нам понадобится для соединения с сервером XML-RPC. Чтобы сделать это, нам потребуются три переменные: $usr (имя пользователя панели администратора), $pwd (пароль панели администратора), $xmlrpc (путь к серверу XML-RPC). Заметьте, что путь к серверу XML-RPC состоит из базового URL-адреса сборки WordPress, к которому добавляется xmlprc.php в самом конце пути после наклонной черты (слэша).

$usr = 'admin';
$pwd = 'admin';
$xmlrpc = 'http://localhost/wordpress/xmlrpc.php';
$client = new IXR_Client($xmlrpc);

Теперь мы должны создать вызов к серверу. Для этого мы будем использовать строку URL и класс IXR_Client, который будет наследоваться от импортированного файла библиотеки. На данном этапе переменная $client объявлена как новый клиент для указанной ссылки, и все операции будут проходить через него.
Следующая часть является дополнительной, поскольку она содержит отладку. Если вы хотите ее активировать, добавьте следующий код:

$client->debug = true;

Теперь вы сможете увидеть все ошибки, если таковые возникнут.

Организация данных

Прежде, чем мы отправим данные, они должны быть организованы и должным образом форматированы, что определяется тем способом, который мы выбрали для их передачи. Нам понадобится создать массив со всеми значениями. Давайте назовем его $params:

$params = array('name' => 'test.jpg', 'type' => 'image/jpg', 'bits' => new IXR_Base64($theData), 'overwrite' => false);

Сначала мы должны передать массиву название файла (test.jpg). Затем мы передаем тип файла (image/jpg). Третий параметр, bits – это фактически тот файл, который нам необходимо передать. WordPress XML-RPC API требует это значение для пересылки 64 битов. Чтобы сделать это корректно, мы используем переменную $theData, однако мы должны это сделать через класс IXR_Base64, чтобы контент был закодирован в base64-биты. Очень важно, чтобы кодирование base64 было проведено правильно, иначе неизбежно появятся ошибки при передаче файла на сервер. Класс IXR_Base64, используемый в представленном примере, выполняет преобразование контента файла, как того требует сервер. Наконец, последний параметр overwrite установлен в false, чтобы не происходило перезаписи уже существующих файлов с таким же названием.

Отправка данных через XML-RPC

Последнее, что нам понадобится сделать – это отправить данные в WordPress, активируя запрос от переменной $client:

$res = $client->query('wp.uploadFile',1, $usr, $pwd, $params);

Переменная $res содержит результат запроса, вызванного из переменной $client. Фактически мы отправляем запрос к серверу. Сервер получает запрос со следующими параметрами:

wp.uploadFile – необходимая служебная функция, которая вызывается при загрузке файла.
1 – ID блога (у каждого блога WordPress есть свой ID. По умолчанию выставляется 1)
$usr – имя пользователя, уже указываемое ранее
$pwd – пароль, уже указываемый ранее
$params – массив параметров, о которых мы говорили ранее

Весь код полностью:

<?php
include('IXR_Library.php');
$myFile = "test.jpg";
$fh = fopen($myFile, 'r');
$fs = filesize($myFile);
$theData = fread($fh, $fs);
fclose($fh);
$usr = 'admin';
$pwd = 'admin';
$xmlrpc = 'http://localhost/wordpress/xmlrpc.php';
$client = new IXR_Client($xmlrpc);
$client->debug = true;
$params = array('name' => 'test.jpg', 'type' => 'image/jpg', 'bits' => new IXR_Base64($theData), 'overwrite' => false);
$res = $client->query('wp.uploadFile',1, $usr, $pwd, $params);
?>

http://wp.tutsplus.com/tutorials/creative-coding/uploading-pictures-via-xml-rpc-and-php-to-wordpress/

Блог про WordPress
Комментарии: 1
  1. Дмитрий

    Все это хорошо, и все работает, но как ПОЛУЧИТЬ АДРЕС ЗАГРУЖЕННОЙ КАРТИНКИ ?
    Адрес загруженного файла в ответе сервера вижу, но… как дернуть URL чтобы его потом использовать?
    пытался регулярками дернуть с ответа сервера- не получается….

Добавить комментарий

Получать новые комментарии по электронной почте.