Dodaj multimedia za pomocą WP-Rest-API v2

10

Potrzebuję twojej pomocy, aby załadować obraz medialny na moim blogu wordpress poprzez uwierzytelnianie Wp-rest-api v2 i Oauth2.

W dokumentacji interfejsu API REST nie znalazłem sposobu na przesłanie danych obrazu (nazwa pola, tryb wysyłania ...?).

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>";

Odpowiedź :

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
)

Dowolny pomysł? Wielkie dzięki

kain34440
źródło
Dodałem kod z twojego komentarza do pytania. Pamiętaj, że możesz edytować pytanie w dowolnym momencie, aby dodać więcej informacji lub wyjaśnić.
cybmeta
Wyjątkowo ;w wordpress.local/wp-json/wp/v2/media";to się tu błędnie albo jest w prawdziwym kodzie też?
cybmeta
Zgodnie z dokumentacją WP REST API v2 wymaga tej wtyczki OAuth . Nie wiem, czy używana biblioteka (OAuth2 / Client.php) jest zgodna z API WP REST, czy nie, ale prawdopodobnie nie jest.
cybmeta
Wielkie dzięki! Dodatkowe ->; nie ma w moim prawdziwym kodzie! Używam oficjalnej wtyczki OAuth do uwierzytelnienia mnie, pliki OAuth2.Client.php to tylko biblioteka do łatwego składania żądań curl
kain34440,
Istnieje sekcja Utwórz media w (dokumentacja) [ v2.wp-api.org/reference/media/] . Myślę, że source_urlpowinieneś być w postobiekcie.
ville6000,

Odpowiedzi:

8

WIĘC! To jest fajne.

Należy pamiętać, że WP-API jest wciąż bardzo, bardzo w toku.

Dyspozycja treści

Znalazłem problem zgłoszony w kolejce problemów WP-API dotyczący Content-Disposition. Jest to wymagany nagłówek do publikowania nowych treści medialnych i istnieją bardzo, bardzo surowe wymagania, jeśli chodzi o udostępnianie tego w odpowiednim formacie.

Cel utworzenia medialnego punktu końcowego

Po pierwsze, cofnijmy się o krok. Interfejs API zakłada, że ​​w tym momencie przesłałeś już nowy plik do właściwego katalogu. Ten punkt końcowy tworzy zawartość multimedialną w bazie danych, która odwołuje się do tego pliku.

Rozwiązanie

Musisz podać nazwę pliku multimedialnego, aby powiązać go z nową treścią. To nie może być zdalny adres URL. Jak widać z dokumentacji v2 , source_urli linksą tylko do odczytu. Aby pomyślnie przesłać nową treść, musisz tylko dodać do nagłówka:

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

Jak wspomniano w zgłoszeniu, nie można dodawać ofert ani określać metody wysyłania pliku. To musi być w formacie powyżej. Przynajmniej tak jest, dopóki nie zmienią tego dookoła.

Upewnij się, że typ pliku jest jednym z akceptowanych typów plików i że dołączasz rozszerzenie pliku zawarte w żądaniu. Dzięki dr Deo w komentarzach.

Dla przypomnienia, roześmiałem się z zawrotną radością, kiedy w końcu zorientowałem się, że ... przestraszyłem moją żonę.

MikeNGarrett
źródło
1
Wielkie dzięki za podpowiedź z Content-Disposition!
pHiL
Myślę, że ta odpowiedź jest jedynie wskazówką, a nie kompletnym rozwiązaniem. Sorry, this file type is not permitted for security reasons
Postępuję
@Brethlosze To brzmi jak niezwiązany problem. WordPress blokuje niektóre rodzaje multimediów w normalnym procesie przesyłania.
MikeNGarrett
3
@Brethlosze rozszerzenie pliku musi być jednym z akceptowanych typów. Na przykład to działa, 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" --locationale jeśli pominiesz pngnazwę pliku tmp.png, otrzymaszerror sorry, this file type is not permitted for security reasons
Dr Deo
2

Ze względu na „odsyłacze” zobacz moją pokrewną odpowiedź tutaj na StackOverflow dotyczącą przesyłania multimediów i używania tych mediów jako „polecanych mediów” dla postu.

pHiL
źródło