Cara Mengubah Ukuran Secara Dinamis Gambar WordPress On-The-Fly (opsi bidang / tema khusus)

12

Jadi - atas permintaan klien, saya perlu dapat mengubah ukuran gambar bukan cara WordPress standar ... tetapi dari gambar yang ditarik dari opsi tema. Saya tidak bisa begitu saja menggunakan area custom_header, karena akan ada dua atau tiga (Saya juga punya beberapa opsi setelah gambar diunggah untuk memungkinkan pengguna memilih bagaimana fungsi tautan (halaman, posting, kategori, tanpa tautan, tautan eksternal) , dll)). Saya menggunakan Options Framework Theme dengan sangat sukses dan saya dapat mengambil gambar src baik-baik saja, ini masalah jika ini entah bagaimana dapat digunakan dalam kombinasi dengan fungsi add_image_size () yang biasanya digunakan untuk post thumbnail. Saya BENAR-BENAR lebih suka tidak pergi rute timthumb dan tetap dengan WordPress APIs (saya tahu itu sedikit bertentangan dengan apa yang saya lakukan di tempat pertama ...). Bantuan apa pun akan sangat dihargai. Terima kasih!

Zach
sumber
1
Ok - saya pikir saya mungkin telah mencapai ini: <?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' ); ?> Adakah yang melihat lubang keamanan atau keanehan di sini? Mungkin bermanfaat bagi orang lain juga. Terima kasih!
Zach
Karena 'pemandu' adalah tempat URL gambar disimpan (Kerangka Opsi menggunakan Pengunggah Media WooThemes untuk menyimpan data ini sebagai lampiran post_type) maka saya dapat mengakses data tersebut :)
Zach
1
Baru saja menambahkan ini untuk kelengkapan. Tidak boleh ditutup, karena solusi lain tidak akan membahayakan.
kaiser
1
Saya menghadapi masalah ini di banyak situs web yang saya buat. Saya tidak dapat menemukan solusi yang berfungsi secara optimal, jadi saya membuat plugin sendiri! Saya harap ini membantu! wordpress.org/plugins/fly-dynamic-image-resizer
Junaid Bhura

Jawaban:

6

Ubah ukuran gambar WordPress dengan cepat menggunakan fungsi WordPress bawaan.

Gunakan vt_resizefungsi ini untuk mengubah ukuran gambar WordPress secara dinamis yang terletak di bidang khusus, gambar unggulan, direktori unggah, plugin NextGen Gallery WordPress, atau bahkan tautan eksternal ke gambar di luar kantor.

Ini sangat mudah digunakan, cukup salin / tempel kode di bawah ini ke functions.phpfile tema WordPress Anda dari tema WordPress yang saat ini diaktifkan.

Kemudian, di mana pun Anda perlu mengubah ukuran gambar dengan cepat, cukup lakukan panggilan ke fungsi tersebut setelah penggunaan parameter yang dijelaskan dalam komentar fungsi.

Berikut adalah contoh untuk secara otomatis mendapatkan ID Post, Post itu sendiri, nilai-nilai Field Custom dari Post, dan secara dinamis mengubah ukuran gambar dari Custom Field yang berisi gambar untuk secara dinamis diukur ulang on-the-fly.

<?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.)
?>

Ubah ukuran gambar WordPress dengan cepat vt_resize dengan dukungan multi-situs

  • Deskripsi: Mengubah ukuran gambar secara dinamis menggunakan fungsi bawaan WordPress.
  • Penulis: Victor Teixeira
  • Persyaratan: PHP 5.2+, WordPress 3.2+

Saya memformat ulang kode sumber sehingga lebih mudah dibaca oleh mata saya sendiri. Jika Anda ingin kode sumber yang diformat asli, kunjungi tautan di atas.

<?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;
    }
}
?>
Michael Ecklund
sumber
Ini adalah fungsi yang jauh lebih sederhana (tidak ada dukungan multi-situs, tetapi apakah ada orang yang waras menggunakan multi-situs?) Github.com/BrettMW/img_resize
developerbmw
Juga solusi yang siap digunakan github.com/bueltge/WP-Image-Resizer , seperti tautan dari @kaiser
bueltge
@ Bueltge, ini berfungsi, tetapi apakah Anda tahu mengapa gambarnya kabur? Sepertinya itu membuat semua gambar 150x150. Adakah yang tahu mengapa hal itu terjadi?
Ionut
@ Bueltge, tidak apa-apa. Saya menemukan masalahnya. Saya harus mengatur ukuran menjadi penuh sebagai parameter kedua saat menggunakanwp_get_attachment_image_url()
Ionut
@ Bueltge, goreskan itu. Tampaknya tidak berfungsi ... bisakah Anda membantu saya dengan ini? Ketika saya menambahkan ukuran fullgambar sebagai gambar memiliki ukuran yang berbeda.
Ionut