Добавление медиафайлов через WP-Rest-API v2
Мне нужна помощь в загрузке медиа-изображения в мой блог WordPress через WP-REST-API v2 с аутентификацией OAuth2.
Я не нашел в документации REST API способ отправки данных изображения (название поля, режим отправки...?).
require('OAuth2/Client.php');
require('OAuth2/GrantType/IGrantType.php');
require('OAuth2/GrantType/AuthorizationCode.php');
const CLIENT_ID = 'XXX';
const CLIENT_SECRET = 'XX';
const REDIRECT_URI = 'http://127.0.0.1/test_api_wp/test.php';
const AUTHORIZATION_ENDPOINT = 'http://wordpress.local/oauth/authorize';
const TOKEN_ENDPOINT = 'http://wordpress.local/oauth/token';
$client = new OAuth2\Client(CLIENT_ID, CLIENT_SECRET);
if (!isset($_GET['code']))
{
$auth_url = $client->getAuthenticationUrl(AUTHORIZATION_ENDPOINT, REDIRECT_URI);
header('Location: ' . $auth_url);
die('Перенаправление');
}
else
{
$params = array('code' => $_GET['code'], 'redirect_uri' => REDIRECT_URI);
$response = $client->getAccessToken(TOKEN_ENDPOINT, 'authorization_code', $params); //код_авторизации
$token = $response['result']['access_token'];
$client->setAccessToken($token);
$client->setAccessTokenType(OAuth2\Client::ACCESS_TOKEN_BEARER);
}
$values = array(
"date" => "2015-11-26 10:00:00",
"date_gmt" => "2015-11-26 09:00:00",
"modified" => "2015-11-26 10:00:00",
"modified_gmt" => "2015-11-26 09:00:00",
"status" => "future",
"title" => "Заголовок медиафайла",
"description" => "описание медиафайла",
"media_type" => "image",
"source_url" => "https://www.base64-image.de/build/img/mr-base64-482fa1f767.png"
);
$data = $client->fetch("wordpress.local/wp-json/wp/v2/media", $values, "POST");
echo "<pre>";print_r($data);echo "</pre>";
Ответ:
Array
(
[result] => Array
(
[code] => rest_upload_no_data
[message] => Данные не предоставлены
[data] => Array
(
[status] => 400
)
)
[code] => 400
[content_type] => application/json; charset=UTF-8
)
Есть идеи? Большое спасибо
Итак! Это интересно.
Имейте в виду, что WP-API все еще находится в стадии активной разработки.
Content-Disposition
Я обнаружил проблему, зарегистрированную в очереди задач WP-API, касающуюся заголовка Content-Disposition. Это обязательный заголовок для публикации нового медиа-контента, и существуют очень строгие требования к его правильному формату.
Назначение конечной точки Create Media
Во-первых, давайте сделаем шаг назад. API предполагает, что на этом этапе вы уже загрузили новый файл в нужную директорию. Эта конечная точка создает медиа-контент в базе данных, который ссылается на этот файл.
Решение
Вам необходимо указать имя файла медиа, который будет связан с вашим новым контентом. Это не может быть удаленный URL. Как видно из документации версии 2, source_url и link доступны только для чтения. Все, что вам нужно сделать для успешной отправки нового контента, это добавить следующий заголовок:
'Content-Disposition' => 'filename=имя-файла.jpg',
Как упоминалось в тикете, вы не можете добавлять кавычки или указывать метод, с помощью которого отправляете файл. Формат должен быть именно таким, как указано выше. По крайней мере, так обстоят дела, пока всё не изменят снова.
Убедитесь, что тип файла входит в список разрешенных типов, и что расширение файла указано в запросе. Спасибо Dr Deo за комментарий.
К вашему сведению, я смеялся от радости, когда наконец разобрался с этим... и здорово напугал свою жену.
Я думаю, этот ответ является лишь подсказкой, а не полным решением. Я следую этому совету и получаю ошибку Sorry, this file type is not permitted for security reasons
Brethlosze
@Brethlosze Это звучит как несвязанная проблема. WordPress блокирует определённые типы медиа при обычной загрузке.
MikeNGarrett
@Brethlosze расширение файла должно быть одного из разрешенных типов. Например, это работает curl --request POST --url http://localhost/kayinjaproject/wp-json/wp/v2/media --header "cache-control: no-cache" --header "content-disposition: attachment; filename=tmp.png" --header "authorization: Basic cm9vdDppYW1haGVybw==" --header "content-type: image/png" --data-binary "@c:/gnu/png.png" --location, но если вы уберете png из имени файла tmp.png, вы получите error sorry, this file type is not permitted for security reasons
Dr Deo
Для "перекрестной ссылки" смотрите мой связанный ответ здесь на StackOverflow о загрузке медиа и использовании этого медиа как "избранного медиа" для записи.
Ответ для PHP CURL:
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'EndPoint',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => array('file'=> new CURLFILE('LocalFilePathHere')),
CURLOPT_HTTPHEADER => array(
'Content-Disposition: attachment; filename=abc.jpg',
'Content-Type: image/jpeg',
'Authorization: XXX YYY'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
Если вы всё ещё сталкиваетесь с ошибкой "Извините, этот тип файла не разрешён по соображениям безопасности", вам необходимо добавить в wp-config.php отключение фильтрации для пользователя с правами администратора:
define('ALLOW_UNFILTERED_UPLOADS', true);