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 ?
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 ?
Yanıtlar:
Evet, mümkün ve oldukça kolay.
Bu önerdiğim iş akışı:
'admin_post_thumbnail_html'
filtre kancası kullanmaktır'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'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:
Bir resim URL'si ekledikten ve yayını kaydettikten / güncelledikten sonra şöyle görünür:
Ş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.
Özellikli görüntü çıkışı ben kullanılmaz ettik width
ya height
WordPress 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.
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.
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.
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 .