使用REST API上传媒体


9

使用JSON REST API将媒体上传到WordPress网站时遇到麻烦。

使用以下代码,我可以上传照片,但是没有为他们分配任何信息,甚至没有为名称分配信息-实际上,名称自动成为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"
  );

Answers:


3

无法通过API进行;您需要自己获取图像,然后自行将数据发送到API。块引用

–这引用了Ryan 在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()。这意味着它提供了整个WP API,同时非常安全,可调试且易于使用。的返回值download_url()是的结果wp_tempnam(),它考虑了所有可能的/tmp位置(有很多),并确保您的位置可写。在media_handle_sideload()将生成所有需要的附件数据和元数据。


引用的问题是什么?这种方法仍然有效吗?
Brethlosze

请参见报价中的更新和GitHub-问题链接。为什么无效呢?如果要再次检查,只需沿The internals的行沿兔子孔钻进,然后将当前的WP-version与此处链接的代码进行比较。没那么难。
凯撒

因为此答案来自2016年。我只想确保从2019年开始,REST API不能处理将文件上传到media对象中,因此可以专注于WP函数。
Brethlosze

就像我说的@Brethlosze:请仔细阅读核心代码。我没有关于该主题的任何最新信息,因为我现在与WP的合作不多。
凯撒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.