Загружаем изображения с помощью 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/