Adăugare media cu WP-Rest-API v2
Am nevoie de ajutor pentru a încărca o imagine media în blogul meu WordPress prin intermediul WP-REST-API v2 și autentificare OAuth2.
Nu am găsit în documentația REST API modul de a trimite datele imaginii mele (numele câmpului, modul de trimitere...?).
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); //cod_autorizare
$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" => "Titlu media",
"description" => "descriere 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>";
Răspunsul:
Array
(
[result] => Array
(
[code] => rest_upload_no_data
[message] => Nu au fost furnizate date
[data] => Array
(
[status] => 400
)
)
[code] => 400
[content_type] => application/json; charset=UTF-8
)
Aveți vreo idee? Mulțumesc mult
ASA! Asta este distractiv.
Ține minte că WP-API este încă în lucru, în mare măsură în dezvoltare.
Content-Disposition
Am găsit o problemă raportată în coada de probleme WP-API despre Content-Disposition. Acesta este un header necesar pentru postarea de conținut media nou și există cerințe foarte, foarte stricte când vine vorba de furnizarea acestuia în formatul corect.
Scopul Endpoint-ului Create Media
Mai întâi, să facem un pas înapoi. API-ul presupune în acest moment că ai încărcat deja un fișier nou în directorul corect. Acest endpoint creează conținutul media în baza de date care face referire la acest fișier.
Soluția
Trebuie să specifici numele fișierului media pentru a-l asocia noului tău conținut. Acesta nu poate fi un URL la distanță. După cum poți vedea din documentația v2, source_url
și link
sunt doar pentru citire. Tot ce trebuie să faci pentru a trimite cu succes noul tău conținut este să adaugi următoarele în header:
'Content-Disposition' => 'filename=numele-fișierului.jpg',
După cum s-a menționat în tichet, nu poți adăuga ghilimele sau să specifici metoda pe care o folosești pentru a trimite fișierul. Trebuie neapărat să fie în formatul de mai sus. Cel puțin, așa stau lucrurile până când vor fi schimbate din nou.
Asigură-te că tipul fișierului este unul dintre tipurile de fișiere acceptate și că incluzi extensia fișierului în cerere. Mulțumită lui Dr Deo în comentarii.
Pentru posteritate, am râs cu bucurie când am înțeles în sfârșit acest lucru... i-am speriat pe soția mea de moarte.

Cred că acest răspuns este doar un indiciu și nu o soluție completă. Am urmat acest sfat și primesc eroarea Ne pare rău, acest tip de fișier nu este permis din motive de securitate

@Brethlosze Asta sună ca o problemă nesemnificativă. WordPress blochează anumite tipuri de media în procesul normal de încărcare.

@Brethlosze extensia fișierului trebuie să fie unul dintre tipurile acceptate. De exemplu, acest lucru funcționează 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
dar dacă omiți png
din numele fișierului tmp.png
, vei primi error sorry, this file type is not permitted for security reasons

În scopul "referințelor încrucișate", consultați răspunsul meu aferent de pe StackOverflow despre încărcarea fișierelor media și utilizarea acestora ca "media principală" pentru un articol.

Răspuns pentru 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;
Dacă încă întâmpinați eroarea "Ne pare rău, acest tip de fișier nu este permis din motive de securitate", trebuie să adăugați în wp-config.php pentru a dezactiva filtrarea pentru utilizatorii admin:
define('ALLOW_UNFILTERED_UPLOADS', true);
