Загрузка медиа с REST API

9

У меня возникают проблемы при загрузке мультимедиа на сайт WordPress с помощью JSON REST API.

С помощью следующего кода я могу загрузить фотографии, но им не присваивается никакая информация, даже имя - фактически имя автоматически становится URL-адресом и именем файла (без расширения).

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

Как бы я назначил данные, как показано ниже, для загрузки?

$data = array(
  "status" => "draft",
  "title" => "Photo media",       
  "description" => "Photo media1",
  "media_type" => "image",
  "alt_text" => "alternate text"
  );
Diario de Morelia
источник

Ответы:

3

Это невозможно через API; вам нужно получить изображение самостоятельно и отправить данные в API самостоятельно. Blockquote

- Это цитирует Райана о проблеме GitHub, упомянутой в ответе @Dan (удалено).

Как выполнить боковую загрузку изображений

Обратите внимание, что media_sideload_image()возвращаемое значение также может быть экземпляром \WP_Error. Затем вам просто нужно прикрепить его к сообщению, что довольно просто:

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

Внутренние органы

Короткая обратная трассировка через ядро, которая объясняет, почему вы должны придерживаться API:

Посмотрите на источник, media_sideload_image()чтобы увидеть, что он использует download_url()внутренне, который использует wp_safe_remote_get()обертку для \WP_HTTP::get(). Это означает, что он предлагает весь API WP, будучи достаточно безопасным, отлаживаемым и простым в использовании. Возвращаемым значением download_url()является результат wp_tempnam(), который учитывает все возможные /tmpместоположения (их достаточно) и гарантирует, что ваше местоположение доступно для записи . media_handle_sideload()Произведет все необходимые данные вложений и мета - данные.

кайзер
источник
Какой вопрос процитирован? Этот метод все еще действует?
Brethlosze
Смотрите обновление и ссылку GitHub – Issue в цитате. И почему это не будет действительным? Если вы хотите проверить еще раз, просто следуйте по кроличьей норе по внутренним линиям и сравните текущую версию WP с кодом, связанным здесь. Это не так сложно.
Кайзер
Поскольку этот ответ относится к 2016 году. Я просто хочу убедиться, что с 2019 года API REST не может загружать файлы в mediaобъекты, поэтому можно сосредоточиться на функциях WP.
Братлосз
@Brethlosze, как я уже сказал: пожалуйста, посмотрите вокруг основного кода. У меня нет никакой свежей информации по этой теме, так как я сейчас не очень много работаю с WP.
Кайзер