Aggiungere media con WP-Rest-API v2
Ho bisogno del vostro aiuto per caricare un'immagine multimediale nel mio blog WordPress tramite la Wp-rest-api v2 e l'autenticazione OAuth2.
Non ho trovato nella documentazione REST API il modo di inviare i dati della mia 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); //codice_autorizzazione
$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" => "Titolo media",
"description" => "descrizione 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] => Nessun dato fornito
[data] => Array
(
[status] => 400
)
)
[code] => 400
[content_type] => application/json; charset=UTF-8
)
Qualche idea? Grazie mille
QUINDI! Questo è divertente.
Tieni presente che la WP-API è ancora molto, molto un lavoro in corso.
Content-Disposition
Ho trovato un problema segnalato nella coda dei problemi della WP-API riguardante Content-Disposition. Questo è un header obbligatorio per pubblicare nuovi contenuti multimediali e ci sono requisiti molto, molto rigidi quando si tratta di fornirlo nel formato corretto.
Lo scopo dell'endpoint Create Media
Prima di tutto, facciamo un passo indietro. L'API assume a questo punto che tu abbia già 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 del file multimediale da associare al tuo nuovo contenuto. Questo non può essere un URL remoto. Come puoi vedere dalla documentazione v2, source_url
e link
sono in sola lettura. Tutto quello che devi fare per inviare con successo il tuo nuovo contenuto è aggiungere quanto segue al tuo header:
'Content-Disposition' => 'filename=nome-del-file.jpg',
Come menzionato nel ticket, non puoi aggiungere virgolette o specificare il metodo che stai usando per inviare il file. Deve necessariamente essere nel formato sopra indicato. Almeno, questo è il caso finché non cambieranno tutto.
Assicurati che il tipo di file sia uno dei tipi di file accettati e che tu stia includendo l'estensione del file nella richiesta. Grazie a Dr Deo nei commenti.
Per la cronaca, ho riso con gioia esuberante quando finalmente ho capito questa cosa... ho spaventato a morte mia moglie.

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

@Brethlosze Sembra un problema non correlato. WordPress blocca alcuni tipi di file durante il normale processo di upload per motivi di sicurezza.

@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" --location
ma se ometti il png
dal nome del file tmp.png
, ottieni error sorry, this file type is not permitted for security reasons

Per motivi di "riferimento incrociato", consulta la mia risposta correlata qui su StackOverflow riguardo al caricamento dei media e all'utilizzo di tali media come "media in evidenza" per un articolo.

La risposta per 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;
Se continui ad avere il problema "Spiacenti, questo tipo di file non è consentito per motivi di sicurezza", devi aggiungere a wp-config.php per disabilitare il filtro per l'utente amministratore
define('ALLOW_UNFILTERED_UPLOADS', true);
