Wp_insert_post () kullanırken özellikli bir resmi (küçük resmi) resim URL'sine göre nasıl ayarlarım?


61

Bakarken wp_insert_post () için fonksiyon referans girişi , bana olarak görüntülenen bir yazı için 'Seçme Resmi', ayarlamasına olanak tanıyacak gerektiriyorsa dizide hiçbir parametre var olduğunu fark sonrası küçük resim benim tema.

Bennett tarafından önerildiği gibi set_post_thumbnail () gibi fonksiyonlara baktım , ancak bu WordPress ve WordPress kodeksine nispeten yeni bir ekleme gibi görünüyor. Bu nedenle, $ thumbnail_id parametresinin nasıl edinilmesi ve sunulması gerektiğini açıklayabilecek herhangi bir kaynak bulunmuyor. Eğer bu gerçekten kullanılacak işlevse, elimdeki tek resim URL ise ne şekilde geçerli bir $ thumbnail_id parametresi sağlayabilirim?

Şimdiden teşekkürler!

Yanıtlar:


107

Bir görüntüyü medya kütüphanenizdeyken yazı küçük resmi olarak ayarlayabilirsiniz. Medya kitaplığınıza bir resim eklemek için onu sunucunuza yüklemeniz gerekir. WordPress'in medya kütüphanenize görüntü koyma işlevi zaten var, sadece dosyanızı yükleyen bir komut dosyasına ihtiyacınız var.

Kullanımı:

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

İşlev:

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: Eklenen yol oluşturma

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


Çabalarınız için teşekkürler! Bu sadece $ upload_dir ['basedir'] (yol yerine) kullanıldığında çalışır, çünkü eki düzenleme sonrası arayüz yoluyla incelerken, [upload_dir ['path' ] ... / upload / 2012/02 / FILENAME.EXT gibi bir şeyde saklardı. Bir şekilde dosyaya nasıl başvurulduğunu değiştirmek daha iyi olabilir, ama nasıl yapacağımı bilemem.
Chris

1
Cevabımda yol oluşturma eklendi.
Rob Vermeer

Hızlı cevabınızı takdir edin :). Ancak yine de aynı sonucu alıyorum, işte sorunumu gösteren bir ekran görüntüsü: i.imgur.com/iKTNs.png . Üst kısım, sadece neler olup bittiğini görmek için koşullu bir yankı yerleştirmenin sonucudur.
Chris

Yine değiştirildi, wp_insert_attachment ve wp_generate_attachment_metadata için tam yolu geçmedi. Umarım bu sorunu çözecektir.
Rob Vermeer

1
Uyarı: Bu cevap aynı isimde ise dosyayı yeniden yazar, dikkat edin. $ Post_id veya en azından uniqid () kullanarak isimler üretmelidir
Ivan Castellanos

10

Kullanmayı deneyin set_post_thumbnail().

Otto tarafından düzenleyin: Sorunuzu netleştirdiniz, bu yüzden Chip'in verdiği cevabı netleştireceğim.

Temel olarak, yazı için de 'ek' yapmanız gerekiyor. Bir resim WordPress medya kitaplığına yüklendiğinde, yazı tipi ekli özel bir yazı girişi yapılır. Bu ek, post_parent tanıtıcısı üzerinden belirli bir gönderiye bağlanır.

Bu nedenle, ekin kimliğini biliyorsanız, o zaman set_post_thumbnail öğesini post nesnesiyle veya ID ile çağırmak ve ek ID yalnızca post küçük resim bayrağını ayarlayacaktır.

Henüz eki oluşturmadıysanız, önce bunu yapmanız gerekir. Bunu yapmanın en kolay yolu wp_insert_attachment(). Bu işlev birkaç parametreden oluşan bir dizi alır; dosya adı (dosya zaten uygun yükleme dizininde olmalıdır) ve eki eklemek istediğiniz üst gönderinin posta kimliği.

Sadece bir dosyanın yüklenmiş ve bir yayına eklenmiş olması otomatik olarak hiçbir şey yapmaz. Bu sadece bir tür sınıflandırma mekanizmasıdır. Örneğin galeri mekanizması, o gönderinin [galerisini] oluşturmak için bir gönderinin ekli resimlerini kullanır. Bir gönderi için küçük resim, küçük resim olarak ayarlanmış ekli görüntülerden yalnızca biridir.

Wp_insert_attachment'in nasıl kullanılacağı hakkında daha fazla bilgiyi kodeksin içinde bulabilirsiniz.


Cevabın için teşekkürler! Yine de, küçük resim kimliğini nasıl alırım? Bir resim URL'si ile başlıyorum, bu nedenle başka bir işlevi kullanarak wordpress kitaplığına bir resim eklemem gerekir mi?
Chris

Zaten bir gönderi eklerken , eklediğiniz gönderiye zaten resimler eklediğinizi varsaymıştım . Bu geçerli bir varsayım değil mi?
Chip Bennett

Üzgünüz, henüz URL’ye göre bir yayına nasıl resim ekleyeceğimi henüz bulamadım. Ayrıca, görüntünün aslında yayında görüntülenmesini istemem. Şu anda $ thumbnail_id işlevini döndürecek işlevi arıyorum ve ekin yükleme dizininde olması gerektiğini fark edinceye kadar wp_insert_attachment () 'nin işe yarayacağını düşündüm. URL'sine göre bir resim dosyasını nasıl alacağımı bilmiyorum ve aradığım fonksiyonun bu olup olmadığından emin değilim. Yardımın için teşekkürler!
Chris

Neyi başarmaya çalıştığınızı daha iyi tanımlamak için lütfen sorunuzu bu bilgilerle yeniden yazabilir misiniz? (Veya, yazıyı eklerken ek kimliğini nasıl alacağınızı sormak için, olduğu gibi bırakın ve yeni bir soru başlatır mısınız?)
Chip Bennett

Asıl soru düzenlendi ve kısmen yeniden düzenlendi, lütfen tekrar kontrol edin :).
Chris

9

Ben WP çekirdek işlevlerini kullanarak Robs cevabını geliştirmek istiyorum download_urlvemedia_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 yerel işlevlerini kullanmak en iyi yöntemdir, Teşekkürler.
Mostafa Soufi

Nedense, bu sürüm bana "Geçerli bir URL sağlanamadı" diyerek hatalar verdi. oysa Rob Vermeer'in cevabı çalıştı.
Flimm

3

set_post_thumbnail() bu gereksinim için en iyi fonksiyondur.

Bence, bir ekin kimliğini get_children()veya aracılığıyla bulursun get_posts(). Sonuçta bir dizi var ve bu dizinin içinde ID var. Test için aşağıdaki örnek; umarım işe yarar; Testler olmadan yaz, sadece çizikle.

İhtiyaçlarınız için, sizinki get_the_ID()ile değiştirmeniz önemlidir post-ID; Eklentinin kimliğini döndürürseniz, foth'u kullanabilirsiniz 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);
}

3

Sadece bunu buldum ve çok daha basit hale getirdi, işe yarıyor ama ben güvenlik temizleyici değilim

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

basit ya da ne? Doğru dosyaları aldıktan sonra wordpress medyayı kullanacak ve yükleyecek, ardından küçük resim olarak ayarlayacaktır.

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.