Dapatkan $ image_id setelah mengunggah dengan media_sideload_image ()

10

Saya ingin mengunggah gambar dan menetapkannya sebagai gambar unggulan di sebuah pos. Apa yang saya coba adalah ini:

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

Tetapi media_sideload_image()tidak mengembalikan image_id, tetapi membuat gambar html. Bagaimana saya bisa mendapatkannya image_id?

Xavin
sumber

Jawaban:

28

Berikut adalah contoh cara memintas batasan ini menggunakan tindakan / kait:

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

Idenya adalah bahwa ketika media_sideload_imagedijalankan, itu:

  • mengunduh gambar
  • menambahkannya sebagai lampiran (jenis tulisan attachment)
  • kemudian lampirkan lampiran itu ke pos yang ID Anda berikan ($ post_id)

Masalah Anda adalah bahwa itu tidak memberikan ID posting lampiran yang baru dibuat.

Tetapi , ketika lampiran dibuat, tindakan dipecat yang berisi ID-nya. Kita dapat mengaitkan ini sebelum kita membuat lampiran, dan menyimpan thumbnail berfitur dengan ID pos yang diberikannya kepada kita, lalu melepaskan kaitannya setelah itu.

Tom J Nowell
sumber
1
Cemerlang! Itu sangat membantu.
m-torin
2
Jika ini menjawab pertanyaan Anda, bisakah Anda menandainya dengan benar?
Tom J Nowell
saya tidak bisa membaca bahasa Inggris Anda. Dapatkah seseorang mengedit posting ini?
HiDd3N
2
@ HiDd3N Saya sudah menyederhanakan beberapa bahasa Inggris yang digunakan, seharusnya memiliki kata-kata yang lebih umum dengan usia membaca yang lebih rendah
Tom J Nowell
6

Saya telah membangun fungsi untuk mendapatkan ID dari DB, mencari berdasarkan 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;
}

Anda bisa mendapatkan URL (insted dari kode html) dengan paramenter keempat diatur ke 'src' Codex: media_sideload_image ()

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

@ Tom J Nowell jawaban tepat. Saya menemukan alternatif lain (menggunakan fungsi yang berbeda) yang dijelaskan di sini tapi saya suka yang ini lagi.

Dalam kasus saya, saya memiliki array $ posting dengan semua posting yang ingin saya masukkan dan $ media yang terpisah ($ nid kunci yang sama dengan $ posting) dengan media. Kode saya adalah solusi yang sama dengan Tom tetapi refactored untuk menggunakan fungsi anonim:

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

Dalam kasus saya, saya menganggap item pertama di setiap $ media [$ nid] harus menjadi gambar unggulan dari posnya.

WordPress shouold pasti mengubah media_sideload_image () sehingga mengembalikan $ id. Sebenarnya fungsi sudah ada, lihat sumbernya di sini . Bahkan ada tiket lintasan untuk ini dan mereka bahkan memiliki tambalan untuk menerapkan ini pada inti Anda sementara itu jika Anda mau.

Jorge Orpinel
sumber
Sepertinya sudah dijadwalkan untuk diperbaiki pada 4,8
Tom Auger
3

Saya mencari solusi dan memutuskan untuk melihat kode media_sideload_image()yang sangat mudah. Ini menggunakan media_handle_sideload()yang memberi kita keterikatan id.

Saya memodifikasinya untuk mengembalikan lampiran idalih-alih sumber html gambar, dan bahkan menambahkan cara untuk mengirimnya nama file baru.

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;
}
Dario Zadro
sumber