Adăugare media cu WP-Rest-API v2

26 nov. 2015, 10:18:46
Vizualizări: 33.6K
Voturi: 12

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

6
Comentarii

Am adăugat codul din comentariul tău la întrebare. Nu uita că poți edita întrebarea în orice moment pentru a adăuga mai multe informații sau a o face mai clară.

cybmeta cybmeta
26 nov. 2015 11:30:20

Punctul și virgulă suplimentar din wordpress.local/wp-json/wp/v2/media"; este o greșeală de tipar aici sau este prezent și în codul tău real?

cybmeta cybmeta
26 nov. 2015 11:33:11

Conform documentației, WP REST API v2 necesită acest plugin OAuth. Nu știu dacă biblioteca pe care o folosești (OAuth2/Client.php) este compatibilă cu WP REST API sau nu, dar probabil că nu este.

cybmeta cybmeta
26 nov. 2015 11:45:29

Mulțumesc mult! Simbolul suplimentar --> ; nu este prezent în codul meu real! Folosesc plugin-ul oficial OAuth pentru autentificare, fișierul OAuth2.Client.php este doar o bibliotecă pentru a face cererile curl mai ușor

kain34440 kain34440
26 nov. 2015 11:51:43

Există o secțiune Creează Media în (documentația)[http://v2.wp-api.org/reference/media/]. Cred că source_url ar trebui să fie în interiorul obiectului post.

ville6000 ville6000
26 nov. 2015 13:09:59

Salut ville6000, poți să explici comentariul tău?

kain34440 kain34440
26 nov. 2015 16:32:40
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare 3
4
11

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.

14 feb. 2016 06:03:32
Comentarii

Mulțumesc mult pentru indiciu cu Content-Disposition!

pHiL pHiL
20 iul. 2016 02:01:34

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 Brethlosze
16 ian. 2019 15:44:58

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

MikeNGarrett MikeNGarrett
17 ian. 2019 17:38:20

@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

Dr Deo Dr Deo
1 feb. 2019 13:41:28
0

Î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.

20 iul. 2016 02:01:13
0

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);
13 apr. 2021 13:32:22