Come ridimensionare dinamicamente l'immagine WordPress al volo (campo personalizzato / opzione tema)


12

Quindi - su richiesta di un cliente, ho bisogno di essere in grado di ridimensionare un'immagine non nel modo standard di WordPress ... ma da un'immagine estratta da un'opzione di tema. Non posso semplicemente utilizzare l'area custom_header, poiché ce ne saranno due o tre (ho anche alcune opzioni una volta caricata l'immagine per consentire all'utente di scegliere come deve funzionare il collegamento (pagina, post, categoria, nessun collegamento, collegamento esterno , eccetera)). Sto usando Opzioni Framework Theme con grande successo e posso recuperare l'immagine src bene, è una questione di se questo può in qualche modo essere usato in combinazione con la funzione add_image_size () normalmente usata per le anteprime dei post. Preferirei davvero non seguire la strada del timpano e rimanere con le API di WordPress (so che è un po 'contraddittorio con quello che sto facendo in primo luogo ...). Qualsiasi aiuto sarebbe molto apprezzato. Grazie!


1
Ok - Penso di aver potuto ottenere questo risultato: <?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 buco nella sicurezza o stranezze qui? Potrebbe essere utile anche per gli altri. Grazie!
Zach,

Dato che il "guid" è il punto in cui è archiviato l'URL dell'immagine (il Framework opzioni utilizza WooThemes Media Uploader per archiviare questi dati come post_type allegato), quindi posso accedere ai dati in quanto tali :)
Zach,


1
Ho appena aggiunto questo per completezza. Non dovrebbe essere chiuso, poiché un'altra soluzione non danneggerà.
Kaiser

1
Ho affrontato questo problema su così tanti siti Web che ho creato. Non sono riuscito a trovare una soluzione che funzioni in modo ottimale, quindi ho creato il mio plugin! Spero che questo possa essere d'aiuto! wordpress.org/plugins/fly-dynamic-image-resizer
Junaid Bhura

Risposte:


6

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

Usa la vt_resizefunzione per ridimensionare dinamicamente le immagini di WordPress situate in un campo personalizzato, immagine in primo piano, directory di upload, plug-in WordPress della galleria NextGen o anche un collegamento esterno a un'immagine esterna.

È molto semplice da usare, basta copiare / incollare il codice qui sotto nel functions.phpfile del tema WordPress del tema WordPress attualmente attivato.

Quindi, ovunque sia necessario ridimensionare un'immagine al volo, è sufficiente effettuare una chiamata a quella funzione seguendo l'utilizzo del parametro spiegato nei commenti della funzione.

Ecco un esempio di come ottenere automaticamente l'ID posta, la posta stessa, i valori del campo personalizzato della posta e il ridimensionamento dinamico dell'immagine dal campo personalizzato contenente l'immagine da ridimensionare dinamicamente al volo.

<?php
// Place this in your functions.php 
function get_postID(){
    global $wp_query;
    $thePostID = $wp_query->post->ID;
}
?>

<?php
// Place the following lines where you want to perform this action.
$postID = get_postID();// Obtain the current Post ID.
$post = get_post($postID);// Takes the current Post ID and returns the database record.
$custom = get_post_custom($post->ID);// Returns a multidimensional array with all custom fields of the Post.
$image = $custom['field-slug'][0];// Specify the array key of the Custom Field containing the image.
// The first parameter is blank. Meaning, we will not be using a Post Attachment.
// The second parameter is the image from our Post's Custom Field value.
// The third and fourth parameters are the width and height of the image after the re-size is performed.
// The fifth parameter means we want to crop this image.
$resizedImage = vt_resize('', $image, 190, 338, true);// Dynamically re-size our image on the fly.
echo '<img src="'.$resizedImage[url].'" width="'.$resizedImage[width].'" height="'.$resizedImage[height].'" title="'.$post->post_title.'" alt="'.$post->post_title.'" />';// The image properties are held in an array. (Use print_r($resizedImage) for array properties.)
?>

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

  • Descrizione: ridimensiona le immagini in modo dinamico 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 formattato originale, visita il link sopra.

<?php
/*
* Resize images dynamically using wp built in functions
* Victor Teixeira
*
* php 5.2+
*
* Exemplo de uso:
*
* <?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
*/
if(!function_exists('vt_resize')){
    function vt_resize($attach_id = null, $img_url = null, $width, $height, $crop = false){
    if($attach_id){
        // this is an attachment, so we have the ID
        $image_src = wp_get_attachment_image_src($attach_id, 'full');
        $file_path = get_attached_file($attach_id);
    } elseif($img_url){
        // this is not an attachment, let's use the image url
        $file_path = parse_url($img_url);
        $file_path = $_SERVER['DOCUMENT_ROOT'].$file_path['path'];
        // Look for Multisite Path
        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);
    // check if file exists
    $base_file = $file_info['dirname'].'/'.$file_info['filename'].'.'.$file_info['extension'];
    if(!file_exists($base_file))
    return;
    $extension = '.'. $file_info['extension'];
    // the image path without the extension
    $no_ext_path = $file_info['dirname'].'/'.$file_info['filename'];
    $cropped_img_path = $no_ext_path.'-'.$width.'x'.$height.$extension;
    // checking if the file size is larger than the target size
    // if it is smaller or the same size, stop right here and return
    if($image_src[1] > $width){
        // the file is larger, check if the resized version already exists (for $crop = true but will also work for $crop = false if the sizes match)
        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 or no height set
        if($crop == false OR !$height){
            // calculate the size proportionaly
            $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;
            // checking if the file already exists
            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;
            }
        }
        // check if image width is smaller than set width
        $img_size = getimagesize($file_path);
        if($img_size[0] <= $width) $width = $img_size[0];
            // Check if GD Library installed
            if(!function_exists('imagecreatetruecolor')){
                echo 'GD Library Error: imagecreatetruecolor does not exist - please contact your webhost and ask them to install the GD library';
                return;
            }
            // no cache files - let's finally resize it
            $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]);
            // resized output
            $vt_image = array(
                'url'   => $new_img,
                'width' => $new_img_size[0],
                'height'    => $new_img_size[1]
            );
            return $vt_image;
        }
        // default output - without resizing
        $vt_image = array(
            'url'   => $image_src[0],
            'width' => $width,
            'height'    => $height
        );
        return $vt_image;
    }
}
?>

Ecco una funzione molto più semplice (nessun supporto multi-sito, ma qualcuno nella loro mente corretta usa multi-sito?) Github.com/BrettMW/img_resize
Developerbmw

Anche una soluzione utilizzabile pronta github.com/bueltge/WP-Image-Resizer , come il link di @kaiser
bueltge,

@bueltge, funziona, ma hai idea del perché le immagini sono sfocate? Sembra che renda tutte le immagini 150x150. Qualche idea sul perché accada?
Ionut

@bueltge, nevermind. Ho trovato il problema. Ho dovuto impostare la dimensione al massimo come secondo parametro quando si utilizzawp_get_attachment_image_url()
Ionut

@bueltge, grattalo. Sembra che non funzioni ... puoi aiutarmi per favore con questo? Quando aggiungo le dimensioni dell'immagine, le fullimmagini hanno dimensioni diverse.
Ionut
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.