Bagaimana cara menghasilkan thumbnail saat dibutuhkan saja?

18

Saya memiliki 1000 gambar. Bagaimana saya bisa membuat wordpress untuk menghasilkan ibu jari hanya jika diperlukan. Misalnya slider rumah hanya akan menggunakan 10 gambar saya tidak ingin 1000 gambar lain memiliki thumbnail yang dihasilkan sebagai pemborosan ruang dan sumber daya.

Ada cara untuk memecat add_image_size hanya saat dibutuhkan?

Terima kasih

UPDATE Seperti yang Anda sebutkan tidak benar-benar add_image_size apa yang perlu dipecat. Apa yang akan hebat adalah memecat ukuran gambar ketika saya menggunakan the_post_thumbnail ('slider-thumb'); Mungkin ini memperlambat tampilan pertama gambar tetapi pandangan itu biasanya dihasilkan oleh saya ketika saya benar-benar meninjau posting jadi saya tidak peduli.

Jadi antara posting saya, slider, thumbnauls blog, thumbnail portofolio dll saya punya 1000 gambar dan saya ingin hanya 10 gambar untuk diubah ukurannya untuk slider saya melihat banyak sumber daya yang terbuang untuk menghasilkan ukuran thumbnail untuk 990 gambar lainnya.

Semoga ini jelas sekarang, maaf untuk bahasa Inggris saya

chifliiiii
sumber
2
Bagaimana thumbnail dihasilkan dari ekstra 990 gambar lebih banyak membuang-buang ruang dan sumber daya daripada 990 gambar yang tidak digunakan di tempat pertama? Bukankah lebih masuk akal untuk hanya mengunggah gambar yang Anda gunakan secara aktif?
SickHippie
Meskipun programmer yang lebih terampil menyajikan argumen yang valid terhadap ide Anda, saya merasa menarik. Saya melihat beberapa plugin dan tema yang mengunggah gambar tanpa menghasilkan jempol (tidak yakin yang mana sekarang). Tapi keraguan besar saya tentang pertanyaan Anda adalah: kapan Anda akan membutuhkannya? . Apa yang akan menjadi filter?
brasofilo
1
Kamu salah paham. Saya menggunakan 990 gambar dalam posting, saya hanya tidak menggunakan slider di rumah. Beberapa dari mereka saya perlu jempol untuk portofolio, beberapa lainnya untuk jempol blog, dll
chifliiiii

Jawaban:

12

Lihatlah plugin Otto's Dynamic Image Resizer

Plugin ini mengubah cara WordPress membuat gambar untuk membuatnya menghasilkan gambar hanya ketika mereka benar-benar digunakan di suatu tempat, dengan cepat. Gambar yang dibuat dengan demikian akan disimpan dalam direktori unggahan normal, untuk pengiriman cepat nanti oleh server web. Hasilnya adalah ruang yang disimpan (karena gambar hanya dibuat bila diperlukan), dan mengunggah gambar jauh lebih cepat (karena tidak menghasilkan gambar saat diunggah lagi).

Chris_O
sumber
2
Perhatikan bahwa plugin itu memiliki masalah dengan menambahkan gambar ke posting lama. Tambalan diterima.
Otto
Itulah tepatnya yang saya cari. Saya akan mencobanya. Jadi itu hanya berfungsi pada posting baru?
chifliiiii
1
Bagi mereka yang menemukan posting ini sekarang, inilah plugin serupa yang tampaknya sedang dikembangkan secara aktif: wordpress.org/plugins/fly-dynamic-image-resizer
Tim Malone
7

Taruh ini di file fungsi tema Anda. Ini akan menghentikan Wordpress dari membuat apa pun selain 3 ukuran default saat mengunggah.

Ketika suatu gambar diminta dalam ukuran tertentu, yang belum dihasilkan, hanya akan dibuat sekali saja.

        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']
            );
        }
Patrick
sumber
Filer ini harus menjadi standar di WordPress. Mengapa menghasilkan setiap ukuran untuk setiap gambar? Saya menambahkan kode ini ke tema khusus saya. Terima kasih
Michaelkay
2
Bagus tapi sekarang masih akan menghasilkan semua gambar jika saya hanya perlu satu ukuran khusus ..
Gijs
Itu terjadi ketika saya menggunakan objek gambar dari bidang kustom lanjutan
Gijs
Tidak berfungsi JIKA add_image_size sebelumnya ditentukan dengan dimensi gambar yang baru saja diubah
Benjamin Intal
@Michaelkay ada penalti kinerja dalam pendekatan ini. Ketika gambar diunggah dan kemudian dihasilkan untuk setiap ukuran, berarti pengunggah adalah orang dengan kesabaran. Kode ini membuat pengunjung Anda harus lebih bersabar, dan Google telah membuktikan situs yang membutuhkan waktu lebih dari 2 detik untuk memuat, menjatuhkan 50% orang. Juga jika situs Anda memiliki ratusan kunjungan bersamaan, ini akan menurunkan server Anda.
Tom Roggero
2

Sayangnya @ Patrick menjawab fungsi istirahat srcset diperkenalkan di WP 4.4. Untungnya, kita hanya perlu menambahkan dua fungsi tambahan!

Pertama, kita perlu memperkenalkan kembali sementara semua ukuran thumbnail yang terdaftar ke metadata gambar sehingga mereka dapat dipertimbangkan:

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

Maka kita perlu menjalankan melalui pertandingan dan menghasilkan thumbnail yang hilang:

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);
Josh
sumber
Hanya kepala-up untuk memberi tahu Anda bahwa ini akan merusak tanam keras! Butuh waktu berjam-jam untuk mengetahui bahwa ini adalah pelakunya. Saya sedang mengerjakan solusi ...
Constantin Groß
1

Sebenarnya, add_image_size()tidak menghasilkan thumbnail, itu hanya mendaftarkan ukuran gambar yang tersedia untuk WordPress.

Biasanya, thumbnail dihasilkan ketika gambar diunggah pertama kali. Ini adalah proses otomatis sehingga Anda tidak perlu khawatir untuk membuatnya nanti. Pikirkan seperti ini - jika diperlukan 1-2s untuk menghasilkan thumbnail pada server lambat, dan Anda menunggu sampai diminta, Anda memaksa penerima diminta untuk menunggu 1-2s tambahan per gambar untuk melihat konten. Jauh lebih mudah untuk melakukan ini sebelumnya - yaitu ketika gambar diunggah.

Pada saat yang sama, jika Anda benar-benar harus memproses thumbnail pada waktu yang berbeda, Anda mungkin ingin melihat plugin Thumbnails Regenerate Thumbnail . Ini menggunakan tindakan sesuai permintaan untuk membuat ulang semua gambar mini gambar Anda ... tetapi Anda bisa menggunakan kode yang sama untuk menghasilkan gambar mini hanya bila diperlukan.

EAMann
sumber
Saya pikir Anda tidak mengerti maksudnya. Dia ingin mengontrol gambar mana yang dibutuhkan thumbnail. Jadi beberapa gambar tidak perlu diubah ukuran sama sekali.
Drunken Master
Kebanyakan orang menguji halaman ketika memasukkan foto (saya merasa cukup menyimpan mengatakan semua) Mereka akan menyebabkan generasi file yang diperlukan sekali dan Anda selesai. Dalam kasus saya, saya memiliki ukuran gambar header terdaftar. Sekitar 1 dari 20 gambar yang saya unggah sebenarnya untuk tajuk. Jadi 19 dari 20 gambar di perpustakaan saya adalah pemborosan ruang.
JpaytonWPD
1

Ada cara untuk memecat add_image_size hanya saat dibutuhkan?

Tidak persis. Tetapi Anda dapat memfilter daftar ukuran terdaftar tepat sebelum thumbnail dibuat. Fungsi wp_generate_attachment_metadata () (yang memanggil fungsi yang menghasilkan thumbnail) memiliki filter yang disebut "intermediate_image_sizes_advanced", yang memungkinkan Anda memanipulasi array ukuran sebelum file dihasilkan. Anda dapat menggunakan filter ini setiap kali Anda menambahkan gambar "jenis" tertentu, dan kemudian menghapusnya segera setelah itu.

Saya kira tantangan terbesar Anda adalah mencari cara membedakan antara gambar yang membutuhkan ukuran ekstra, dan yang tidak.

MathSmath
sumber
saya harus menambahkan opsi atau kotak centang ketika saya mengunggah media untuk memilih jempol yang ingin saya hasilkan misalnya. Kedengarannya bagus tetapi saya tidak tahu bagaimana melakukannya
chifliiiii
1

Anda dapat menggunakan plugin saya (bukan Ottos) "Dynamic Image Resize" 1) .

"Dynamic Image Resize" adalah plugin WordPress (MU-) yang menawarkan kode pendek dan tag templat untuk mengubah ukuran gambar "on the flight" tanpa perlu TimThumb, tetapi dengan fungsi-fungsi inti WP.

Plugin ini dilengkapi dengan tag templat dan kode pendek juga.

1) Baru tahu tentang plugin Ottos. Penamaan tabrakan tidak dimaksudkan.

kaisar
sumber
0

Plugin WP Performance Pack menawarkan "penanganan gambar yang ditingkatkan", yang didasarkan pada Ottos Dynamic Image Resizer, tetapi mencakup banyak perbaikan, misalnya: Pertama-tama itu kompatibel dengan Versi WordPress terbaru (3.9.1), menggunakan WP_Image_Editor, penghematan thumbnail dapat dimatikan (tetapi mereka bisa di-cache dan Dukungan CDN sedang jalan), Regenerasi integrasi Thumbails (untuk menghapus thumbnail yang ada) dan beberapa lagi.

Björn
sumber
-1

Anda juga dapat mencoba Aqua Resizer - https://github.com/syamilmj/Aqua-Resizer/

Itu hanya satu file.

Anda bisa menggunakannya seperti ini:

$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
antongorodezkiy
sumber
-1

Di sini ada pendekatan lain: kaitnya ke penanganan kesalahan HTTP 404. Yaitu, ketika thumbnail tidak tersedia, cari gambar asli dan buat thumbnail. Perhatikan bahwa ini tidak benar-benar menyelesaikan masalah Anda, karena tidak mencegah pembuatan thumbnail selama unggahan.

Perhatikan juga bahwa plugin ini mungkin digunakan oleh pengguna jahat untuk membuat sejumlah thumbnail dan dengan demikian melelahkan ruang disk Anda.

Catatan: Plugin ini dapat dengan mudah diinstal menggunakan Pluginception .

<?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();
}
Jack Miller
sumber