ฉันจะตั้งค่ารูปภาพเด่น (ภาพขนาดย่อ) ตาม URL รูปภาพเมื่อใช้ wp_insert_post () ได้อย่างไร


61

ในขณะที่ดูรายการอ้างอิงฟังก์ชั่นสำหรับ wp_insert_post ()ฉันสังเกตว่าไม่มีพารามิเตอร์ในอาเรย์ที่ต้องใช้ซึ่งจะทำให้ฉันสามารถตั้งค่า 'ภาพเด่น' สำหรับโพสต์ซึ่งแสดงเป็นภาพขนาดย่อโพสต์ในธีมของฉัน

ฉันดูเป็นฟังก์ชั่นเช่นset_post_thumbnail ()ตามคำแนะนำของ Mr. Bennett แต่ดูเหมือนว่าจะเป็นการเพิ่มที่ค่อนข้างใหม่สำหรับ WordPress และ WordPress codex ด้วยเหตุนี้จึงไม่มีแหล่งข้อมูลใดที่ฉันสามารถค้นหาได้ซึ่งอธิบายถึงวิธีการจัดหาและจัดหาพารามิเตอร์ $ thumbnail_id ถ้านี่คือฟังก์ชั่นที่ใช้จริงฉันจะให้พารามิเตอร์ $ thumbnail_id ที่ถูกต้องได้อย่างไรเมื่อทั้งหมดที่ฉันมีคือ URL ภาพ?

ขอบคุณล่วงหน้า!

คำตอบ:


107

คุณสามารถตั้งค่ารูปภาพเป็นโพสต์รูปขนาดย่อเมื่ออยู่ในไลบรารีสื่อของคุณ ในการเพิ่มภาพในไลบรารีสื่อของคุณคุณต้องอัปโหลดไปยังเซิร์ฟเวอร์ของคุณ WordPress มีฟังก์ชั่นสำหรับใส่รูปภาพในไลบรารีสื่อของคุณแล้วคุณต้องการเพียงสคริปต์ที่อัปโหลดไฟล์ของคุณ

การใช้งาน:

Generate_Featured_Image( '../wp-content/my_image.jpg', $post_id );

// $post_id is Numeric ID... You can also get the ID with:
wp_insert_post()

ฟังก์ชั่น:

function Generate_Featured_Image( $image_url, $post_id  ){
    $upload_dir = wp_upload_dir();
    $image_data = file_get_contents($image_url);
    $filename = basename($image_url);
    if(wp_mkdir_p($upload_dir['path']))
      $file = $upload_dir['path'] . '/' . $filename;
    else
      $file = $upload_dir['basedir'] . '/' . $filename;
    file_put_contents($file, $image_data);

    $wp_filetype = wp_check_filetype($filename, null );
    $attachment = array(
        'post_mime_type' => $wp_filetype['type'],
        'post_title' => sanitize_file_name($filename),
        'post_content' => '',
        'post_status' => 'inherit'
    );
    $attach_id = wp_insert_attachment( $attachment, $file, $post_id );
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
    $res1= wp_update_attachment_metadata( $attach_id, $attach_data );
    $res2= set_post_thumbnail( $post_id, $attach_id );
}

http://codex.wordpress.org/Function_Reference/wp_upload_dir

http://codex.wordpress.org/Function_Reference/wp_insert_attachment


แก้ไข: เพิ่มการสร้างเส้นทาง

http://codex.wordpress.org/Function_Reference/wp_mkdir_p


ขอบคุณสำหรับความพยายามของคุณ! ใช้ได้เฉพาะเมื่อใช้ $ upload_dir ['basedir'] (แทนที่จะเป็นพา ธ ) เพราะเมื่อฉันตรวจสอบสิ่งที่แนบมาผ่านทางส่วนต่อแก้ไขโพสต์จะมีการอ้างอิงเป็น ... / uploads / FILENAME.EXT ในขณะที่ $ upload_dir ['path' ] จะเก็บไว้ในบางสิ่งเช่น ... / uploads / 2012/02 / FILENAME.EXT มันอาจจะดีกว่าที่จะเปลี่ยนแปลงวิธีการอ้างอิงไฟล์ แต่ฉันไม่รู้ว่าจะทำอย่างไร
Chris

1
เพิ่มการสร้างเส้นทางในคำตอบของฉัน
Rob Vermeer

ขอบคุณคำตอบด่วนของคุณ :) ฉันยังคงได้รับผลเหมือนกัน แต่ที่นี่คือภาพที่แสดงปัญหาของฉัน: i.imgur.com/iKTNs.png ส่วนบนเป็นผลมาจากการวางเสียงสะท้อนในเงื่อนไขของคุณเพียงเพื่อดูว่าเกิดอะไรขึ้น
Chris

เปลี่ยนอีกครั้งไม่ผ่านเส้นทางแบบเต็มไปที่ wp_insert_attachment และ wp_generate_attachment_metadata หวังว่านี่จะช่วยแก้ปัญหาได้
Rob Vermeer

1
คำเตือน: คำตอบนี้จะเขียนไฟล์ใหม่หากมีชื่อเดียวกันระวัง ควรสร้างชื่อโดยใช้ $ post_id หรืออย่างน้อย uniqid ()
Ivan Castellanos

10

ลองใช้set_post_thumbnail()ดู

แก้ไขโดยอ็อตโต: คุณชี้แจงคำถามของคุณดังนั้นฉันจะชี้แจงการตอบกลับที่ชิปให้ไว้

โดยทั่วไปคุณจะต้องทำ 'ไฟล์แนบ' สำหรับโพสต์ด้วย เมื่อรูปภาพถูกอัพโหลดไปยังไลบรารีสื่อของ WordPress รายการโพสต์พิเศษจะถูกสร้างขึ้นพร้อมกับประเภทโพสต์ของสิ่งที่แนบมา สิ่งที่แนบมานี้เชื่อมโยงกับบางโพสต์เฉพาะผ่านทางตัวระบุ post_parent

ดังนั้นหากคุณรู้ ID ของสิ่งที่แนบมาดังนั้นการเรียก set_post_thumbnail พร้อมกับวัตถุที่โพสต์หรือ ID และ ID ของสิ่งที่แนบมาก็จะตั้งค่าการตั้งค่ารูปขนาดย่อโพสต์

หากคุณยังไม่ได้สร้างสิ่งที่แนบมาคุณจะต้องทำสิ่งนั้นก่อน wp_insert_attachment()วิธีที่ง่ายที่สุดที่จะทำคือมี ฟังก์ชั่นนี้ใช้อาร์เรย์ของพารามิเตอร์บางตัวชื่อไฟล์ (ไฟล์จะต้องอยู่ในไดเรกทอรีอัพโหลดที่เหมาะสม) และรหัสประจำตัวของโพสต์หลักที่คุณต้องการแนบไฟล์แนบ

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

ข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ wp_insert_attachment สามารถดูได้ใน codex (ลิงค์ด้านบน)


ขอบคุณสำหรับการตอบกลับของคุณ! อย่างไรก็ตามฉันจะเรียกรหัสรูปขนาดย่อได้อย่างไร ฉันเริ่มด้วย URL รูปภาพแล้วฉันเดาว่าฉันควรเพิ่มรูปภาพในไลบรารีเวิร์ดเพรสด้วยฟังก์ชันอื่นหรือไม่
Chris

เมื่อคุณแทรกโพสต์ไปแล้วฉันคิดว่าคุณได้แนบรูปภาพไปที่โพสต์ที่คุณกำลังแทรกแล้ว นั่นไม่ใช่ข้อสมมติฐานที่ถูกต้องใช่ไหม
Chip Bennett

ขออภัย แต่ฉันยังไม่พบวิธีแนบรูปลงในโพสต์ด้วย URL จริง ๆ นอกจากนี้ฉันไม่ต้องการให้ภาพปรากฏจริงในโพสต์เอง ฉันกำลังมองหาฟังก์ชั่นที่จะคืน $ thumbnail_id และคิดว่าบางที wp_insert_attachment () อาจใช้งานได้จนกว่าฉันจะสังเกตเห็นว่าสิ่งที่แนบมานั้นต้องอยู่ในไดเรกทอรีอัปโหลด ฉันไม่รู้วิธีรับไฟล์รูปภาพที่นั่นด้วย URL ของไฟล์นั้นและฉันไม่แน่ใจว่านี่เป็นฟังก์ชั่นที่ฉันต้องการหรือไม่ ขอขอบคุณสำหรับความช่วยเหลือของคุณ!
Chris

คุณช่วยเขียนคำถามของคุณใหม่ด้วยข้อมูลนี้เพื่ออธิบายสิ่งที่คุณพยายามจะทำให้ดีขึ้นได้ไหม (หรือปล่อยให้เป็นไปตามนี้และเริ่มคำถามใหม่เพื่อถามวิธีรับ ID สิ่งที่แนบมาเมื่อแทรกโพสต์?)
Chip Bennett

คำถามเดิมได้รับการแก้ไขและนำมาใช้ใหม่บางส่วนแล้วโปรดกลับมาตรวจสอบ :)
Chris

9

ฉันต้องการปรับปรุงคำตอบ Robs โดยใช้ฟังก์ชั่นหลักของ WP download_urlและmedia_handle_sideload

<?php
/**
* Downloads an image from the specified URL and attaches it to a post as a post thumbnail.
*
* @param string $file    The URL of the image to download.
* @param int    $post_id The post ID the post thumbnail is to be associated with.
* @param string $desc    Optional. Description of the image.
* @return string|WP_Error Attachment ID, WP_Error object otherwise.
*/
function Generate_Featured_Image( $file, $post_id, $desc ){
    // Set variables for storage, fix file filename for query strings.
    preg_match( '/[^\?]+\.(jpe?g|jpe|gif|png)\b/i', $file, $matches );
    if ( ! $matches ) {
         return new WP_Error( 'image_sideload_failed', __( 'Invalid image URL' ) );
    }

    $file_array = array();
    $file_array['name'] = basename( $matches[0] );

    // Download file to temp location.
    $file_array['tmp_name'] = download_url( $file );

    // If error storing temporarily, return the error.
    if ( is_wp_error( $file_array['tmp_name'] ) ) {
        return $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 set_post_thumbnail( $post_id, $id );

}

1
การใช้ฟังก์ชั่นพื้นเมืองของ WordPress เป็นแนวปฏิบัติที่ดีที่สุดขอบคุณ
Mostafa Soufi

ด้วยเหตุผลบางอย่างเวอร์ชันนี้ให้ข้อผิดพลาดกับฉันว่า "ไม่มี URL ที่ถูกต้อง" ในขณะที่คำตอบของ Rob Vermeerทำงาน
Flimm

3

set_post_thumbnail() เป็นฟังก์ชั่นที่ดีที่สุดสำหรับข้อกำหนดนี้

ผมคิดว่าคุณจะพบ ID ของสิ่งที่แนบมาผ่านหรือget_children() get_posts()ผลลัพธ์มีอาร์เรย์และภายในอาร์เรย์นี้คือ ID ตัวอย่างการทดสอบ ฉันหวังว่ามันจะใช้งานได้; เขียนโดยไม่มีการทดสอบเฉพาะในรอยขีดข่วน

สำหรับความต้องการของคุณเป็นสิ่งสำคัญที่คุณเปลี่ยนget_the_ID()ด้วยของคุณpost-ID; กลับ ID ของเอกสารแนบและนี้คุณสามารถใช้ set_post_thumbnail()Foth

$attachments = get_children( 
    array(
        'post_parent' => get_the_ID(), 
        'post_type' => 'attachment', 
        'post_mime_type' => 'image'
    )
);
foreach ( $attachments as $attachment_id => $attachment ) {
    echo wp_get_attachment_image($attachment_id);
}

3

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

if(!empty($_FILES)){
    require_once( ABSPATH . 'wp-admin/includes/post.php' );
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    require_once( ABSPATH . 'wp-admin/includes/file.php' );
    require_once( ABSPATH . 'wp-admin/includes/media.php' );

    $post_ID = "your post id!";

    $attachment_id = media_handle_upload( 'file', $post_ID );
    set_post_thumbnail( $post_ID, $attachment_id );
}

ง่ายหรืออะไร หลังจากรับไฟล์ที่ถูกต้องแล้ว wordpress จะจัดการสื่อและอัปโหลดจากนั้นตั้งเป็นภาพขนาดย่อ

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