Przesyłanie multimediów za pomocą interfejsu API REST

9

Mam problem z przesyłaniem multimediów do witryny WordPress za pomocą interfejsu API REST JSON.

Za pomocą następującego kodu mogę załadować zdjęcia, ale nie są im przypisywane żadne informacje, nawet nazwa - w rzeczywistości nazwa automatycznie staje się adresem URL i nazwą pliku (bez rozszerzenia).

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

Jak przypisać przesyłane dane, takie jak następujące?

$data = array(
  "status" => "draft",
  "title" => "Photo media",       
  "description" => "Photo media1",
  "media_type" => "image",
  "alt_text" => "alternate text"
  );
Diario de Morelia
źródło

Odpowiedzi:

3

Nie jest to możliwe za pośrednictwem interfejsu API; trzeba pobrać obraz siebie i wysłać dane do API samodzielnie. Zablokować cytat

- To cytuje Ryana w kwestii GitHub wymienionej w odpowiedzi na @Dan (usunięty).

Jak ładować obrazy z boku

Zauważ, że media_sideload_image()zwracana wartość może być również instancją \WP_Error. Następnie wystarczy dołączyć go do postu, co jest dość proste:

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

Elementy wewnętrzne

Krótki ślad wstecz przez rdzeń, który wyjaśnia, dlaczego powinieneś trzymać się interfejsu API:

Spójrz na źródło, media_sideload_image()aby zobaczyć, że używa download_url()wewnętrznie, który używa wp_safe_remote_get()opakowania dla \WP_HTTP::get(). Oznacza to, że oferuje cały WP API, a jednocześnie jest całkiem bezpieczny, debugowalny i łatwy w użyciu. Zwracana wartość download_url()jest wynikiem wp_tempnam(), który uwzględnia wszystkie możliwe /tmplokalizacje (jest ich dużo) i zapewnia, że ​​twoja lokalizacja jest zapisywalna . media_handle_sideload()Wygeneruje wszystkie potrzebne dane załączników i metadanych.

kajzer
źródło
Jakie jest cytowane pytanie? Czy ta metoda jest nadal aktualna?
Brethlosze
Zobacz link do aktualizacji i GitHub – Issue w cytacie. A dlaczego nie miałoby to być ważne? Jeśli chcesz to jeszcze raz sprawdzić, po prostu podążaj wzdłuż króliczej nory wzdłuż linii wewnętrznych i porównaj bieżącą wersję WP z kodem tutaj połączonym. To nie takie trudne.
Kaiser
Ponieważ ta odpowiedź pochodzi z 2016 r. Chcę tylko upewnić się, że od 2019 r. Interfejs API REST nie będzie w stanie przesyłać plików do mediaobiektów, dlatego można skupić się na funkcjach WP.
Brethlosze
@Brethlosze, jak powiedziałem: spójrz na podstawowy kod. Nie mam żadnych świeżych informacji na ten temat, ponieważ obecnie nie pracuję dużo z WP.
kaiser