Media_sideload_image () ile yükledikten sonra $ image_id edinin


10

Bir resim yüklemek ve bir yayında öne çıkan bir resim olarak ayarlamak istiyorum. Ne denedim bu oldu:

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

Ama media_sideload_image(), değil image_idrender html görüntü döndürüyor . Nasıl alabilirim image_id?

Yanıtlar:


28

İşlemleri / kancaları kullanarak bu sınırlamanın nasıl atlanacağına ilişkin bir örnek:

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

Fikir şu ki media_sideload_image, çalıştırıldığında:

  • resmi indirir
  • ek olarak ekler (yazı tipi attachment)
  • ardından bu eki kimliğini verdiğiniz yayına ekler ($ post_id)

Sorununuz, yeni oluşturulan ek yayınları kimliğini sağlamamasıdır.

Ancak , bir ek oluşturulduğunda, kimliğini içeren bir işlem başlatılır. Eki oluşturmadan önce buna bağlanabilir ve özellikli küçük resmi bize verdiği posta kimliğiyle kaydedebilir ve daha sonra kancaları kaldırabiliriz.


1
Parlak! Bu çok yardımcı oldu.
m-torin

2
Bu sorunuzu cevaplarsa, sorunuzu doğru olarak işaretleyebilir misiniz?
Tom J Nowell

İngilizcenizi okuyamıyorum. birisi bu yazıyı düzenleyebilir mi?
HiDd3N

2
@ HiDd3N Kullanılan bazı ingilizce basitleştirilmiş, daha düşük bir okuma yaşı ile daha yaygın kelime olmalı
Tom J Nowell

6

URL ile arama DB, ID almak için bir işlev inşa ettik.

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'yi (html kodundan oluşan) Codex olarak ayarlanmış dördüncü bir 'src' parametre ile alabilirsiniz: media_sideload_image ()

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


4

@ Tom J Nowell'in cevabı açık. Burada açıklanan başka bir alternatif buldum (farklı fonksiyonları kullanarak) ama bunu daha çok seviyorum.

Benim durumumda eklemek istediğim tüm gönderileri içeren $ gönderiler dizisi ve medya ile ayrı bir $ media ($ gönderilerle aynı $ nid tuşları) var. Kodum, Tom'unkiyle aynı çözümdür ancak anonim bir işlevi kullanmak için yeniden düzenlenmiştir:

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

Benim durumumda, her $ media [$ nid] öğesinin ilk öğesinin gönderisinin öne çıkan görüntüsü olduğunu varsayıyorum.

WordPress shouold kesinlikle media_sideload_image () değiştirerek $ id değerini döndürür. Aslında fonksiyon elinizin altında, buradaki kaynağa bakın . Aslında bunun için bir parça bilet var ve hatta bu süre içinde çekirdeğinize uygulamak için yamalar bile var.


Görünüşe göre 4.8'de yama yapmak gerekiyor
Tom Auger

3

Bir çözüm arıyordum ve media_sideload_image()çok basit olan koda bakmaya karar verdim . media_handle_sideload()Bize eki veren kullanır id.

idGörüntünün html kaynağı yerine eki döndürmek için değiştirdim ve hatta yeni dosya adı göndermenin bir yolunu ekledim.

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.