รับ $ image_id หลังจากอัปโหลดด้วย media_sideload_image ()


10

ฉันต้องการอัพโหลดภาพและตั้งเป็นภาพเด่นในโพสต์ สิ่งที่ฉันพยายามคือ:

$image_id = media_sideload_image($image_url, $post_id, $post_id);
update_post_meta($post_id, '_thumbnail_id', $image_id);

แต่media_sideload_image()จะไม่ส่งคืนimage_idแต่เป็นเรนเดอร์ภาพ html ฉันจะรับได้image_idอย่างไร

คำตอบ:


28

นี่คือตัวอย่างของวิธีการหลีกเลี่ยงข้อ จำกัด นี้โดยใช้ actions / hooks:

function new_attachment( $att_id ){
    // the post this was sideloaded into is the attachments parent!

    // fetch the attachment post
    $att = get_post( $att_id );

    // grab it's parent
    $post_id = $att->post_parent;

    // set the featured post
    set_post_thumbnail( $post_id, $att_id );
}

// add the function above to catch the attachments creation
add_action('add_attachment','new_attachment');

// load the attachment from the URL
media_sideload_image($image_url, $post_id, $post_id);

// we have the image now, and the function above will have fired too setting the thumbnail ID in the process, so lets remove the hook so we don't cause any more trouble 
remove_action('add_attachment','new_attachment');

แนวคิดคือเมื่อmedia_sideload_imageมีการวิ่งมัน:

  • ดาวน์โหลดภาพ
  • เพิ่มเป็นไฟล์แนบ (โพสต์ประเภทattachment)
  • จากนั้นแนบไฟล์แนบนั้นกับโพสต์ที่มี ID ที่คุณให้ไว้ ($ post_id)

ปัญหาของคุณคือมันไม่ได้ให้รหัสโพสต์สิ่งที่แนบมาที่สร้างขึ้นใหม่

แต่เมื่อสร้างสิ่งที่แนบมาการดำเนินการจะเริ่มทำงานด้วยรหัสของมัน เราสามารถเชื่อมต่อกับสิ่งนี้ก่อนที่เราจะสร้างสิ่งที่แนบมาและบันทึกภาพขนาดย่อที่มีโพสต์ ID ที่ให้ไว้กับเราจากนั้นปลดขอหลังจากนั้น


1
ยอดเยี่ยม! นั่นช่วยได้มาก
m-torin

2
หากตอบคำถามของคุณคุณสามารถทำเครื่องหมายว่าถูกต้องหรือไม่
Tom J Nowell

ฉันไม่สามารถอ่านภาษาอังกฤษของคุณ. ใครบางคนแก้ไขโพสต์นี้?
HiDd3N

2
@ HiDd3N ฉันได้ลดความซับซ้อนของการใช้ภาษาอังกฤษบางอย่างก็ควรจะมีคำที่พบบ่อยมากขึ้นด้วยอายุการอ่านที่ต่ำกว่า
Tom J Nowell

6

ฉันสร้างฟังก์ชั่นเพื่อรับ ID จากฐานข้อมูลค้นหาด้วย URL

function get_attachment_id_from_src ($image_src) {
  global $wpdb;
  $query = "SELECT ID FROM {$wpdb->posts} WHERE guid='$image_src'";
  $id = $wpdb->get_var($query);
  return $id;
}

คุณสามารถรับ URL (ติดตั้งโค้ด html) โดยตั้งค่าพารามิเตอร์ที่สี่เป็น'src' Codex: media_sideload_image ()

$src = media_sideload_image($url, $item_id, $desc,'src');
get_attachment_id_from_src($src);


4

@Tom J Nowell คำตอบคือจุดที่ ฉันพบทางเลือกอื่น (โดยใช้ฟังก์ชั่นที่แตกต่างกัน) อธิบายไว้ที่นี่แต่ฉันชอบสิ่งนี้มากกว่านี้

ในกรณีของฉันฉันมีอาร์เรย์ของ $ posts พร้อมโพสต์ทั้งหมดที่ฉันต้องการแทรกและ $ media แยกต่างหาก (เช่น $ $ nid keys เหมือนกับ $ posts) กับสื่อ รหัสของฉันเป็นโซลูชันเดียวกับ Tom's แต่ได้รับการปรับสภาพใหม่เพื่อใช้ฟังก์ชันที่ไม่ระบุชื่อ:

foreach( $posts as $nid=>$post )
    $posts[$nid]['ID'] = wp_insert_post( $post );

foreach( $posts as $nid=>$post )
    foreach( $media[$nid] as $m=>$mitem ) {

        if( 0 == $m ) add_action( 'add_attachment',
            function( $att_id ) use ($posts, $nid, $mitem) {
                update_post_meta($posts[$nid]['ID'], '_thumbnail_id', $att_id);
                $posts[$nid]['media_urls'][] = $mitem['url'];
            }
        );
        media_sideload_image($mitem['url'], $post['ID']);
        remove_all_actions( 'add_attachment' );
    }

ในกรณีของฉันฉันถือว่ารายการที่ 1 ในแต่ละสื่อ $ $ [$ nid] shuold เป็นภาพเด่นของโพสต์

WordPress shouold เปลี่ยนอย่างแน่นอน media_sideload_image () ดังนั้นมันจึงคืนค่า $ id ในความเป็นจริงการทำงานมีมันอยู่ในมือให้ดูแหล่งที่มาที่นี่ ในความเป็นจริงมีตั๋วแทร็คสำหรับสิ่งนี้และพวกเขายังมีแพทช์เพื่อใช้กับคอร์ของคุณในเวลาเฉลี่ยถ้าคุณต้องการ


ดูเหมือนว่าจะได้รับการติดตั้งใน 4.8
Tom Auger

3

ฉันกำลังมองหาทางออกและตัดสินใจที่จะดูรหัสmedia_sideload_image()ที่ตรงไปตรงมามาก มันใช้ซึ่งจะช่วยให้เราสิ่งที่แนบมาmedia_handle_sideload()id

ฉันแก้ไขมันเพื่อคืนสิ่งที่แนบมาidแทนที่จะเป็นแหล่งที่มาของภาพและยังเพิ่มวิธีการส่งชื่อไฟล์ใหม่

function media_sideload_image_custom($file, $post_id, $desc = null, $file_name = null)
{
    if ( ! empty($file) ) {
        // Download file to temp location
        $tmp = download_url( $file );

        // fix file filename for query strings
        if( empty($file_name) ) { 
            preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $file, $matches);
            $file_array['name'] = basename($matches[0]);
        } else {
            $file_array['name'] = sanitize_file_name($file_name);
        }
        $file_array['tmp_name'] = $tmp;

        // If error storing temporarily, unlink
        if ( is_wp_error( $tmp ) ) {
            @unlink($file_array['tmp_name']);
            $file_array['tmp_name'] = '';
        }

        // do the validation and storage stuff
        $id = media_handle_sideload( $file_array, $post_id, $desc );

        // If error storing permanently, unlink
        if ( is_wp_error($id) ) {
            @unlink($file_array['tmp_name']);
        }
        return $id;
    }
    return null;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.