Fazendo Upload de Mídia com a API REST

9

Estou com problemas ao fazer upload de mídia para um site WordPress com a API JSON REST.

Com o código a seguir, posso enviar as fotos, mas nenhuma informação é atribuída a elas, nem mesmo o nome - na verdade, o nome se torna automaticamente a URL e o nome do arquivo (sem a extensão).

$username = "ZX";
$password = "ZX";
$host = 'http://ZX.com/wp-json/wp/v2/media';
$data = json_encode($data);
$file = '/Users/xx.png';
$imagedata  = file_get_contents($file);
$process = curl_init($host); 
curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($process, CURLOPT_BINARYTRANSFER, TRUE);
curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($process, CURLOPT_TIMEOUT, 50);
curl_setopt($process, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt($process, CURLOPT_POSTFIELDS, $data);
curl_setopt($process, CURLOPT_HTTPHEADER, array('Content-Type:image/png','Content-Disposition:attachment;filename='.$file));
$return = curl_exec($process);
print_r($return);

Como atribuiria dados, como os seguintes, aos envios?

$data = array(
  "status" => "draft",
  "title" => "Photo media",       
  "description" => "Photo media1",
  "media_type" => "image",
  "alt_text" => "alternate text"
  );
Diario de Morelia
fonte

Respostas:

3

Isso não é possível através da API; você precisa buscar a imagem e enviar os dados para a API . Bloco de citação

- Isso cita Ryan na questão do GitHub mencionada na resposta @Dan (excluída).

Como carregar imagens laterais

Observe que o media_sideload_image()valor de retorno também pode ser uma instância \WP_Error. Você só precisa anexá-lo a uma postagem, o que é bastante simples:

$media = media_sideload_image( 
    'http://i.imgur.com/bcJvAj0.jpg', 
    $post->ID, 
    'Some image description', 
    'src'
);

if ( ! empty( $media ) and ! is_wp_error( $media ) ) {
    // reference new image to set as featured
    $attachments = get_posts( [
        'post_type'      => 'attachment',
        'posts_per_page' => 1,
        'post_status'    => 'any',
        'post_parent'    => $post->ID,
    ] );

    if ( is_array( $attachments ) ) {
        set_post_thumbnail( $post->ID, $attachments[0]->ID );
    }

    // Test print our image. The return value is the src of the sideloaded image.
    printf( '<img src="%s" />', $media );
}

Os internos

Um pequeno rastro no núcleo que explica por que você deve seguir a API:

Dê uma olhada na fonte de media_sideload_image()para ver se ela usa download_url()internamente, que usa wp_safe_remote_get()um wrapper para \WP_HTTP::get(). Isso significa que ele oferece toda a API do WP, sendo bastante seguro, depurável e fácil de usar. O valor de retorno de download_url()é o resultado de wp_tempnam(), que leva /tmpem consideração todos os locais possíveis (há muitos) e garante que seu local seja gravável . O media_handle_sideload()irá gerar todos os dados de anexos necessários e metadados.

kaiser
fonte
Qual é a pergunta citada? Este método ainda é válido?
Brethlosze 16/01/19
Veja o link update e GitHub – Issue na cotação. E por que não seria válido? Se você quiser verificar novamente, basta seguir a toca do coelho ao longo das linhas de Internals e comparar a versão WP atual com o código vinculado aqui. Isso não é tão difícil.
kaiser
Como essa resposta é de 2016. Eu só quero ter certeza de que, a partir de 2019, a API REST não poderá lidar com o upload de arquivos em mediaobjetos, portanto, é possível focar nas funções do WP.
Brethlosze 17/01/19
@Brethlosze como eu disse: por favor, dê uma olhada em seu código principal. Não tenho informações atualizadas sobre esse tópico, pois não estou trabalhando muito com o WP no momento.
kaiser