Добавить медиа с WP-Rest-API v2

10

Мне нужна ваша помощь, чтобы загрузить медиа-изображение в мой блог 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('Redirect');
}
else
{
    $params = array('code' => $_GET['code'], 'redirect_uri' => REDIRECT_URI);
    $response = $client->getAccessToken(TOKEN_ENDPOINT, 'authorization_code', $params); //authorization_code
    $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" => "Titre media",       
    "description" => "description media",
    "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] => No data supplied
            [data] => Array
                (
                    [status] => 400
                )

        )

    [code] => 400
    [content_type] => application/json; charset=UTF-8
)

Есть идеи? большое спасибо

kain34440
источник
Я добавил код из вашего комментария к вопросу. Помните, что вы можете редактировать вопрос в любое время, чтобы добавить больше информации или сделать его более понятным.
Cybmeta
Лишний ;в wordpress.local/wp-json/wp/v2/media";является опечаткой здесь или в вашем реальном коде тоже?
Cybmeta
Согласно документации , WP REST API v2 требует этот плагин OAuth . Я не знаю, совместима ли используемая вами библиотека (OAuth2 / Client.php) с WP REST API или нет, но, вероятно, это не так.
Cybmeta
Большое спасибо! Дополнительное ->; нет в моем реальном коде! Я использую официальный плагин OAuth для своей аутентификации, файлы OAuth2.Client.php - это всего лишь библиотека, позволяющая легко делать запросы
керлинга
В разделе (документация) есть раздел «Создать носитель» [ v2.wp-api.org/reference/media/] . Я думаю, что вы source_urlдолжны быть внутри postобъекта.
ville6000

Ответы:

8

ТАК! Это весело.

Имейте в виду, что WP-API все еще находится в процессе разработки.

Content-Disposition

Я обнаружил проблему, о которой сообщили в очереди проблем WP-API о Content-Disposition. Это обязательный заголовок для публикации нового медиаконтента, и существуют некоторые очень и очень строгие требования, касающиеся предоставления его в надлежащем формате.

Цель создания медиа конечной точки

Во-первых, давайте сделаем шаг назад. API предполагает, что на данный момент вы уже загрузили новый файл в правильный каталог. Эта конечная точка создает мультимедийный контент в базе данных, которая ссылается на этот файл.

Решение

Вы должны указать имя файла мультимедийного файла, чтобы связать с вашим новым контентом. Это не может быть удаленный URL. Как вы можете видеть из документации v2 , source_urlи linkтолько для чтения. Все, что вам нужно сделать, чтобы успешно отправить новый контент, это добавить следующее в заголовок:

'Content-Disposition' => 'filename=name-of-file.jpg',

Как указано в заявке, вы не можете добавлять кавычки или указывать метод, который вы используете для отправки файла. Это должно быть в формате выше. По крайней мере, так оно и есть, пока все вокруг не изменится.

Убедитесь, что тип файла является одним из допустимых типов файлов, и вы включаете расширение файла, включенное в запрос. Спасибо доктору Део в комментариях.

Для протокола, я смеялся с головокружительной радостью, когда наконец понял это ... напугал мою жену до чертиков.

MikeNGarrett
источник
1
Большое спасибо за подсказку с Content-Disposition!
pHiL
Я думаю, что этот ответ - только подсказка, а не полное решение. Я следую этому совету и Sorry, this file type is not permitted for security reasons
получаю
@Brethlosze Это звучит как не связанная с этим проблема. WordPress блокирует определенные типы медиафайлов в обычном процессе загрузки.
MikeNGarrett
3
@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но если вы опустите в pngtmp.pngerror sorry, this file type is not permitted for security reasons
Dr Deo