Fügen Sie Medien mit WP-Rest-API v2 hinzu

10

Ich benötige Ihre Hilfe, um ein Medienbild in meinen WordPress-Blog über die Wp-rest-api v2- und Oauth2-Authentifizierung hochzuladen.

Ich habe in der REST-API-Dokumentation nicht gefunden, wie meine Bilddaten gesendet werden sollen (Feldname, Sendemodus ...?).

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

Die Antwort :

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
)

Irgendeine Idee? Danke vielmals

kain34440
quelle
Ich habe der Frage den Code aus Ihrem Kommentar hinzugefügt. Denken Sie daran, dass Sie die Frage jederzeit bearbeiten können, um weitere Informationen hinzuzufügen oder klarer zu gestalten.
Cybmeta
Das Extra ;in wordpress.local/wp-json/wp/v2/media";ist hier ein Fehler oder ist es auch in Ihrem echten Code?
Cybmeta
Laut Dokumentation benötigt die WP REST API v2 dieses OAuth-Plugin . Ich weiß nicht, ob die von Ihnen verwendete Bibliothek (OAuth2 / Client.php) mit der WP REST-API kompatibel ist oder nicht, aber wahrscheinlich nicht.
Cybmeta
Vielen Dank! Das Extra ->; ist in meinem echten Code nicht vorhanden! Ich benutze das offizielle OAuth-Plugin, um mich zu authentifizieren. Dateien OAuth2.Client.php ist nur eine Bibliothek, um Curl-Anfragen einfach zu stellen
kain34440
In (Dokumentation) [ v2.wp-api.org/reference/media/] befindet sich ein Abschnitt zum Erstellen von Medien . Ich denke, du source_urlsolltest im postObjekt sein.
ville6000

Antworten:

8

SO! Das macht Spaß.

Denken Sie daran, dass die WP-API noch sehr, sehr in Arbeit ist.

Inhaltsdisposition

Ich habe ein Problem in der WP-API-Problemwarteschlange bezüglich Content-Disposition gefunden. Dies ist ein erforderlicher Header für die Veröffentlichung neuer Medieninhalte, und es gibt einige sehr, sehr strenge Anforderungen, wenn es darum geht, diese im richtigen Format bereitzustellen.

Der Zweck des Erstellens eines Medienendpunkts

Lassen Sie uns zunächst einen Schritt zurücktreten. Die API geht davon aus, dass Sie zu diesem Zeitpunkt bereits eine neue Datei in das richtige Verzeichnis hochgeladen haben. Dieser Endpunkt erstellt den Medieninhalt in der Datenbank, die auf diese Datei verweist.

Die Lösung

Sie müssen den Dateinamen der Mediendatei angeben, die Ihrem neuen Inhalt zugeordnet werden soll. Dies kann keine Remote-URL sein. Wie können Sie von der siehe v2 Dokumentation , source_urlund linksind schreibgeschützt. Alles, was Sie tun müssen, um Ihren neuen Inhalt erfolgreich einzureichen, ist Folgendes zu Ihrem Header hinzuzufügen:

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

Wie im Ticket erwähnt, können Sie keine Anführungszeichen hinzufügen oder die Methode angeben, mit der Sie die Datei senden. Es muss im obigen Format vorliegen. Zumindest ist dies der Fall, bis sie es rundum ändern.

Stellen Sie sicher, dass der Dateityp einer der akzeptierten Dateitypen ist und Sie die Erweiterung der Datei in die Anforderung aufnehmen. Vielen Dank an Dr. Deo in den Kommentaren.

Fürs Protokoll, ich lachte vor schwindelerregender Freude, als ich es endlich herausfand ... erschreckte meine Frau zum Teufel.

MikeNGarrett
quelle
1
Vielen Dank für den Hinweis mit dem Content-Disposition!
pHiL
Ich denke, diese Antwort ist nur ein Hinweis und keine vollständige Lösung. Ich Sorry, this file type is not permitted for security reasons
folge
@Brethlosze Das klingt nach einem nicht verwandten Problem. WordPress blockiert bestimmte Medientypen im normalen Upload-Prozess.
MikeNGarrett
3
@Brethlosze Die Dateierweiterung muss einer der akzeptierten Typen sein. Zum Beispiel funktioniert dies, 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" --locationaber wenn Sie pngden Dateinamen weglassen tmp.png, erhalten Sieerror sorry, this file type is not permitted for security reasons
Dr. Deo
2

Informationen zum "Querverweis" finden Sie in meiner entsprechenden Antwort hier auf StackOverflow zum Hochladen von Medien und zur Verwendung dieser Medien als "vorgestellte Medien" für einen Beitrag.

pHiL
quelle