Come generare miniature solo quando necessario?

26 mag 2012, 00:52:50
Visualizzazioni: 28.3K
Voti: 22

Ho 1000 immagini. Come posso fare in modo che WordPress generi le miniature solo quando necessario? Per esempio, lo slider della home page utilizzerà solo 10 immagini e non voglio che le altre 1000 immagini abbiano quella miniatura generata poiché è uno spreco di spazio e risorse.

C'è un modo per attivare add_image_size solo quando necessario?

Grazie

AGGIORNAMENTO Come avete menzionato, non è realmente add_image_size che deve essere attivato. Quello che sarebbe ottimo è attivare il ridimensionamento dell'immagine quando uso the_post_thumbnail('slider-thumb'); Forse questo rallenterà la prima visualizzazione dell'immagine, ma quella visualizzazione viene solitamente generata da me quando rivedo effettivamente il post, quindi non mi preoccupa.

Quindi tra i miei post, slider, miniature del blog, miniature del portfolio ecc. ho 1000 immagini e voglio che solo 10 immagini vengano ridimensionate per lo slider. Vedo molte risorse sprecate per generare le dimensioni delle miniature per le altre 990 immagini.

Spero sia chiaro ora, scusate per il mio inglese

3
Commenti

Come mai generare miniature dalle altre 990 immagini è uno spreco maggiore di spazio e risorse rispetto a 990 immagini non utilizzate in primo luogo? Non sarebbe più sensato caricare solo le immagini che stai effettivamente utilizzando?

SickHippie SickHippie
26 mag 2012 01:05:41

Anche se programmatori più esperti stanno presentando argomentazioni valide contro la tua idea, la trovo interessante. Ho visto alcuni plugin e temi che caricano immagini senza generare miniature (non ricordo esattamente quali ora). Ma il mio grande dubbio sulla tua domanda è: quando ne avrai effettivamente bisogno?. Quale sarà il filtro?

brasofilo brasofilo
26 mag 2012 01:26:22

Mi hai frainteso. Io uso le 990 immagini nei post, semplicemente non le uso nello slider della homepage. Alcune mi servono come miniature per il portfolio, altre per i thumbnail del blog, ecc.

chifliiiii chifliiiii
26 mag 2012 01:55:53
Tutte le risposte alla domanda 11
3
14

Dai un'occhiata al plugin Dynamic Image Resizer di Otto

Questo plugin modifica il modo in cui WordPress crea le immagini per generarle solo quando vengono effettivamente utilizzate da qualche parte, al volo. Le immagini create in questo modo verranno salvate nelle normali directory di upload, per un successivo invio veloce da parte del server web. Il risultato è che si risparmia spazio (poiché le immagini vengono generate solo quando servono) e il caricamento delle immagini è molto più veloce (dato che non genera più le immagini durante l'upload).

26 mag 2012 02:42:42
Commenti

Nota che quel plugin ha un problema con l'aggiunta di immagini ai post vecchi. Sono benvenute patch e contributi.

Otto Otto
26 mag 2012 05:18:42

È esattamente quello che stavo cercando. Lo proverò. Quindi funziona solo sui nuovi post?

chifliiiii chifliiiii
26 mag 2012 19:04:34

Per chi si imbatte in questo post ora, ecco un plugin simile che sembra essere attivamente sviluppato: https://wordpress.org/plugins/fly-dynamic-image-resizer/

Tim Malone Tim Malone
23 mar 2016 03:08:16
5

Inserisci questo nel file functions.php del tuo tema. Impedirà a WordPress di creare qualsiasi dimensione diversa dalle 3 dimensioni predefinite durante il caricamento.

Quando un'immagine viene poi richiesta in una dimensione specifica, che non è ancora stata generata, verrà creata solo quella volta.

        add_filter('image_downsize', 'ml_media_downsize', 10, 3);
        function ml_media_downsize($out, $id, $size) {
            // Se la dimensione dell'immagine esiste, lascia che WordPress la serva normalmente
            $imagedata = wp_get_attachment_metadata($id);
            if (is_array($imagedata) && isset($imagedata['sizes'][$size]))
                return false;

            // Verifica che la dimensione richiesta esista, altrimenti interrompi
            global $_wp_additional_image_sizes;
            if (!isset($_wp_additional_image_sizes[$size]))
                return false;

            // Crea la nuova miniatura
            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;

            // Salva i metadati dell'immagine, altrimenti WordPress non potrà vedere che la miniatura esiste ora
            $imagedata['sizes'][$size] = $resized;
            wp_update_attachment_metadata($id, $imagedata);

            // Restituisce l'array per visualizzare l'immagine ridimensionata
            $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) {
            // Rimuovere queste impostazioni predefinite potrebbe causare problemi, quindi non lo facciamo
            return array(
                'thumbnail' => $sizes['thumbnail'],
                'medium' => $sizes['medium'],
                'large' => $sizes['large']
            );
        }
28 nov 2013 17:40:30
Commenti

Questo filtro dovrebbe essere standard in WordPress. Perché generare ogni dimensione per ogni immagine? Sto aggiungendo questo codice ai miei temi personalizzati. Grazie

Michaelkay Michaelkay
23 mag 2014 20:19:51

Bello ma ora genererà comunque tutte le immagini se ho bisogno solo di una dimensione personalizzata...

Gijs Gijs
10 gen 2015 21:44:23

Succede quando uso oggetti immagine da Advanced Custom Fields

Gijs Gijs
10 gen 2015 22:26:14

Non funziona SE add_image_size è stato precedentemente definito con le dimensioni dell'immagine appena modificate

Benjamin Intal Benjamin Intal
21 gen 2015 12:19:09

@Michaelkay c'è una penalità nelle prestazioni con questo approccio. Quando le immagini vengono caricate e poi generate per ogni dimensione, significa che è l'utente che le carica ad avere pazienza. Questo codice fa sì che siano i tuoi visitatori ad avere bisogno di più pazienza, e Google ha dimostrato che i siti che impiegano più di 2 secondi a caricare perdono il 50% delle persone. Inoltre, se il tuo sito ha centinaia di visite contemporanee, questo potrebbe mettere in difficoltà i tuoi server.

Tom Roggero Tom Roggero
8 mar 2019 18:01:37
1

Sfortunatamente la risposta di @Patrick interrompe le funzioni srcset introdotte in WP 4.4. Fortunatamente, dobbiamo solo aggiungere due funzioni aggiuntive!

Innanzitutto, dobbiamo temporaneamente reintrodurre tutte le dimensioni delle miniature registrate nei metadati dell'immagine in modo che possano essere considerate:

function bi_wp_calculate_image_srcset_meta($image_meta, $size_array, $image_src, $attachment_id){
    //tutte le dimensioni registrate
    global $_wp_additional_image_sizes;

    //alcune specifiche del file sorgente che useremo spesso
    $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");

    //trova cosa manca
    foreach($_wp_additional_image_sizes AS $k=>$v)
    {
        if(!isset($image_meta['sizes'][$k]))
        {
            //prima, scopriamo come si comporterebbe dimensionalmente
            $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];

            //valori non validi
            if(!$new_h || !$new_w)
                continue;

            //genera un nome file come farebbe WP_Image_Editor
            $new_f = wp_basename("{$src_root}{$src_base}-{$new_w}x{$new_h}." . strtolower($src_ext));

            //finalmente, aggiungilo!
            $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);

Poi dobbiamo scorrere le corrispondenze e generare eventuali miniature mancanti:

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

    //ottieni alcune informazioni sul sorgente
    $src_path = get_attached_file($attachment_id);
    $src_root = trailingslashit(pathinfo($src_path, PATHINFO_DIRNAME));

    //i metadati effettivi dell'immagine (che potrebbero essere modificati qui)
    $src_meta = wp_get_attachment_metadata($attachment_id);

    //un array di dimensioni possibili da cercare
    $sizes = $image_meta['sizes'];
    unset($sizes['thumbnail']);
    unset($sizes['medium']);
    unset($sizes['large']);

    $new = false;

    //scorri le sorgenti
    foreach($sources AS $k=>$v)
    {
        $name = wp_basename($v['url']);
        if(!file_exists("{$src_root}{$name}"))
        {
            //trova la dimensione corrispondente
            foreach($sizes AS $k2=>$v2)
            {
                //abbiamo una corrispondenza!
                if($v2['file'] === $name)
                {
                    //creala
                    if(!$resized = image_make_intermediate_size(
                        $src_path,
                        $v2['width'],
                        $v2['height'],
                        $v2['crop']
                    )){
                        //rimuovi dalle sorgenti in caso di fallimento
                        unset($sources[$k]);
                    }
                    else
                    {
                        //aggiungi la nuova miniatura ai metadati veri
                        $new = true;
                        $src_meta['sizes'][$k2] = $resized;
                    }

                    //rimuovi dall'array delle dimensioni così abbiamo
                    //meno da cercare la prossima volta
                    unset($sizes[$k2]);
                    break;
                }//corrispondenza
            }//ogni dimensione
        }//ogni 404
    }//ogni sorgente

    //se abbiamo generato qualcosa, aggiorna i metadati dell'allegato
    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);
16 apr 2016 08:08:38
Commenti

Solo un avviso per farti sapere che questo interromperà il ritaglio fisso! Mi ci sono volute ore per scoprire che questo era il colpevole. Sto lavorando a una soluzione...

Sarah Groß Sarah Groß
22 feb 2018 09:25:46
2

In realtà, la funzione add_image_size() non genera il thumbnail, si limita a registrare una dimensione di immagine come disponibile in WordPress.

Normalmente, i thumbnail vengono generati quando l'immagine viene caricata per la prima volta. È un processo automatico, quindi non devi preoccuparti di generarli successivamente. Pensa in questo modo - se su un server lento ci vogliono 1-2 secondi per generare un thumbnail e aspetti che venga richiesto, costringi l'utente ad aspettare 1-2 secondi aggiuntivi per ogni immagine per vedere il contenuto. È molto più efficiente farlo in anticipo - cioè quando l'immagine viene caricata.

Allo stesso tempo, se devi assolutamente processare i thumbnail in un momento diverso, potresti dare un'occhiata al plugin Viper's Regenerate Thumbnails. Utilizza un'azione on-demand per rigenerare tutti i thumbnail delle immagini... ma potresti usare un codice simile per generare i thumbnail solo quando necessario.

26 mag 2012 01:07:12
Commenti

Penso che tu non abbia colto il punto. Lui vuole controllare per quali immagini è necessario un thumbnail. Quindi alcune immagini non hanno bisogno di essere ridimensionate affatto.

imrek imrek
21 mar 2015 18:55:30

La maggior parte delle persone testa le pagine quando inseriscono le foto (mi sento abbastanza sicuro nel dire tutti). Ciò causerà la generazione dei file necessari una volta sola e il gioco è fatto. Nel mio caso, ho una dimensione di immagine per l'intestazione registrata. Circa 1 immagine su 20 che carico è effettivamente per l'intestazione. Quindi 19 su 20 immagini nella mia libreria sono uno spreco di spazio.

JpaytonWPD JpaytonWPD
5 dic 2016 02:55:09
1

Esiste un modo per attivare add_image_size solo quando necessario?

Non esattamente. Ma puoi filtrare la lista delle dimensioni registrate appena prima che le miniature vengano generate. La funzione wp_generate_attachment_metadata() (che chiama la funzione che genera le miniature) ha un filtro chiamato "intermediate_image_sizes_advanced", che ti permette di manipolare l'array delle dimensioni proprio prima che i file vengano generati. Potresti usare questo filtro ogni volta che stai aggiungendo un'immagine di un certo "tipo", e poi rimuoverlo immediatamente dopo.

Immagino che la tua sfida più grande sarebbe capire come differenziare tra le immagini che necessitano delle dimensioni extra e quelle che non ne hanno bisogno.

26 mag 2012 01:27:07
Commenti

dovrei aggiungere un'opzione o una casella di controllo quando carico i media per scegliere quali miniature voglio generare, ad esempio. Sembra una buona idea ma non ho idea di come farlo

chifliiiii chifliiiii
26 mag 2012 02:19:07
0

Puoi utilizzare il mio plugin (non quello di Ottos) "Dynamic Image Resize" 1).

"Dynamic Image Resize" è un plugin (MU) per WordPress che offre uno shortcode e un template tag per ridimensionare le immagini "al volo" senza bisogno di TimThumb, ma utilizzando le funzioni core di WordPress.

Il plugin include sia un template tag che uno shortcode.

1) Ho scoperto solo ora il plugin di Otto. La collisione di nomi non era intenzionale.

29 giu 2013 14:03:01
0

Puoi provare questo plugin: https://wordpress.org/plugins/optimize-images-resizing

Ridimensiona le immagini in base alle dimensioni registrate, ma solo quando necessario. Inoltre può ripulire le dimensioni esistenti delle immagini in modo che possano essere rigenerate.

30 lug 2015 03:27:09
0

Il plugin WP Performance Pack offre una "gestione avanzata delle immagini", basata su Ottos Dynamic Image Resizer, ma include numerosi miglioramenti, ad esempio: Innanzitutto è compatibile con l'ultima versione di WordPress (3.9.1), utilizza WP_Image_Editor, è possibile disattivare il salvataggio delle miniature (ma possono essere memorizzate nella cache e il supporto per CDN è in arrivo), integrazione con Regenerate Thumbnails (per eliminare le miniature esistenti) e molto altro ancora.

14 mag 2014 13:02:21
1

Ecco un altro approccio: si aggancia alla gestione degli errori HTTP 404. Cioè, quando una miniatura non è disponibile, trova l'immagine originale e crea la miniatura. Nota che questo non risolve realmente il tuo problema, poiché non impedisce la generazione delle miniature durante il caricamento.

Nota anche che questo plugin potrebbe essere utilizzato da utenti malintenzionati per creare un numero qualsiasi di miniature e quindi esaurire lo spazio sul disco.

Nota: Questo plugin può essere facilmente installato utilizzando Pluginception.

<?php
/*
Plugin Name: Crea miniature su richiesta
Plugin URI: 
Description: Crea miniature invece di mostrare errori 404. Utilizza in combinazione con "Broken Link Checker" per creare tutte le miniature mancanti.
Version: 0.1
Author: Jack Miller
Author URI: 
License: 
License URI: 
*/
add_filter('status_header', 'createThumbIf404');
function createThumbIf404($httpCodeString) //es. 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);
                }
            }
        }
    }
}
//Trova l'immagine originale all'interno di $baseDir con $baseName.
//Restituisce il nome del file, inclusa l'estensione dell'immagine originale o 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;
}
//Legge il file in $path dal disco e lo restituisce come richiesta HTTP di immagine JPG.
function ctod_sendImageAndExit($path)
{
    $fp = fopen($path, 'rb');
    header("Content-Type: image/jpeg");
    header("Content-Length: " . filesize($path));
    fpassthru($fp);
    exit();
}
22 mag 2016 08:16:30
Commenti

Mi piace questa soluzione. L'hai mai adattata per includere più tipi di immagini?

kalligator kalligator
8 mag 2021 13:53:14
0

In altri luoghi tutte le dimensioni create funzioneranno, ma solo nel caricamento dei media, se vuoi caricare una dimensione specifica, di seguito è riportato il codice per farlo. Ecco il link per maggiori dettagli - https://developer.wordpress.org/reference/hooks/wp_handle_upload_prefilter/

add_filter('wp_handle_upload_prefilter', 'custom_upload_filter' );
 
function custom_upload_filter( $file ) {
   foreach ( get_intermediate_image_sizes() as $size ) {
        if ( !in_array( $size, array( 'thumbnail', 'medium', 'medium_large', 'large' ) ) ) {
            remove_image_size( $size );
        }
    }
    return $file;
}
8 dic 2020 13:11:21
0
-1

Puoi provare anche Aqua Resizer - https://github.com/syamilmj/Aqua-Resizer/

È composto da un solo file.

Puoi usarlo in questo modo:

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

$img_src = aq_resize( $img_src, 150, 150); // ridimensionato
$img_src = aq_resize( $img_src, 150, 150, true); // ritagliato
$img_src = aq_resize( $img_src, 150, 150, null, null, true); // un'immagine di 120x120 per esempio verrà scalata fino a 150x150
17 mar 2014 13:30:52