การอัพโหลดสื่อด้วย 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"
  );

คำตอบ:


3

ไม่สามารถทำได้ผ่าน API คุณต้องดึงภาพด้วยตัวคุณเองและส่งข้อมูลไปยัง APIด้วยตัวคุณเอง blockquote

- คำพูดนี้ 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 ในขณะที่ค่อนข้างปลอดภัย debuggable และใช้งานง่าย ค่าส่งคืนของdownload_url()คือผลลัพธ์ของwp_tempnam()ซึ่ง/tmpคำนึงถึงสถานที่ที่เป็นไปได้ทั้งหมด(มีมากมาย) และทำให้แน่ใจว่าตำแหน่งของคุณเขียนได้ media_handle_sideload()จะสร้างข้อมูลที่แนบมาทั้งหมดที่จำเป็นและข้อมูล meta


คำถามที่อ้างถึงใด วิธีนี้ยังคงใช้ได้หรือไม่?
Brethlosze

ดูอัปเดตและลิงค์ GitHub – Issue ในเครื่องหมายคำพูด และทำไมมันไม่ถูกต้อง? หากคุณต้องการตรวจสอบอีกครั้งเพียงทำตามช่องกระต่ายตามแนวของThe internalsและเปรียบเทียบรุ่น WP ปัจจุบันกับรหัสที่เชื่อมโยงที่นี่ นั่นไม่ใช่เรื่องยาก
ไก

เนื่องจากคำตอบนี้มาจากปี 2559 ฉันแค่ต้องการให้แน่ใจว่าในปี 2019 REST API ไม่สามารถจัดการกับการอัปโหลดไฟล์ไปยังmediaวัตถุได้ดังนั้นจึงสามารถมุ่งเน้นไปที่ฟังก์ชั่น WP
Brethlosze

@Brethlosze ตามที่ฉันพูด: โปรดดูตัวเองเกี่ยวกับรหัสหลัก ฉันไม่มีข้อมูลใหม่ในหัวข้อนั้นเนื่องจากฉันไม่ได้ทำงานกับ WP มากตอนนี้
ไก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.