Aggiungi media con WP-Rest-API v2


10

Ho bisogno del tuo aiuto per caricare un'immagine multimediale nel mio blog wordpress tramite l'autenticazione Wp-rest-api v2 e Oauth2.

Non ho trovato nella documentazione dell'API REST il modo di inviare i miei dati di immagine (nome del campo, modalità di invio ...?).

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

La risposta :

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
)

Qualche idea? molte grazie


Ho aggiunto il codice dal tuo commento alla domanda. Ricorda che puoi modificare la domanda in qualsiasi momento per aggiungere ulteriori informazioni o renderlo più chiaro.
cybmeta,

Il extra ;in wordpress.local/wp-json/wp/v2/media";è un mistype qui o è anche nel tuo vero codice?
cybmeta,

Secondo i documenti , l'API WEST REST v2 richiede questo plug-in OAuth . Non so se la libreria che stai utilizzando (OAuth2 / Client.php) sia compatibile con l'API REST WP o no, ma probabilmente non lo è.
cybmeta,

Grazie mille! Il extra ->; non è presente nel mio codice reale! Uso il plug-in OAuth ufficiale per autenticarmi, i file OAuth2.Client.php è solo una libreria per effettuare facilmente richieste di arricciatura
kain34440

C'è una sezione Crea un supporto in (documentazione) [ v2.wp-api.org/reference/media/] . Penso che source_urldovresti essere dentro l' postoggetto.
ville6000,

Risposte:


8

COSÌ! Questo è divertente.

Tieni presente che l'API WP è ancora molto, molto in lavorazione.

Content-Disposition

Ho riscontrato un problema segnalato nella coda dei problemi dell'API WP sulla disposizione dei contenuti. Questa è un'intestazione obbligatoria per la pubblicazione di nuovi contenuti multimediali e ci sono alcuni requisiti molto, molto severi quando si tratta di fornire questo nel formato corretto.

Lo scopo di creare un endpoint multimediale

Innanzitutto, facciamo un passo indietro. L'API presuppone che a questo punto sia già stato caricato un nuovo file nella directory corretta. Questo endpoint sta creando il contenuto multimediale nel database che fa riferimento a questo file.

La soluzione

Devi specificare il nome file del file multimediale da associare al tuo nuovo contenuto. Questo non può essere un URL remoto. Come puoi vedere dalla documentazione v2 , source_urle linksono di sola lettura. Tutto quello che devi fare per inviare correttamente i tuoi nuovi contenuti è aggiungere quanto segue alla tua intestazione:

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

Come indicato nel ticket, non è possibile aggiungere virgolette o specificare il metodo utilizzato per inviare il file. Essa deve essere nel formato sopra. Almeno, questo è il caso fino a quando non lo cambiano tutto intorno.

Assicurati che il tipo di file sia uno dei tipi di file accettati e che includi l'estensione del file sia inclusa nella richiesta. Grazie al dott. Deo nei commenti.

Per la cronaca, ho riso con gioia vertiginosa quando ho finalmente capito questo ... ho spaventato a morte mia moglie.


1
Grazie mille per il suggerimento con il Content-Disposition!
pHiL

Penso che questa risposta sia solo un suggerimento e non una soluzione completa. Sto seguendo questo consiglio e ottengo l'erroreSorry, this file type is not permitted for security reasons
Brethlosze,

@Brethlosze Sembra un problema non correlato. WordPress blocca alcuni tipi di media nel normale processo di caricamento.
MikeNGarrett,

3
@Brethlosze l'estensione del file deve essere uno dei tipi accettati. Ad esempio, questo funziona, 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" --locationma se si omette pngdal nome del file tmp.png, si ottieneerror sorry, this file type is not permitted for security reasons
Dr Deo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.