Додайте медіа-файли за допомогою 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
)

Будь-яка ідея? Дуже дякую


Я додав закодований ваш коментар до запитання. Пам’ятайте, що ви можете в будь-який час відредагувати питання, щоб додати більше інформації або зробити це більш зрозумілим.
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 все ще дуже, дуже працює.

Зміст-диспозиція

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

Мета створення кінцевої точки медіа

Спочатку зробимо крок назад. API припускає, що в цей момент ви вже завантажили новий файл у правильний каталог. Ця кінцева точка створює медіа-контент у базі даних, на який посилається цей файл.

Рішення

Ви повинні вказати ім'я файлу медіа-файлу, щоб пов’язати його з новим вмістом. Це не може бути віддаленою URL-адресою. Як видно з документації v2 , source_urlі linkвони доступні лише для читання. Все, що вам потрібно зробити, щоб успішно подати новий вміст - це додати у свій заголовок наступне:

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

Як зазначено в квитку, ви не можете додавати котирування або вказувати спосіб, який ви використовуєте для надсилання файлу. Він повинен бути у форматі вище. Принаймні, це так, поки вони не змінить це все навколо.

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

Для запису я сміявся від запаморочливої ​​радості, коли, нарешті, розібрався з цим… злякався пекла з дружини.


1
Великий THX для підказки з 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але якщо пропустити ім’я pngз імені файлу tmp.png, ви отримаєтеerror sorry, this file type is not permitted for security reasons
Д-р Део

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.