Добавление медиафайлов через 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 Это звучит как несвязанная проблема. WordPress блокирует определённые типы медиа при обычной загрузке.

@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

Для "перекрестной ссылки" смотрите мой связанный ответ здесь на 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);
