Aggiungi dimensione immagine se modello di pagina


13

Sto costruendo un sito Web per i membri con WordPress Multisite. È possibile limitare il numero di immagini generate in base al modello selezionato?

Ho provato le seguenti righe di codice per generare alcune immagini sul modello della galleria:

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

Questo non ha funzionato Ho fatto qualche ricerca e non riesco a trovare nulla sull'argomento. Se potessi indicarmi la giusta direzione, lo apprezzerei davvero.


1
C'è anche il Dynamic Image Resizer di Otto che ti consente di definire tutte le dimensioni dell'immagine che desideri, ma genera un'immagine a una dimensione particolare solo quando è necessario. Quindi, per il tuo esempio, le miniature della galleria verrebbero generate solo per le immagini che compaiono sul modello page-gallery.php.
helgatheviking

2
Voglio solo menzionare altre due grandi opzioni: il Dynamic Image Resize di @ kaiser e il servizio Photon in JetPack.
birgire

Risposte:


13

Questo è sempre stato un bugbear per me - la mancanza di dimensionamento delle immagini su richiesta e il successivo numero di file che puoi ottenere se hai molte dimensioni!

Riesco a vedere la logica dietro i tuoi sforzi: il problema è add_image_sizeche entra in gioco solo al momento del caricamento. Come tale, lo is_page_template(..)sarà sempre false.

Un rapido google ha scavato Aqua Resizer , uno script progettato per affrontare questo problema. Invece di usarlo add_image_size, lo usi aq_resizedirettamente nel tuo tema e, se non esiste una dimensione per l'immagine, viene creata e memorizzata nella cache al volo.

In effetti ho usato una tecnica simile, sebbene diversa, su diversi siti con molte dimensioni di immagine. Risparmia ancora il sovraccarico di WordPress generando ogni dimensione per ogni immagine caricata: vengono generati al volo (e memorizzati nella cache) come e quando vengono richiesti. Dove differisce, è che puoi semplicemente utilizzare tutte le funzioni di immagine standard e i tag modello di WP come faresti normalmente!

Inoltre, come accennato da @Waqas, l'utilizzo di Aqua Resizer lascerà i file orfani quando si elimina un'immagine dalla libreria multimediale. Con la mia tecnica, tutti i file verranno eliminati, poiché vengono salvati nel database e riconosciuti da WordPress.

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

E in pratica:

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!

Ho intenzione di trasformarlo in un plugin che convertirà automaticamente tutte le add_image_sizechiamate in ridimensionamento su richiesta, quindi guarda questo spazio!


Grazie per aver dedicato del tempo a lasciare una risposta così grande. Ci proverò sicuramente. È importante che lo ottenga subito prima di aprire il mio server a più utenti. Ti darò un grido se ho ulteriori domande.
Sam

2
Ho provato questo con the_post_thumbnail (); e funziona perfettamente. Un problema: quando cancello l'immagine, lascia dietro di sé quella che è stata ridimensionata dal tuo script. Qualche idea?
Sam,

5

3

Se vuoi creare il pollice al volo puoi usare Aqua Image Resizer , ma c'è un inconveniente di questo mini script. I pollici creati non verranno eliminati dopo aver eliminato l'immagine dalla libreria. Ma non è un grosso problema. Se necessario, è possibile farlo tramite i comandi SHH


1
Un buon punto per non cancellare i file. La mia soluzione non ne soffrirà! (vedi risposta aggiornata).
TheDeadMedic

1

Non è una risposta diretta per il tuo problema. Ma ti aiuterò a creare un'immagine in base alle tue necessità.

Quando usi add_image_size non ridimensiona le immagini esistenti. funziona solo per le nuove immagini che verranno caricate dopo aver aggiunto la funzione add_image_size.

Quindi il tuo codice non genererà nuove immagini per la funzione is_page_template.

Ma puoi usare una semplice classe php per risolvere il tuo problema .... è una famosa classe php che viene utilizzata per molti temi premium disponibili per WordPress. Si chiama Aqua-Resizer.

Puoi trovare maggiori dettagli qui https://github.com/syamilmj/Aqua-Resizer Wiki: https://github.com/syamilmj/Aqua-Resizer/wiki

Problema che può sorgere:

Questa funzione funziona in questo modo ....

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

Pertanto, quando non è possibile ritagliare (per un'immagine piccola definita in altezza o larghezza) non viene visualizzato nulla. Puoi superare questa situazione verificando se stai ottenendo un valore nullo dopo aver passato l'URL all'interno di questa funzione molto facilmente come il mio qui ....

<?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'; } 
?>

In questo modo puoi assicurarti che l'immagine specifica verrà generata per un modello di pagina specifico e in questo modo il tuo sito web sarà molto più pulito.

PS: questa classe php utilizza il sistema di ritaglio core di WordPress, quindi non ci sono problemi di sicurezza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.