Adicionar mídia com o WP-Rest-API v2

10

Preciso da sua ajuda para fazer upload de uma imagem de mídia no meu blog wordpress através da autenticação Wp-rest-api v2 e Oauth2.

Não encontrei na documentação da API REST a maneira de enviar meus dados de imagem (nome do campo, modo de envio ...?).

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

A resposta :

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
)

Qualquer ideia? Muito obrigado

kain34440
fonte
Adicionei o código do seu comentário à pergunta. Lembre-se de que você pode editar a pergunta a qualquer momento para adicionar mais informações ou torná-la mais clara.
#
O extra ;in wordpress.local/wp-json/wp/v2/media";é um erro de digitação aqui ou está no seu código real também?
cybmeta
De acordo com os documentos , a WP REST API v2 requer este plug-in OAuth . Não sei se a biblioteca que você está usando (OAuth2 / Client.php) é compatível com a API REST do WP ou não, mas provavelmente não é.
cybmeta
Muito obrigado! O extra ->; não está presente no meu código real! Eu uso plug-in oficial OAuth para me autenticar, arquivos OAuth2.Client.php é única biblioteca para fazer solicitações onda facilmente
kain34440
Há uma seção Criar uma mídia em (documentação) [ v2.wp-api.org/reference/media/] . Eu acho que você source_urldeve estar dentro do postobjeto.
ville6000

Respostas:

8

TÃO! Isto é divertido.

Lembre-se de que o WP-API ainda é um trabalho em andamento.

Disposição de conteúdo

Encontrei um problema relatado na fila de problemas do WP-API sobre Content-Disposition. Esse é um cabeçalho necessário para a publicação de novos conteúdos de mídia e existem alguns requisitos muito, muito rigorosos, quando se trata de fornecê-los no formato adequado.

O objetivo da criação de terminal de mídia

Primeiro, vamos dar um passo atrás. A API pressupõe que você já tenha carregado um novo arquivo no diretório correto. Esse ponto de extremidade está criando o conteúdo de mídia no banco de dados que referencia esse arquivo.

A solução

Você deve especificar o nome do arquivo de mídia para associar ao seu novo conteúdo. Este não pode ser um URL remoto. Como você pode ver na documentação da v2 , source_urle linké somente leitura. Tudo o que você precisa fazer para enviar seu novo conteúdo com sucesso é adicionar o seguinte ao seu cabeçalho:

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

Conforme mencionado no ticket, você não pode adicionar aspas ou especificar o método que está usando para enviar o arquivo. Ele deve estar no formato acima. Pelo menos, é esse o caso até que eles mudem tudo.

Verifique se o tipo de arquivo é um dos tipos de arquivo aceitos e se a extensão do arquivo está incluída na solicitação. Obrigado ao Dr. Deo nos comentários.

Para o registro, eu ri com alegria quando finalmente descobri isso ... assustou muito a minha esposa.

MikeNGarrett
fonte
11
Thx grande para a sugestão com o Content-Disposition!
pHiL 19/07/16
Eu acho que essa resposta é apenas uma dica, e não uma solução completa. Estou seguindo este conselho e obtenho o erroSorry, this file type is not permitted for security reasons
Brethlosze 16/01/19
@Brethlosze Isso soa como um problema não relacionado. O WordPress bloqueia certos tipos de mídia no processo normal de upload.
MikeNGarrett
3
@Brethlosze a extensão do arquivo precisa ser um dos tipos aceitos. Por exemplo, isso 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" --locationmas se você omitir o pngnome do arquivo tmp.png, você obtémerror sorry, this file type is not permitted for security reasons
Dr Deo
2

Para fins de "referência cruzada", consulte minha resposta relacionada aqui no StackOverflow sobre upload de mídia e uso dessa mídia como "mídia em destaque" para uma postagem.

pHiL
fonte