Yalnızca gerektiğinde küçük resimler nasıl oluşturulur?


18

1000 fotoğrafım var. Nasıl sadece gerektiğinde başparmak oluşturmak için wordpress yapabilirim. Örneğin ev kaydırıcı sadece diğer 1000 görüntüleri bu alan ve kaynak israfı olarak oluşturulan bu küçük resim olmasını istemiyorum 10 görüntüleri kullanacaktır.

Add_image_size dosyasını yalnızca gerektiğinde tetiklemenin bir yolu var mı?

Teşekkürler

GÜNCELLEME Dediğiniz gibi gerçekten ateşlenmesi gereken add_image_size değildir. Ne iyi olurdu ben thepost_thumbnail ('slider-thumb') kullandığınızda görüntü yeniden boyutlandırmak ateş etmektir ; Belki bu yavaşlama görüntünün ilk görünümü ama aslında ben umurumda değil bu yüzden aslında yazı incelediğinizde bu görünüm genellikle benim tarafımdan oluşturulur.

Yani benim mesajlar, kaymak, blog küçük resimler, portföy küçük resimler vb ben 1000 görüntüleri var ve ben sadece 10 görüntü kaydırıcı için yeniden boyutlandırmak istiyorum diğer 990 görüntüler için küçük resim boyutu oluşturmak için boşa kaynak bir sürü görmek istiyorum.

Umarım şimdi anlaşılır, ingilizcem için özür dilerim


2
Fazladan 990 görüntüden küçük resimler ilk etapta 990 kullanılmayan görüntüden daha fazla alan ve kaynak israfından nasıl oluşur? Yalnızca aktif olarak kullandığınız resimleri yüklemek daha anlamlı olmaz mıydı?
SickHippie

Daha yetenekli programcılar fikrinize karşı geçerli argümanlar sunsa da, ilginç buluyorum. Başparmak oluşturmadan resim yükleyen bazı eklentiler ve temalar gördüm (şu anda hangisinden emin değilim). Ama sorunuzla ilgili büyük şüphem şudur: ne zaman ihtiyacınız olacak? . Filtre ne olacak?
brasofilo

1
Beni yanlış anladın. 990 görüntülerini yazılarda kullanıyorum, sadece ev kaydırıcısında kullanmıyorum. Bazıları portföy için başparmak gerekir, bazıları blog başparmak için vb
chifliiiii

Yanıtlar:


12

Otto'nun Dynamic Image Resizer eklentisine göz atın

Bu eklenti, WordPress'in görüntüleri, yalnızca gerçekte bir yerde, anında kullanıldıklarında oluşturmasını sağlamak için görüntüleri oluşturma biçimini değiştirir. Bu şekilde oluşturulan görüntüler, web sunucusu tarafından daha sonra hızlı gönderilmek üzere normal yükleme dizinlerine kaydedilir. Sonuç, yerden tasarruf edilmesidir (görüntüler yalnızca gerektiğinde oluşturulduğundan) ve görüntüleri yüklemek çok daha hızlıdır (artık yükleme sırasında görüntüleri üretmediği için).


2
Eklentinin eski yayınlara resim eklemeyle ilgili bir sorunu olduğunu unutmayın. Yamalar hoş geldiniz.
Otto

Tam olarak aradığım şey bu. Bir deneyeceğim. Yani sadece yeni yazılarda mı çalışıyor?
chifliiiii

1
Şimdi bu gönderiye rastlayanlara, aktif olarak geliştirildiği görülen benzer bir eklenti var: wordpress.org/plugins/fly-dynamic-image-resizer
Tim Malone

7

Bunu tema işlevleri dosyanıza koyun. Yükleme sırasında Wordpress'in varsayılan 3 boyuttan başka bir şey oluşturmasını engelleyecektir.

Daha sonra henüz oluşturulmamış belirli bir boyutta bir görüntü istendiğinde, yalnızca bir kez oluşturulur.

        add_filter('image_downsize', 'ml_media_downsize', 10, 3);
        function ml_media_downsize($out, $id, $size) {
            // If image size exists let WP serve it like normally
            $imagedata = wp_get_attachment_metadata($id);
            if (is_array($imagedata) && isset($imagedata['sizes'][$size]))
                return false;

            // Check that the requested size exists, or abort
            global $_wp_additional_image_sizes;
            if (!isset($_wp_additional_image_sizes[$size]))
                return false;

            // Make the new thumb
            if (!$resized = image_make_intermediate_size(
                get_attached_file($id),
                $_wp_additional_image_sizes[$size]['width'],
                $_wp_additional_image_sizes[$size]['height'],
                $_wp_additional_image_sizes[$size]['crop']
            ))
                return false;

            // Save image meta, or WP can't see that the thumb exists now
            $imagedata['sizes'][$size] = $resized;
            wp_update_attachment_metadata($id, $imagedata);

            // Return the array for displaying the resized image
            $att_url = wp_get_attachment_url($id);
            return array(dirname($att_url) . '/' . $resized['file'], $resized['width'], $resized['height'], true);
        }


        add_filter('intermediate_image_sizes_advanced', 'ml_media_prevent_resize_on_upload');
        function ml_media_prevent_resize_on_upload($sizes) {
            // Removing these defaults might cause problems, so we don't
            return array(
                'thumbnail' => $sizes['thumbnail'],
                'medium' => $sizes['medium'],
                'large' => $sizes['large']
            );
        }

Bu dosyalayıcı WordPress'te standart olmalıdır. Neden her görüntü için her boyutu oluşturmalıyım? Bu kodu özel temalarıma ekliyorum. Teşekkürler
Michaelkay

2
Güzel ama şimdi sadece bir özel boyuta ihtiyacım olursa hala tüm görüntüleri üretecek ..
Gijs

Gelişmiş özel alanlardan görüntü nesneleri kullandığımda olur
Gijs

Add_image_size daha önce tanımlanmış görüntü boyutları ile tanımlanmışsa çalışmaz
Benjamin Intal

@Michaelkay bu yaklaşımda bir performans cezası var. Görüntüler her boyut için karşıya yüklendiğinde ve oluşturulduğunda, yükleyicinin sabırla yüklendiği anlamına gelir. Bu kod, ziyaretçilerinizin daha fazla sabra sahip olmasını sağlar ve Google'ın yüklenmesi 2 saniyeden uzun süren, kullanıcıların% 50'sini düşüren siteleri kanıtlamıştır. Ayrıca sitenizde yüzlerce eşzamanlı ziyaret varsa, bu sunucularınızı devre dışı bırakır.
Tom Roggero

2

Ne yazık ki @ Patrick'in yanıtı, WP 4.4'te sunulan srcset işlevlerini kırar. Neyse ki, sadece iki ek fonksiyon eklememiz gerekiyor!

İlk olarak, kaydedilebilen tüm küçük resim boyutlarını, görüntü meta verilerine geçici olarak yeniden eklememiz gerekir;

function bi_wp_calculate_image_srcset_meta($image_meta, $size_array, $image_src, $attachment_id){
    //all registered sizes
    global $_wp_additional_image_sizes;

    //some source file specs we'll use a lot
    $src_path = get_attached_file($attachment_id);
    $src_info = pathinfo($src_path);
    $src_root = trailingslashit($src_info['dirname']);
    $src_ext = $src_info['extension'];
    $src_mime = wp_check_filetype($src_path);
    $src_mime = $src_mime['type'];
    $src_base = wp_basename($src_path, ".$src_ext");

    //find what's missing
    foreach($_wp_additional_image_sizes AS $k=>$v)
    {
        if(!isset($image_meta['sizes'][$k]))
        {
            //first, let's find out how things would play out dimensionally
            $new_size = image_resize_dimensions($image_meta['width'], $image_meta['height'], $v['width'], $v['height'], $v['crop']);
            if(!$new_size)
                continue;
            $new_w = (int) $new_size[4];
            $new_h = (int) $new_size[5];

            //bad values
            if(!$new_h || !$new_w)
                continue;

            //generate a filename the same way WP_Image_Editor would
            $new_f = wp_basename("{$src_root}{$src_base}-{$new_w}x{$new_h}." . strtolower($src_ext));

            //finally, add it!
            $image_meta['sizes'][$k] = array(
                'file'      => $new_f,
                'width'     => $new_w,
                'height'    => $new_h,
                'mime-type' => $src_mime
            );
        }
    }

    return $image_meta;
}
add_filter('wp_calculate_image_srcset_meta', 'bi_wp_calculate_image_srcset_meta', 10, 4);

Ardından, eşleşmeleri çalıştırmamız ve eksik küçük resimler oluşturmamız gerekir:

function bi_wp_calculate_image_srcset($sources, $size_array, $image_src, $image_meta, $attachment_id){

    //get some source info
    $src_path = get_attached_file($attachment_id);
    $src_root = trailingslashit(pathinfo($src_path, PATHINFO_DIRNAME));

    //the actual image metadata (which might be altered here)
    $src_meta = wp_get_attachment_metadata($attachment_id);

    //an array of possible sizes to search through
    $sizes = $image_meta['sizes'];
    unset($sizes['thumbnail']);
    unset($sizes['medium']);
    unset($sizes['large']);

    $new = false;

    //loop through sources
    foreach($sources AS $k=>$v)
    {
        $name = wp_basename($v['url']);
        if(!file_exists("{$src_root}{$name}"))
        {
            //find the corresponding size
            foreach($sizes AS $k2=>$v2)
            {
                //we have a match!
                if($v2['file'] === $name)
                {
                    //make it
                    if(!$resized = image_make_intermediate_size(
                        $src_path,
                        $v2['width'],
                        $v2['height'],
                        $v2['crop']
                    )){
                        //remove from sources on failure
                        unset($sources[$k]);
                    }
                    else
                    {
                        //add the new thumb to the true meta
                        $new = true;
                        $src_meta['sizes'][$k2] = $resized;
                    }

                    //remove from the sizes array so we have
                    //less to search next time
                    unset($sizes[$k2]);
                    break;
                }//match
            }//each size
        }//each 404
    }//each source

    //if we generated something, update the attachment meta
    if($new)
        wp_update_attachment_metadata($attachment_id, $src_meta);

    return $sources;
}
add_filter('wp_calculate_image_srcset', 'bi_wp_calculate_image_srcset', 10, 5);

Sadece bunun zor kırpılmasını kıracağını size bildirmek için bir uyarı! Bunun suçlu olduğunu bulmak saatlerimi aldı. Bir çözüm üzerinde çalışıyorum ...
Constantin Groß

1

Aslında, add_image_size()küçük resim oluşturmaz, sadece WordPress'in kullanabileceği bir görüntü boyutu kaydeder.

Genellikle, resim ilk yüklendiğinde küçük resimler oluşturulur. Bu otomatik bir işlemdir, bu nedenle bunları daha sonra oluşturmak konusunda endişelenmenize gerek yoktur. Bu şekilde düşünün - yavaş bir sunucuda küçük resim oluşturmak 1-2 saniye alırsa ve istenene kadar beklerseniz, talep eden kişiyi ek 1-2 saniye beklemeye zorlarsınız içeriği görmek için resim başına . Bunu önceden yapmak çok daha kolay - yani görüntü yüklendiğinde.

Aynı zamanda, küçük resimleri kesinlikle farklı bir zamanda işlemeniz gerekiyorsa, Viper'ın Küçük Resimleri Yenileme eklentisine göz atmak isteyebilirsiniz . Tüm resim küçük resimlerinizi yeniden oluşturmak için isteğe bağlı bir eylem kullanır ... ancak yalnızca gerektiğinde küçük resimler oluşturmak için benzer kodu kullanabilirsiniz.


Bence anlamamışsın. Küçük resimlerin hangi resimler için gerekli olduğunu kontrol etmek istiyor. Bu yüzden bazı görüntülerin yeniden boyutlandırılması gerekmez.
Sarhoş Üstat

Çoğu kişi fotoğrafları eklerken sayfaları test eder (her şeyi söyleyerek oldukça kurtarıyorum) Bir kez ihtiyaç duyduğunuz dosyaların oluşturulmasına ve bitirmenize neden olacaklar. Benim durumumda, kayıtlı bir başlık resim boyutum var. Yüklediğim 20 resimden yaklaşık 1'i aslında başlık içindir. Yani kütüphanemdeki 20 fotoğraftan 19'u yer kaybı.
JpaytonWPD

1

Add_image_size dosyasını yalnızca gerektiğinde tetiklemenin bir yolu var mı?

Tam olarak değil. Ancak, küçük resimler oluşturulmadan hemen önce kayıtlı boyutların listesine filtre uygulayabilirsiniz. Wp_generate_attachment_metadata () işlevi (küçük resimleri oluşturan işlevi çağırır), dosyalar oluşturulmadan hemen önce boyut dizisini değiştirmenize olanak tanıyan "ara_görüntü_boyutları_advanced" adlı bir filtreye sahiptir. Belirli bir "tür" resmi eklediğinizde bu filtreyi kullanabilir ve hemen ardından kaldırabilirsiniz.

Sanırım en büyük zorluğunuz, ekstra boyutlara ihtiyaç duyan görüntülerle ihtiyaç duymayanlar arasında nasıl ayrım yapabileceğinizi bulmak olacaktır.


Örneğin oluşturmak istediğim başparmak seçmek için medya yüklerken bir seçenek veya onay kutusu eklemek gerekir. Kulağa hoş geliyor ama bunu nasıl yapacağımı bilmiyorum
chifliiiii

1

(Ottos değil) "Dynamic Image Resize" 1) eklentimi kullanabilirsiniz.

“Dynamic Image Resize”, TimThumb'a ihtiyaç duymadan, ancak WP çekirdek işlevleriyle “uçuşta” görüntüleri yeniden boyutlandırmak için bir kısa kod ve bir şablon etiketi sunan bir WordPress (MU-) eklentisidir.

Eklenti bir şablon etiketi ve bir kısa kod ile birlikte gelir .

1) Ottos eklentisini yeni öğrendim. Adlandırma çarpışması amaçlanmamıştı.



0

WP Performance Pack eklentisi, Ottos Dynamic Image Resizer tabanlı, ancak birçok iyileştirme içeren "geliştirilmiş görüntü işleme" sunar, örneğin: Her şeyden önce en yeni WordPress Sürümü (3.9.1) ile uyumludur, WP_Image_Editor kullanır, küçük resimlerin kaydedilmesi kapatılabilir (ancak önbelleğe alınabilir ve CDN Desteği yolda), Thumbails Regenerate entegrasyonu (mevcut küçük resimleri silmek için) ve daha fazlası.


-1

Aqua Resizer'ı da deneyebilirsiniz - https://github.com/syamilmj/Aqua-Resizer/

Sadece bir dosya.

Bu şekilde kullanabilirsiniz:

$img_src = aq_resize( $img_src, $width = null, $height = null, $crop = null, $single = true, $upscale = false );

$img_src = aq_resize( $img_src, 150, 150); // resized
$img_src = aq_resize( $img_src, 150, 150, true); // cropped
$img_src = aq_resize( $img_src, 150, 150, null, null, true); // image with 120x120 for example will be upscaled up to 150x150

-1

İşte başka bir yaklaşım: 404 HTTP hata işlemeye kancaları. Yani, küçük resim mevcut olmadığında, orijinal resmi bulun ve küçük resmi oluşturun. Yükleme sırasında küçük resim oluşturmayı engellemediğinden, bunun sorununuzu gerçekten çözmediğini unutmayın.

Bu eklentinin kötü niyetli kullanıcılar tarafından çok sayıda küçük resim oluşturmak ve böylece disk alanınızı tüketmek için kullanılabileceğini de unutmayın.

Not: Bu eklenti Pluginception kullanılarak kolayca kurulabilir .

<?php
/*
Plugin Name: Create thumbnails on demand
Plugin URI: 
Description: Create thumbnails instead of showing 404. Use in combination with "Broken Link Checker" to create all missing thumbnails.
Version: 0.1
Author: Jack Miller
Author URI: 
License: 
License URI: 
*/
add_filter('status_header', 'createThumbIf404');
function createThumbIf404($httpCodeString) //e.g. HTTP/1.1 200 OK 
{
    global $wp_query;
    error_reporting(E_ALL);
    ini_set('display_errors', 1);

    $httpCode = explode(" ", $httpCodeString);
    $httpCode = $httpCode[1];
    if ($httpCode == "404") {
        $requestUri = $_SERVER["REQUEST_URI"];
        $regex = '/^\/(wp-content\/uploads\/(?:[a-zA-Z0-9]*\/){2})(.*)-(.*)x(.*)\.jpg$/';
        preg_match($regex, $requestUri, $groups);
        if (sizeof($groups) === 5) {
            $baseDir  = $groups[1];
            $baseName = $groups[2];
            $sizeX    = $groups[3];
            $sizeY    = $groups[4];

            $oriImg = ctod_checkFile($baseDir, $baseName);
            if ($oriImg != null) {

                $image = wp_get_image_editor($baseDir . $oriImg);
                if (!is_wp_error($image)) {
                    $image->resize($sizeX, $sizeY, true);
                    $thumb = $baseDir . $baseName . '-' . $sizeX . 'x' . $sizeY . '.jpg';
                    $image->save($thumb);
                    ctod_sendImageAndExit($thumb);
                }
            }
        }
    }
}
//finds original image within $baseDir with $baseName.
//Returns file name including extension of original image or null.
function ctod_checkFile($baseDir, $baseName)
{
    $arr = array(
        ".jpg",
        ".JPG",
        ".jpeg",
        ".JPEG"
    );
    foreach ($arr as &$ext) {
        if (file_exists($baseDir . $baseName . $ext)) {
            return $baseName . $ext;
        }
    }
    return null;
}
//Read file at $path from disk and return it as HTTP JPG image request.
function ctod_sendImageAndExit($path)
{
    $fp = fopen($path, 'rb');
    header("Content-Type: image/jpeg");
    header("Content-Length: " . filesize($path));
    fpassthru($fp);
    exit();
}
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.