Agregue medios con WP-Rest-API v2

10

Necesito su ayuda para cargar una imagen multimedia en mi blog de WordPress a través de la autenticación Wp-rest-api v2 y Oauth2.

No encontré en la documentación de la API REST la forma de enviar los datos de mi imagen (nombre del campo, modo de envío ...?).

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 respuesta :

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
)

¿Alguna idea? Muchas gracias

kain34440
fuente
He agregado el código de tu comentario a la pregunta. Recuerde que puede editar la pregunta en cualquier momento para agregar más información o aclararla.
cybmeta
El extra ;en wordpress.local/wp-json/wp/v2/media";una mistype aquí o está en su código real también?
cybmeta
Según los documentos , WP REST API v2 requiere este complemento OAuth . No sé si la biblioteca que está utilizando (OAuth2 / Client.php) es compatible con WP REST API o no, pero probablemente no lo sea.
cybmeta
Muchas gracias! El extra ->; no está presente en mi código real! Yo uso el plugin oficial de OAuth para autenticar a mí, archivos OAuth2.Client.php es única biblioteca para hacer peticiones enrollamiento fácilmente
kain34440
Hay una sección Crear un medio en (documentación) [ v2.wp-api.org/reference/media/] . Creo que tu source_urldeberías estar dentro del postobjeto.
ville6000

Respuestas:

8

¡ENTONCES! Esto es divertido.

Tenga en cuenta que la WP-API sigue siendo un trabajo en progreso.

Disposición de contenido

Encontré un problema informado en la cola de problemas de WP-API sobre Content-Disposition. Este es un encabezado obligatorio para publicar contenido multimedia nuevo y existen algunos requisitos muy estrictos a la hora de proporcionarlo en el formato adecuado.

El propósito de crear punto final de medios

Primero, demos un paso atrás. La API asume en este punto que ya ha cargado un nuevo archivo en el directorio correcto. Este punto final está creando el contenido multimedia en la base de datos que hace referencia a este archivo.

La solución

Debe especificar el nombre de archivo del archivo multimedia para asociarlo a su nuevo contenido. Esto no puede ser una url remota. Como se puede ver en la documentación v2 , source_urly linkson de sólo lectura. Todo lo que tiene que hacer para enviar con éxito su nuevo contenido es agregar lo siguiente a su encabezado:

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

Como se menciona en el ticket, no puede agregar comillas ni especificar el método que está utilizando para enviar el archivo. Se debe estar en el formato anterior. Al menos, este es el caso hasta que lo cambien por completo.

Asegúrese de que el tipo de archivo sea uno de los tipos de archivo aceptados y que incluya la extensión del archivo incluida en la solicitud. Gracias al Dr. Deo en los comentarios.

Para el registro, me reí con alegría vertiginosa cuando finalmente me di cuenta de esto ... asustado de mi esposa.

MikeNGarrett
fuente
1
Big gracias por la pista con el Content-Disposition!
pHiL
Creo que esta respuesta es solo una pista, y no una solución completa. Estoy siguiendo este consejo y Sorry, this file type is not permitted for security reasons
obtengo
@Brethlosze Eso suena como un problema no relacionado. WordPress bloquea ciertos tipos de medios en el proceso de carga normal.
MikeNGarrett
3
@Brethlosze, la extensión del archivo debe ser uno de los tipos aceptados. Por ejemplo, esto funciona, 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" --locationpero si omite el pngnombre de archivo tmp.png, obtendráerror sorry, this file type is not permitted for security reasons
Dr. Deo