Sayfa şablonu varsa resim boyutu ekle


13

WordPress Multisite ile bir üye web sitesi oluşturuyorum. Seçilen şablona bağlı olarak kaç görüntü üretildiğini sınırlamak mümkün müdür?

Galeri şablonunda belirli görüntüler oluşturmak için aşağıdaki kod satırlarını denedim:

// Generate on all uploads
add_theme_support('post-thumbnails');
set_post_thumbnail_size( 1440, 350, true ); 
add_image_size( 'standard_box', 450, 215, true );
add_image_size( 'default_image', 691, 9999 );

// Generate on gallery template only
if ( is_page_template('page-gallery.php') ) {
add_image_size( 'gallery', 900, 9999 );
add_image_size( 'gallery_thumb', 450, 450, true );
}

Bu işe yaramadı. Biraz araştırma yaptım ve bu konuda hiçbir şey bulamıyorum. Beni doğru yöne yönlendirebilirsen, gerçekten minnettar olurum.


1
Otto'nun istediğiniz kadar görüntü boyutu tanımlamanızı sağlayan, ancak yalnızca gerektiğinde belirli bir boyutta görüntü üreten Dinamik Görüntü Resizer de vardır. Örneğin, galeri küçük resimleri yalnızca page-gallery.php şablonunda görünen resimler için oluşturulur.
helgatheviking

2
Diğer iki harika seçenekten bahsetmek istiyorum: @ kaiser Dinamik Resim Yeniden Boyutlandırma ve JetPack'teki Foton hizmeti .
14'te Birgire

Yanıtlar:


13

Bu benim için her zaman bir böcek oldu - isteğe bağlı görüntü boyutunun olmaması ve çok sayıda boyutunuz varsa sonuçta ortaya çıkabilecek dosya sayısı!

Çabalarınızın arkasındaki mantığı görebiliyorum - sorun şu ki, add_image_sizesadece yükleme noktasında gerçekten devreye giriyor. Gibi, is_page_template(..)her zaman olacak false.

Hızlı bir google , bu sorunu çözmek için tasarlanmış bir betik olan Aqua Resizer'ı kazdı . Kullanmak yerine add_image_size, aq_resizedoğrudan temanızda kullanırsınız ve görüntü için bir boyut yoksa, anında oluşturulur ve önbelleğe alınır.

Aslında, birçok görüntü boyutuna sahip birkaç sitede benzer, farklı da olsa bir teknik kullandım. Yüklenen her resim için her boyutu üreten WordPress yükünü yine de kaydedersiniz - istendiğinde ve istendiğinde anında (& önbellekte) oluşturulurlar. Farklı olduğu yerde, WP'nin tüm standart görüntü işlevlerini ve şablon etiketlerini normalde kullandığınız gibi kullanabilirsiniz!

Ayrıca, @Waqas'ın da belirttiği gibi, Aqua Resizer kullanmak medya kütüphanenizden bir görüntü sildiğinizde artık dosyaları bırakacaktır. Benim tekniği ile, tüm bunlar veritabanına kaydedilir ve WordPress tarafından tanınan konum beri dosyalar silinir.

/**
 * Resize internally-registered image sizes on-demand.
 *
 * @link    http://wordpress.stackexchange.com/q/139624/1685
 * 
 * @param   mixed   $null
 * @param   int     $id
 * @param   mixed   $size
 * @return  mixed
 */
function wpse_139624_image_downsize( $null, $id, $size ) {
    static $sizes = array(
        'post-thumbnail' => array(
            'height' => 350,
            'width'  => 1440,
            'crop'   => true,
        ),

        'standard_box' => array(
            'height' => 215,
            'width'  => 450,
            'crop'   => true,
        ),

        'default_image' => array(
            'height' => 9999,
            'width'  => 691,
            'crop'   => false,
        ),

        'gallery' => array(
            'height' => 900,
            'width'  => 9999,
            'crop'   => false,
        ),

        'gallery_thumb' => array(
            'height' => 450,
            'width'  => 450,
            'crop'   => true,
        ),
    );

    if ( ! is_string( $size ) || ! isset( $sizes[ $size ] ) )
        return $null;
    if ( ! is_array( $data = wp_get_attachment_metadata( $id ) ) )
        return $null;
    if ( ! empty( $data['sizes'][ $size ] ) )
        return $null;
    if ( $data['height'] <= $sizes[ $size ]['height'] && $data['width'] <= $sizes[ $size ]['width'] )
        return $null;
    if ( ! $file = get_attached_file( $id ) )
        return $null;

    $editor = wp_get_image_editor( $file );

    if ( ! is_wp_error( $editor ) ) {
        $data['sizes'] += $editor->multi_resize(
            array(
                $size => $sizes[ $size ],
            )
        );

        wp_update_attachment_metadata( $id, $data );
    }

    return $null;
}

add_filter( 'image_downsize', 'wpse_139624_image_downsize', 10, 3 );

Ve pratikte:

wp_get_attachment_image( $id, 'gallery' ); // Resized if not already
wp_get_attachment_image_src( $id, 'standard_box' ); // Resized if not already
the_post_thumbnail(); // You get the idea!
// And so forth!

Bunu otomatik olarak tüm add_image_sizeçağrıları isteğe bağlı yeniden boyutlandırmaya dönüştürecek bir eklentiye dönüştürmeyi planlıyorum , bu yüzden bu alanı izleyin!


Böyle harika bir cevap bırakmak için zaman ayırdığınız için teşekkür ederiz. Kesinlikle bir şans vereceğim. Sunucumu birden fazla kullanıcıya açmadan önce bunu almam önemlidir. Başka sorum olursa size sesleneceğim.
Sam

2
Ben the_post_thumbnail () ile bunu denedim; ve mükemmel çalışıyor. Bir sorun: Görüntüyü sildiğimde, komut dosyanız tarafından yeniden boyutlandırılan görüntünün arkasında kalıyor. Herhangi bir fikir?
Sam

5

3

Eğer anında başparmak oluşturmak istiyorsanız Aqua görüntü resizer kullanabilirsiniz , Ama bu mini komut dosyası bir dezavantajı var. Oluşturulan görseller kütüphaneden resim silindikten sonra silinmez. Ama bu büyük bir mesele değil. Gerekirse SHH komutları ile yapabilirsiniz


1
Silinmeyen dosyalar için iyi bir nokta. Benim çözümüm bundan muzdarip olmayacak! (güncellenmiş cevaba bakınız).
TheDeadMedic

1

Sorununuz için doğrudan bir cevap değil. Ama ihtiyacına göre görüntü yapmana yardım edeceğim.

Add_image_size kullandığınızda, var olan görüntüler yeniden boyutlandırılmaz. yalnızca add_image_size işlevinizi ekledikten sonra yüklenecek yeni resimler için çalışır.

Dolayısıyla kodunuz is_page_template işlevi için yeni resimler oluşturmaz.

Ama probleminizi çözmek için basit bir php sınıfı kullanabilirsiniz .... WordPress için orada premium tema bir sürü için kullanılan ünlü bir php sınıfı. Aqua-Resizer denir.

Daha fazla bilgiyi burada bulabilirsiniz https://github.com/syamilmj/Aqua-Resizer Wiki: https://github.com/syamilmj/Aqua-Resizer/wiki

Ortaya çıkabilecek sorun:

Bu işlev bu şekilde çalışır ....

<?php aq_resize( $url, $width, $height, $crop, $single ) ?>

Bu nedenle kırpılamadığında (boyunuz veya genişliğinizin tanımladığı küçük görüntü için) hiçbir şey göstermez. Burada benim gibi çok kolay bu işlev içinde url geçtikten sonra bir null değeri alıp almadığınızı kontrol ederek bu durumu aşabilirsiniz ....

<?php 
$thumb = wp_get_attachment_url( get_post_thumbnail_id($post->ID), 'full' ); if($thumb){ $url = aq_resize( $thumb, 400, 200, true, true ); if(!$url){ $url = WPM_DIR.'/assets/images/demo/wrong_image_size.jpg'; } }else{ $url = WPM_DIR.'/assets/images/demo/400x200_no_feature_image.jpg'; } 
?>

Bu şekilde, belirli sayfa şablonu için belirli bir görüntünün oluşturulmasını ve böylece web sitenizin çok daha temiz olmasını sağlayabilirsiniz.

Not: Bu php sınıfı WordPress çekirdek kırpma sistemini kullanır, böylece güvenlik sorunları olmaz.

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.