Carga de medios con la API REST

9

Tengo problemas al subir archivos multimedia a un sitio de WordPress con la API JSON REST.

Con el siguiente código puedo subir las fotos, pero no se les asigna información, ni siquiera el nombre; de ​​hecho, el nombre se convierte automáticamente en la URL y el nombre de archivo (sin la extensión).

$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);

¿Cómo asignaría datos, como los siguientes, a las cargas?

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

Respuestas:

3

Esto no es posible a través de la API; debe buscar la imagen usted mismo y enviar los datos a la API usted mismo. Blockquote

- Esto cita a Ryan sobre el problema de GitHub mencionado en @Dan (eliminado) respuesta.

Cómo cargar imágenes laterales

Tenga en cuenta que el media_sideload_image()valor de retorno también puede ser una instancia \WP_Error. Entonces solo necesita adjuntarlo a una publicación, que es bastante simple:

$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 );
}

Los internos

Un breve seguimiento a través del núcleo que explica por qué debe seguir con la API:

Eche un vistazo a la fuente de media_sideload_image()para ver si utiliza download_url()internamente, qué utiliza wp_safe_remote_get(), un contenedor para \WP_HTTP::get(). Esto significa que ofrece toda la API de WP a la vez que es bastante segura, depurable y fácil de usar. El valor de retorno de download_url()es el resultado de wp_tempnam(), que tiene /tmpen cuenta todas las ubicaciones posibles (hay muchas) y se asegura de que su ubicación sea grabable . El media_handle_sideload()generará todos los datos adjuntos y metadatos necesarios.

emperador
fuente
¿Cuál es la pregunta citada? ¿Sigue siendo válido este método?
Brethlosze
Consulte la actualización y el enlace GitHub – Issue en la cotización. ¿Y por qué no sería válido? Si desea verificar nuevamente, simplemente siga por la madriguera del conejo a lo largo de las líneas internas y compare la versión actual de WP con el código vinculado aquí. Eso no es tan difícil.
kaiser
Debido a que esta respuesta es de 2016. Solo quiero asegurarme de que a partir de 2019, la API REST no pueda ocuparse de cargar archivos en mediaobjetos, por lo tanto, uno puede centrarse en las funciones de WP.
Brethlosze
@Brethlosze como dije: por favor, eche un vistazo al código central. No tengo ninguna información nueva sobre ese tema, ya que no estoy trabajando mucho con WP en este momento.
kaiser