Come Ridimensionare Dinamicamente le Immagini WordPress Al Volo (campo personalizzato/opzione tema)

29 nov 2011, 19:20:43
Visualizzazioni: 23.3K
Voti: 12

Quindi - su richiesta di un cliente, ho bisogno di poter ridimensionare un'immagine non nel modo standard di WordPress... ma da un'immagine caricata da un'opzione del tema. Non posso semplicemente utilizzare l'area custom_header, poiché ce ne saranno due o tre (Ho anche alcune opzioni una volta che l'immagine viene caricata per permettere all'utente di scegliere come dovrebbe funzionare il link (pagina, articolo, categoria, nessun link, link esterno, ecc)). Sto utilizzando Options Framework Theme con grande successo e posso recuperare il src dell'immagine senza problemi, si tratta di capire se questo può in qualche modo essere utilizzato in combinazione con la funzione add_image_size() normalmente utilizzata per le miniature degli articoli. Preferirei DAVVERO non utilizzare l'approccio timthumb e rimanere con le API di WordPress (So che questo è un po' contraddittorio rispetto a quello che sto facendo in primo luogo...). Qualsiasi aiuto sarebbe molto apprezzato. Grazie!

5
Commenti

Ok - Penso di essere riuscito a realizzare questo:

<?php $main_image = of_get_option('of_main_image'); $thepost = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE guid = '$main_image'" ) ); $theID = $thepost->ID; echo wp_get_attachment_image( $theID, 'homepage_main' ); ?>

Qualcuno vede qualche falla di sicurezza o stranezza qui? Potrebbe essere utile anche per altri. Grazie!

Zach Zach
29 nov 2011 21:36:23

Dato che il 'guid' è dove viene memorizzato l'URL dell'immagine (l'Options Framework utilizza il WooThemes Media Uploader per memorizzare questi dati come post_type di attachment) posso accedere ai dati in questo modo :)

Zach Zach
29 nov 2011 22:34:43

possibile duplicato di Nuova versione della dimensione dell'immagine solo per il file Featured Image

kaiser kaiser
17 lug 2012 18:35:51

L'ho aggiunto per completezza. Non dovrebbe essere chiuso, dato che un'altra soluzione non fa male.

kaiser kaiser
17 lug 2012 18:36:20

Mi sono imbattuto in questo problema su così tanti siti web che ho costruito. Non riuscivo a trovare una soluzione che funzionasse in modo ottimale, quindi ho creato il mio plugin! Spero che questo aiuti! https://wordpress.org/plugins/fly-dynamic-image-resizer/

Junaid Bhura Junaid Bhura
30 set 2015 16:50:26
Tutte le risposte alla domanda 1
7

Ridimensiona le immagini di WordPress al volo utilizzando le funzioni integrate di WordPress.

Utilizza la funzione vt_resize per ridimensionare dinamicamente le immagini di WordPress situate in un campo personalizzato, nell'immagine in evidenza, nella directory degli upload, nel plugin NextGen Gallery per WordPress o anche in un link esterno a un'immagine fuori dal sito.

È molto semplice da usare, basta copiare/incollare il codice qui sotto nel file functions.php del tuo tema WordPress attualmente attivo.

Poi, ovunque tu abbia bisogno di ridimensionare un'immagine al volo, basta inserire una chiamata a quella funzione seguendo i parametri spiegati nei commenti della funzione.

Ecco un esempio di come ottenere automaticamente l'ID del Post, il Post stesso, i valori dei Campi Personalizzati del Post e ridimensionare dinamicamente l'immagine dal Campo Personalizzato che contiene l'immagine da ridimensionare dinamicamente al volo.

<?php

# Inserisci questo nel tuo functions.php
function get_postID() {

    global $wp_query;

    return $wp_query->post->ID;

}

?>

<?php

# Inserisci le seguenti righe dove vuoi eseguire questa azione.
$postID = get_postID(); // Ottieni l'ID del Post corrente.
$post   = get_post( $postID ); // Prende l'ID del Post corrente e restituisce il record del database. (alternativamente, `global $post`)
$custom = get_post_custom( $post->ID ); // Restituisce un array multidimensionale con tutti i campi personalizzati del Post.
$image  = $custom['field-slug'][0]; // Specifica la chiave dell'array del Campo Personalizzato che contiene l'immagine.

# Il primo parametro è 0. Significa che non verrà utilizzato un Allegato del Post.
# Il secondo parametro è l'URL dell'immagine dal valore del Campo Personalizzato del Post.
# Il terzo e il quarto parametro sono la larghezza e l'altezza dell'immagine dopo il ridimensionamento.
# Il quinto parametro significa ritagliare questa immagine.

$resizedImage = vt_resize( 0, $image, 190, 338, true ); // Ridimensiona dinamicamente l'immagine al volo.

echo '<img src="' . $resizedImage[ 'url' ] . '" width="' . $resizedImage[ 'width' ] . '" height="' . $resizedImage[ 'height' ] . '" title="' . $post->post_title . '" alt="' . $post->post_title . '" />'; // Le proprietà dell'immagine sono contenute in un array. (Usa print_r($resizedImage) per le proprietà dell'array.)

?>

Ridimensiona le immagini di WordPress al volo con vt_resize con supporto multi-sito

  • Descrizione: Ridimensiona le immagini dinamicamente utilizzando le funzioni integrate di WordPress.
  • Autore: Victor Teixeira
  • Requisiti: PHP 5.2+, WordPress 3.2+

Ho riformattato il codice sorgente in modo che sia più leggibile per i miei occhi. Se vuoi il codice sorgente originale formattato, visita il link sopra.

<?php

if ( ! function_exists( 'vt_resize' ) ) {

    /**
     * Ridimensiona le immagini dinamicamente utilizzando le funzioni integrate di wp
     * Victor Teixeira
     *
     * php 5.2+
     *
     * Esempio di utilizzo:
     *
     * <?php
     * $thumb = get_post_thumbnail_id();
     * $image = vt_resize($thumb, '', 140, 110, true);
     * ?>
     * <img src="<?php echo $image[url]; ?>" width="<?php echo $image[width]; ?>" height="<?php echo $image[height]; ?>" />
     *
     * @param int    $attach_id
     * @param string $img_url
     * @param int    $width
     * @param int    $height
     * @param bool   $crop
     *
     * @return array|void
     */
    function vt_resize( int $attach_id = 0, string $img_url = '', int $width = 0, int $height = 0, bool $crop = false ) {

        if ( $attach_id ) {

            #  questo è un allegato, quindi abbiamo l'ID
            $image_src = wp_get_attachment_image_src( $attach_id, 'full' );
            $file_path = get_attached_file( $attach_id );

        } elseif ( $img_url ) {

            #  questo non è un allegato, usiamo l'URL dell'immagine
            $file_path = parse_url( $img_url );
            $file_path = $_SERVER['DOCUMENT_ROOT'] . $file_path['path'];

            #  Cerca il percorso Multisito
            if ( file_exists( $file_path ) === false ) {

                global $blog_id;

                $file_path = parse_url( $img_url );

                if ( preg_match( '/files/', $file_path['path'] ) ) {

                    $path = explode( '/', $file_path['path'] );

                    foreach ( $path as $k => $v ) {

                        if ( $v == 'files' ) {
                            $path[ $k - 1 ] = 'wp-content/blogs.dir/' . $blog_id;
                        }

                    }

                    $path = implode( '/', $path );
                }

                $file_path = $_SERVER['DOCUMENT_ROOT'] . $path;

            }

            // $file_path = ltrim( $file_path['path'], '/' );
            // $file_path = rtrim( ABSPATH, '/' ).$file_path['path'];
            $orig_size    = getimagesize( $file_path );
            $image_src[0] = $img_url;
            $image_src[1] = $orig_size[0];
            $image_src[2] = $orig_size[1];

        }

        $file_info = pathinfo( $file_path );

        #  controlla se il file esiste
        $base_file = $file_info['dirname'] . '/' . $file_info['filename'] . '.' . $file_info['extension'];

        if ( ! file_exists( $base_file ) ) {
            return;
        }

        $extension = '.' . $file_info['extension'];

        #  il percorso dell'immagine senza l'estensione
        $no_ext_path      = $file_info['dirname'] . '/' . $file_info['filename'];
        $cropped_img_path = $no_ext_path . '-' . $width . 'x' . $height . $extension;

        #  controlla se la dimensione del file è maggiore della dimensione target
        #  se è più piccola o della stessa dimensione, fermati qui e restituisci
        if ( $image_src[1] > $width ) {

            #  il file è più grande, controlla se esiste già la versione ridimensionata (per $crop = true ma funzionerà anche per $crop = false se le dimensioni corrispondono)
            if ( file_exists( $cropped_img_path ) ) {

                $cropped_img_url = str_replace( basename( $image_src[0] ), basename( $cropped_img_path ), $image_src[0] );

                $vt_image = array(
                    'url'    => $cropped_img_url,
                    'width'  => $width,
                    'height' => $height
                );

                return $vt_image;

            }

            #  $crop = false o altezza non impostata
            if ( $crop == false OR ! $height ) {

                #  calcola la dimensione proporzionalmente
                $proportional_size = wp_constrain_dimensions( $image_src[1], $image_src[2], $width, $height );
                $resized_img_path  = $no_ext_path . '-' . $proportional_size[0] . 'x' . $proportional_size[1] . $extension;

                #  controlla se il file esiste già
                if ( file_exists( $resized_img_path ) ) {

                    $resized_img_url = str_replace( basename( $image_src[0] ), basename( $resized_img_path ), $image_src[0] );

                    $vt_image = array(
                        'url'    => $resized_img_url,
                        'width'  => $proportional_size[0],
                        'height' => $proportional_size[1]
                    );

                    return $vt_image;

                }

            }

            #  controlla se la larghezza dell'immagine è minore della larghezza impostata
            $img_size = getimagesize( $file_path );

            if ( $img_size[0] <= $width ) {
                $width = $img_size[0];
            }

            #  Controlla se la libreria GD è installata
            if ( ! function_exists( 'imagecreatetruecolor' ) ) {

                echo 'Errore libreria GD: imagecreatetruecolor non esiste - contatta il tuo webhost e chiedi di installare la libreria GD';

                return;
            }

            #  nessun file di cache - finalmente ridimensioniamo
            $new_img_path = image_resize( $file_path, $width, $height, $crop );
            $new_img_size = getimagesize( $new_img_path );
            $new_img      = str_replace( basename( $image_src[0] ), basename( $new_img_path ), $image_src[0] );

            #  output ridimensionato
            $vt_image = array(
                'url'    => $new_img,
                'width'  => $new_img_size[0],
                'height' => $new_img_size[1]
            );

            return $vt_image;

        }

        #  output predefinito - senza ridimensionamento
        $vt_image = array(
            'url'    => $image_src[0],
            'width'  => $width,
            'height' => $height
        );

        return $vt_image;
    }

}

?>
13 lug 2012 00:09:58
Commenti

Ecco una funzione molto più semplice (senza supporto multi-sito, ma chi nel suo sano giudizio usa il multi-sito?) https://github.com/BrettMW/img_resize

brettwhiteman brettwhiteman
21 mag 2015 03:08:47

Anche una soluzione pronta all'uso https://github.com/bueltge/WP-Image-Resizer, come il link di @kaiser

bueltge bueltge
1 ott 2015 07:36:17

@bueltge, funziona, ma hai idea del perché le immagini risultano sfocate? Sembra che ridimensioni tutte le immagini a 150x150. Hai idea del motivo per cui succede?

Ionut Necula Ionut Necula
9 mar 2017 12:53:07

@bueltge, lascia perdere. Ho trovato il problema. Dovevo impostare la dimensione su full come secondo parametro quando usavo wp_get_attachment_image_url()

Ionut Necula Ionut Necula
9 mar 2017 12:56:49

@bueltge, cancella tutto. Sembra che non funzioni...potresti aiutarmi con questo? Quando aggiungo la dimensione dell'immagine come full le immagini hanno dimensioni diverse.

Ionut Necula Ionut Necula
9 mar 2017 15:20:36

con il parametro full ottieni sempre la dimensione caricata, la larghezza e l'altezza originale. Dovresti lavorare con una dimensione definita, come custom_full che è definita con larghezza e altezza.

bueltge bueltge
9 mar 2017 15:35:22

È davvero un ottimo esempio di ridimensionamento dell'immagine. Bel lavoro

kuldip Makadiya kuldip Makadiya
2 apr 2020 17:30:19
Mostra i restanti 2 commenti