Harici resim URL'si ile öne çıkan bir resim ayarlamak mümkün mü


20

Uzak URL'den resim getiren ve yerel olarak saklayan eklentiler olduğunu biliyorum. Sadece mümkün olup olmadığını bilmek istiyorum değil Ortam Kitaplığı'nda mağaza imajına henüz olarak kullanmak Sunulan Image ?


Bunu, harici resim URL'sini depoladığınız özel bir alanla yapabilirsiniz. Her the_post_thumnail()mevcut olduğunda (veya benzer işlevde) çalışmasını sağlamak veya tema veya eklenti tarafından tanımlanan farklı görüntü boyutlarıyla çalışmasını sağlamak zor olabilir .
cybmeta

1
Harici görüntü URL'sini öne çıkan resim olarak ayarlamak için bu eklentiyi kullanabilirsiniz: wordpress.org/plugins/wp-remote-thumbnail
Gelişmiş SEO

Görüntüyü yerel olarak mı saklıyor yoksa uzaktan mı arıyor?
Volatil3

@ Volatil3 Test etmedim ama eklenti açıklamasını okuduğumda uzaktan çağırdığını söyleyebilirim.
Andy Macaulay-Brook

Yanıtlar:


35

Evet, mümkün ve oldukça kolay.

Bu önerdiğim iş akışı:

  1. Öne çıkan resmin URL'sini eklemek için bir yere bir kullanıcı arayüzü yerleştirin. Muhtemelen en iyi seçim 'admin_post_thumbnail_html'filtre kancası kullanmaktır
  2. 'save_post'URL'yi (güvenlik ve doğrulama yordamından sonra) özel bir gönderi metasında kaydetmek için işlem kancasını kullanın
  3. Öne çıkarılan görüntünün gerekli olduğu gönderinin harici özellikli görüntüye sahip meta meta varsa, varsayılan olarak geçersiz kılmak için 'post_thumbnail_html'uygun <img>biçimlendirme çıktısı almak için filtre kancasını kullanın

Çalışmak için, bu iş akışının özellikli görüntünün get_the_post_thumnbail()veya the_post_thumbnail()işlevlerini kullanarak şablonda gösterilmesi gerekir .

Ayrıca, '_thumbnail_id'harici URL için meta ayarladığımızda meta değerinin boş olmayan bir değere sahip olduğundan emin olmalıyız , aksi takdirde has_post_thumbnail()yalnızca harici özellikli resme sahip gönderiler için false değerini döndürür.

Aslında, bir yazının hem standart yerel özellikli bir görüntüye hem de iş akışımız üzerinden bir kümeye sahip olması mümkündür ve bu durumda harici kullanılır.

İş akışımızı uygulamak için, harici özellikli resim olarak kullanılan URL'yi doğrulama işlevine ihtiyacımız var, çünkü geçerli bir resim URL'si olduğundan emin olmalıyız.

Bu görevi yerine getirmenin farklı yolları vardır; burada görüntüyü indirmeden sadece URL'ye bakan çok basit bir yol kullanıyorum. Bu yalnızca statik resim URL'leri için geçerlidir ve resmin gerçekten var olduğunu doğrulamaz, ancak hızlıdır. Gerekirse daha gelişmiş bir şeye değiştirin ( burada bazı yardımlar vardır).

function url_is_image( $url ) {
    if ( ! filter_var( $url, FILTER_VALIDATE_URL ) ) {
        return FALSE;
    }
    $ext = array( 'jpeg', 'jpg', 'gif', 'png' );
    $info = (array) pathinfo( parse_url( $url, PHP_URL_PATH ) );
    return isset( $info['extension'] )
        && in_array( strtolower( $info['extension'] ), $ext, TRUE );
}

Çok kolay. Şimdi yukarıdaki iş akışında açıklanan 3 kancayı ekleyelim:

add_filter( 'admin_post_thumbnail_html', 'thumbnail_url_field' );

add_action( 'save_post', 'thumbnail_url_field_save', 10, 2 );

add_filter( 'post_thumbnail_html', 'thumbnail_external_replace', 10, PHP_INT_MAX );

ve ilgili fonksiyonlar. İlk olarak, alanı yönetici olarak gönderen:

function thumbnail_url_field( $html ) {
    global $post;
    $value = get_post_meta( $post->ID, '_thumbnail_ext_url', TRUE ) ? : "";
    $nonce = wp_create_nonce( 'thumbnail_ext_url_' . $post->ID . get_current_blog_id() );
    $html .= '<input type="hidden" name="thumbnail_ext_url_nonce" value="' 
        . esc_attr( $nonce ) . '">';
    $html .= '<div><p>' . __('Or', 'txtdomain') . '</p>';
    $html .= '<p>' . __( 'Enter the url for external image', 'txtdomain' ) . '</p>';
    $html .= '<p><input type="url" name="thumbnail_ext_url" value="' . $value . '"></p>';
    if ( ! empty($value) && url_is_image( $value ) ) {
        $html .= '<p><img style="max-width:150px;height:auto;" src="' 
            . esc_url($value) . '"></p>';
        $html .= '<p>' . __( 'Leave url blank to remove.', 'txtdomain' ) . '</p>';
    }
    $html .= '</div>';
    return $html;
}

'txtdomain'Metin alanı olarak kullandığımı , ancak uygun, kayıtlı bir metin alanı kullanmanız gerektiğini unutmayın.

Boş olduğunda çıktı şu şekilde görünür:

Öne çıkan resim için harici URL: alan

Bir resim URL'si ekledikten ve yayını kaydettikten / güncelledikten sonra şöyle görünür:

Öne çıkan resim için harici URL: doldurduktan ve kaydedildikten sonraki alan

Şimdi, yönetici kullanıcı arayüzümüz tamamlandı, kaydetme rutinini yazalım:

function thumbnail_url_field_save( $pid, $post ) {
    $cap = $post->post_type === 'page' ? 'edit_page' : 'edit_post';
    if (
        ! current_user_can( $cap, $pid )
        || ! post_type_supports( $post->post_type, 'thumbnail' )
        || defined( 'DOING_AUTOSAVE' )
    ) {
        return;
    }
    $action = 'thumbnail_ext_url_' . $pid . get_current_blog_id();
    $nonce = filter_input( INPUT_POST, 'thumbnail_ext_url_nonce', FILTER_SANITIZE_STRING );
    $url = filter_input( INPUT_POST,  'thumbnail_ext_url', FILTER_VALIDATE_URL );
    if (
        empty( $nonce )
        || ! wp_verify_nonce( $nonce, $action )
        || ( ! empty( $url ) && ! url_is_image( $url ) )
    ) {
        return;
    }
    if ( ! empty( $url ) ) {
        update_post_meta( $pid, '_thumbnail_ext_url', esc_url($url) );
        if ( ! get_post_meta( $pid, '_thumbnail_id', TRUE ) ) {
            update_post_meta( $pid, '_thumbnail_id', 'by_url' );
        }
    } elseif ( get_post_meta( $pid, '_thumbnail_ext_url', TRUE ) ) {
        delete_post_meta( $pid, '_thumbnail_ext_url' );
        if ( get_post_meta( $pid, '_thumbnail_id', TRUE ) === 'by_url' ) {
            delete_post_meta( $pid, '_thumbnail_id' );
        }
    }
}

Bu işlev, bazı güvenlik denetimlerinden sonra, yayınlanan URL'ye bakar ve sorun yoksa URL'yi '_thumbnail_ext_url'meta sonrası kaydeder . URL boşsa ve meta kaydedildiyse, dış URL alanını boşaltarak metaın kaldırılmasına izin vererek silinir.

Dış resim URL'miz meta olarak ayarlandığında, yapılacak son şey öne çıkan resim işaretlemesini çıktılamaktır:

function thumbnail_external_replace( $html, $post_id ) {
    $url =  get_post_meta( $post_id, '_thumbnail_ext_url', TRUE );
    if ( empty( $url ) || ! url_is_image( $url ) ) {
        return $html;
    }
    $alt = get_post_field( 'post_title', $post_id ) . ' ' .  __( 'thumbnail', 'txtdomain' );
    $attr = array( 'alt' => $alt );
    $attr = apply_filters( 'wp_get_attachment_image_attributes', $attr, NULL );
    $attr = array_map( 'esc_attr', $attr );
    $html = sprintf( '<img src="%s"', esc_url($url) );
    foreach ( $attr as $name => $value ) {
        $html .= " $name=" . '"' . $value . '"';
    }
    $html .= ' />';
    return $html;
}

İşimiz bitti.

Yapacak ne kaldı

Özellikli görüntü çıkışı ben kullanılmaz ettik widthya heightWordPress genellikle gibi eklediği özellikleri, ne de sınıflar 'attachment-$size'. Bunun nedeni, bir görüntünün boyutunun koklanması, özellikle sayfada birden fazla öne çıkan resminiz varsa, sayfa yüklemesini yavaşlatacak ek çalışma gerektirmesidir.

Bu özniteliklere ihtiyacınız varsa, wp_get_attachment_image_attributes'filtreye geri arama ekleyerek kodumu kullanabilirsiniz ( standart bir WordPress kancasıdır ) veya resim boyutunu ve çıktı ile ilgili öznitelikleri ve sınıfları koklamak için kodumu değiştirebilirsiniz.

Eklenti Özeti

Burada yayınlanan tüm kod, uygun bir metin alanı başlatma işlemi hariç, burada bir Gist'te tam çalışan bir eklenti olarak kullanılabilir . Buradaki kod bir ad alanı kullanır, bu nedenle PHP 5.3+ gerektirir.

notlar

Tabii ki, sitenizdeki görüntüleri harici olanlardan kullanmak ve hotlink kullanmak için lisansınız ve yetkiniz olduğundan emin olmalısınız.


bu kodu nereye koyacağım
Ankit Agrawal

Lütfen hangi kodu, hangi sayfaya yazmamız gerektiğini açıklayabilir misiniz? Ben PHP / Wordpress bir acemi ben bu yüzden adım adım açıklayınız. Teşekkürler
Ankit Agrawal

@AnkitAgrawal buraya bak
gmazzap
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.