Ajouter des médias avec WP-Rest-API v2

10

J'ai besoin de votre aide pour télécharger une image multimédia dans mon blog wordpress via l'authentification Wp-rest-api v2 et Oauth2.

Je n'ai pas trouvé dans la documentation de l'API REST le moyen d'envoyer mes données d'image (nom du champ, mode d'envoi ...?).

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 réponse :

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
)

Une idée? Merci beaucoup

kain34440
la source
J'ai ajouté le code de votre commentaire à la question. N'oubliez pas que vous pouvez modifier la question à tout moment pour ajouter des informations ou la rendre plus claire.
cybmeta du
L'extra ;dans wordpress.local/wp-json/wp/v2/media";est un type erroné ici ou est-ce aussi dans votre vrai code?
cybmeta
Selon les documents , WP REST API v2 nécessite ce plugin OAuth . Je ne sais pas si la bibliothèque que vous utilisez (OAuth2 / Client.php) est compatible avec WP REST API ou non, mais ce n'est probablement pas le cas.
cybmeta
Merci beaucoup! Le plus ->; n'est pas présent dans mon vrai code! J'utilise le plugin officiel OAuth pour m'authentifier, les fichiers OAuth2.Client.php sont seulement la bibliothèque pour faire facilement des requêtes curl
kain34440
Il existe une section Créer un média dans (documentation) [ v2.wp-api.org/reference/media/] . Je pense que vous source_urldevriez être à l'intérieur de l' postobjet.
ville6000

Réponses:

8

DONC! C'est marrant!

Gardez à l'esprit que la WP-API est toujours très bien en cours.

Contenu-Disposition

J'ai trouvé un problème signalé dans la file d' attente de problèmes WP-API concernant Content-Disposition. Il s'agit d'un en-tête obligatoire pour la publication de nouveaux contenus multimédias et il existe des exigences très, très strictes lorsqu'il s'agit de les fournir au format approprié.

Le but de créer un point de terminaison multimédia

Tout d'abord, prenons un peu de recul. L'API suppose qu'à ce stade, vous avez déjà téléchargé un nouveau fichier dans le bon répertoire. Ce point de terminaison crée le contenu multimédia dans la base de données qui fait référence à ce fichier.

La solution

Vous devez spécifier le nom de fichier du fichier multimédia à associer à votre nouveau contenu. Il ne peut pas s'agir d'une URL distante. Comme vous pouvez le voir dans la documentation v2 , source_urlet linksont en lecture seule. Tout ce que vous avez à faire pour soumettre avec succès votre nouveau contenu est d'ajouter ce qui suit à votre en-tête:

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

Comme mentionné dans le ticket, vous ne pouvez pas ajouter de devis ni spécifier la méthode que vous utilisez pour envoyer le fichier. Il doit être dans le format ci-dessus. Du moins, c'est le cas jusqu'à ce qu'ils changent tout autour.

Assurez-vous que le type de fichier est l'un des types de fichiers acceptés et que vous incluez l'extension du fichier est incluse dans la demande. Merci au Dr Deo dans les commentaires.

Pour la petite histoire, j'ai ri de joie étourdie quand j'ai finalement compris celui-ci ... effrayé l'enfer de ma femme.

MikeNGarrett
la source
1
Gros merci pour l'indice avec le Content-Disposition!
pHiL
Je pense que cette réponse n'est qu'un indice et non une solution complète. Je suis ce conseil et Sorry, this file type is not permitted for security reasons
j'obtiens
@Brethlosze Cela ressemble à un problème sans rapport. WordPress bloque certains types de médias dans le processus de téléchargement normal.
MikeNGarrett
3
@Brethlosze, l'extension de fichier doit être l'un des types acceptés. Par exemple, cela fonctionne, 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" --locationmais si vous omettez le pngnom de fichier tmp.png, vous obtenezerror sorry, this file type is not permitted for security reasons
Dr Deo
2

Par souci de "recoupement", voir ma réponse connexe ici sur StackOverflow concernant le téléchargement de médias et l'utilisation de ce média comme "média en vedette" pour une publication.

pHiL
la source