Bagaimana cara mengatur gambar unggulan (thumbnail) dengan URL gambar saat menggunakan wp_insert_post ()?

61

Sambil melihat entri referensi fungsi untuk wp_insert_post () , saya perhatikan bahwa tidak ada parameter dalam array yang diperlukan yang akan memungkinkan saya untuk mengatur 'Gambar Unggulan' untuk posting, ditampilkan sebagai thumbnail posting di tema saya.

Saya telah melihat ke dalam fungsi-fungsi seperti set_post_thumbnail () , seperti yang disarankan oleh Mr. Bennett, tetapi ini tampaknya merupakan tambahan yang relatif baru untuk WordPress itu sendiri dan kodeks WordPress. Karena itu, tidak ada sumber yang dapat saya temukan yang menjelaskan bagaimana parameter $ thumbnail_id harus diperoleh dan disediakan. Jika ini benar-benar fungsi untuk digunakan, dengan cara apa saya bisa memberikan parameter $ thumbnail_id yang valid ketika semua yang saya miliki adalah URL gambar?

Terima kasih sebelumnya!

Chris
sumber

Jawaban:

107

Anda dapat mengatur gambar sebagai gambar mini pos saat berada di perpustakaan media Anda. Untuk menambahkan gambar di perpustakaan media Anda, Anda perlu mengunggahnya ke server Anda. WordPress sudah memiliki fungsi untuk meletakkan gambar di perpustakaan media Anda, Anda hanya perlu skrip yang mengunggah file Anda.

Pemakaian:

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()

Fungsi:

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


EDIT: Menambahkan pembuatan jalur

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

Rob Vermeer
sumber
Terima kasih untuk usaha Anda! Ini hanya bekerja ketika menggunakan $ upload_dir ['basedir'] (daripada path) meskipun, karena ketika saya memeriksa lampiran melalui antarmuka edit posting itu dirujuk sebagai ... / uploads / FILENAME.EXT sementara $ upload_dir ['path' ] akan menyimpannya dalam sesuatu seperti ... / uploads / 2012/02 / FILENAME.EXT. Mungkin lebih baik untuk mengubah bagaimana file direferensikan, tapi saya tidak tahu caranya.
Chris
1
Menambahkan pembuatan jalur dalam jawaban saya.
Rob Vermeer
Hargai tanggapan cepat Anda :). Namun saya masih mendapatkan hasil yang sama, inilah tangkapan layar yang menampilkan masalah saya: i.imgur.com/iKTNs.png . Bagian atas adalah hasil menempatkan gema dalam kondisi Anda, hanya untuk melihat apa yang terjadi.
Chris
Mengubahnya lagi, tidak meneruskan path lengkap ke wp_insert_attachment dan wp_generate_attachment_metadata. Semoga ini akan menyelesaikan masalah.
Rob Vermeer
1
Peringatan: Jawaban ini menulis ulang file jika memiliki nama yang sama, waspadalah. Seharusnya menghasilkan nama menggunakan $ post_id atau setidaknya uniqid ()
Ivan Castellanos
10

Coba gunakan set_post_thumbnail().

Sunting oleh Otto: Anda mengklarifikasi pertanyaan Anda, jadi saya akan mengklarifikasi respons yang diberikan Chip.

Pada dasarnya, Anda perlu membuat 'lampiran' untuk posting juga. Ketika suatu gambar diunggah ke dalam pustaka media WordPress, entri tulisan khusus dibuat untuk itu dengan jenis lampiran posting. Lampiran ini ditautkan ke beberapa pos tertentu melalui pengidentifikasi post_parent.

Jadi jika Anda tahu ID lampiran, maka memanggil set_post_thumbnail dengan objek posting atau ID dan ID lampiran hanya akan mengatur bendera thumbnail posting.

Jika Anda belum membuat lampiran, maka Anda harus melakukannya terlebih dahulu. Cara termudah untuk melakukannya adalah dengan wp_insert_attachment(). Fungsi ini mengambil array dari beberapa parameter, nama file (file harus sudah ada di direktori unggahan yang tepat), dan ID posting dari posting induk yang ingin Anda lampirkan lampirannya.

Hanya memiliki file yang diunggah dan dilampirkan pada sebuah posting tidak melakukan apa pun secara otomatis. Ini hanyalah semacam mekanisme kategorisasi. Mekanisme galeri, misalnya, menggunakan gambar yang dilampirkan dari sebuah pos untuk membangun [galeri] untuk posting itu. Thumbnail untuk postingan hanyalah salah satu dari gambar terlampir yang telah ditetapkan sebagai thumbnail.

Info lebih lanjut tentang cara menggunakan wp_insert_attachment dapat ditemukan di codex (ditautkan di atas).

Chip Bennett
sumber
Terimakasih atas balasan anda! Bagaimana saya mengambil ID thumbnail? Saya memulai dengan URL gambar, jadi saya kira saya harus menambahkan gambar entah bagaimana ke perpustakaan wordpress menggunakan fungsi lain?
Chris
Karena Anda sudah memasukkan posting, saya berasumsi bahwa Anda sudah melampirkan gambar ke posting yang Anda masukkan. Apakah itu bukan asumsi yang valid?
Chip Bennett
Maaf, tetapi saya belum menemukan cara untuk benar-benar melampirkan gambar ke pos dengan URL. Juga, saya tidak ingin gambar ditampilkan di pos itu sendiri. Saat ini saya sedang mencari fungsi yang akan mengembalikan $ thumbnail_id, dan berpikir bahwa mungkin wp_insert_attachment () akan berfungsi, sampai saya perhatikan sudah membutuhkan lampiran untuk berada di direktori unggah. Saya tidak tahu bagaimana cara mendapatkan file gambar di sana dengan URL-nya, dan saya tidak yakin apakah ini adalah fungsi yang saya cari di tempat pertama. Terima kasih untuk bantuannya!
Chris
Bisakah Anda menulis ulang pertanyaan Anda dengan informasi ini, untuk lebih menggambarkan apa yang ingin Anda capai? (Atau, biarkan yang ini apa adanya, dan mulailah pertanyaan baru, untuk bertanya bagaimana cara mendapatkan ID lampiran saat memasukkan pos?)
Chip Bennett
Pertanyaan asli telah diedit dan sebagian diulang, harap periksa kembali :).
Chris
9

Saya ingin meningkatkan jawaban Robs dengan memanfaatkan fungsi inti WP download_urldanmedia_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 );

}
Jan Beck
sumber
1
Menggunakan fungsi asli WordPress adalah praktik terbaik, Terima kasih.
Mostafa Soufi
Untuk beberapa alasan, versi ini memberi saya kesalahan dengan mengatakan "URL yang valid tidak disediakan." , sedangkan jawaban Rob Vermeer berhasil.
Flimm
3

set_post_thumbnail() adalah fungsi terbaik untuk persyaratan ini.

Saya pikir, Anda menemukan ID lampiran melalui get_children()atau get_posts(). Hasilnya memiliki array dan di dalam array ini adalah ID. Ikuti contoh untuk pengujian; Saya harap ini berhasil; menulis tanpa tes, hanya pada awal.

Untuk kebutuhan Anda, penting bahwa Anda mengubah get_the_ID()dengan Anda post-ID; kembalikan ID Lampiran dan ini bisa Anda gunakan foth set_post_thumbnail().

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

Baru saja menemukan ini dan membuatnya lebih sederhana, berfungsi tetapi saya bukan scrubber keamanan

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

sederhana atau apa? setelah mendapatkan file yang tepat, wordpress akan menangani media dan mengunggahnya, lalu menjadikannya sebagai thumbnail.

Jesse Baker
sumber