Bagaimana Anda dapat mengatur lebar maksimum untuk gambar asli?

11

Kasus: Saya punya klien yang tidak tahu banyak tentang dunia digital. Namun yang ia tahu adalah bagaimana cara mendapatkan foto itu dari kameranya ke komputer dan di WordPress. Namun dia tidak tahu cara memperkecil ukuran foto ke ukuran normal.

Solusi: Saya suka WordPress untuk secara otomatis menurunkan ukuran foto-foto di latar belakang menjadi lebar maksimum 1024px.

Masalah: Meskipun saya dapat mengatur lebar maksimum dalam pengaturan, saya dapat mengatur $ content_width dan saya dapat menambahkan ukuran gambar baru dengan 'add_image_size'. Foto asli masih disimpan dalam folder unggah dalam ukuran aslinya. Berarti ruang harddisk akan mudah penuh.

Pertanyaan: Apa yang harus saya masukkan dalam functions.php untuk membiarkan WordPress menurunkan ukuran gambar asli (jika lebih besar maka lebar maksimum)?

Menandai
sumber

Jawaban:

6

Saya dapat menyelesaikannya menggunakan kode berikut:

function my_handle_upload ( $params )
{
    $filePath = $params['file'];

    if ( (!is_wp_error($params)) && file_exists($filePath) && in_array($params['type'], array('image/png','image/gif','image/jpeg')))
    {
        $quality                        = 90;
        list($largeWidth, $largeHeight) = array( get_option( 'large_size_w' ), get_option( 'large_size_h' ) );
        list($oldWidth, $oldHeight)     = getimagesize( $filePath );
        list($newWidth, $newHeight)     = wp_constrain_dimensions( $oldWidth, $oldHeight, $largeWidth, $largeHeight );

        $resizeImageResult = image_resize( $filePath, $newWidth, $newHeight, false, null, null, $quality);

        unlink( $filePath );

        if ( !is_wp_error( $resizeImageResult ) )
        {
            $newFilePath = $resizeImageResult;
            rename( $newFilePath, $filePath );
        }
        else
        {
            $params = wp_handle_upload_error
            (
                $filePath,
                $resizeImageResult->get_error_message() 
            );
        }
    }

    return $params;
}
add_filter( 'wp_handle_upload', 'my_handle_upload' );

File asli adalah 3,3Mb setelah diunggah, dengan dimensi besar diatur ke 2048x2048, hanya butuh 375Kb di server (pengurangan sekitar 90%!)

Menandai
sumber
1
Apakah Anda keberatan jika saya menggunakan ini di posting blog di samping kode lain dalam jawaban saya?
Tom J Nowell
Jika Anda merasa bermanfaat, saya tidak keberatan, apa blog Anda?
Tandai
Situs saya tomjn.com, saya belum menulis posting, saya akan melakukannya minggu depan dan memposting URL di sini ketika saya sudah selesai
Tom J Nowell
3

Mengubah ukuran sudah dilakukan untuk membuat ukuran besar / sedang / ibu jari, tetapi masalah yang Anda hadapi adalah gambar terlalu besar untuk diubah ukurannya, baik karena kurangnya memori atau waktu.

Jadi mengubah ukuran bukanlah pilihan, jika bukan Anda tidak akan memiliki masalah Anda. Alih-alih, coba batasi gambar, jadi jika unggahan 20MB terjadi, ditolak dengan pesan yang menunjukkan bahwa itu perlu dikurangi.

Pembatasan berdasarkan area gambar / megapiksel:

<?php
/**
 * Plugin Name: Deny Giant Image Uploads
 * Description: Prevents Uploads of images greater than 3.2MP
 */

function tomjn_deny_giant_images($file){
    $type = explode('/',$file['type']);

    if($type[0] == 'image'){
        list( $width, $height, $imagetype, $hwstring, $mime, $rgb_r_cmyk, $bit ) = getimagesize( $file['tmp_name'] );
        if($width * $height > 3200728){ // I added 100,000 as sometimes there are more rows/columns than visible pixels depending on the format
            $file['error'] = 'This image is too large, resize it prior to uploading, ideally below 3.2MP or 2048x1536';
        }
    }
    return $file;
}
add_filter('wp_handle_upload_prefilter','tomjn_deny_giant_images');

Pembatasan berdasarkan lebar atau tinggi:

/wordpress//posts/67110/revisi

<?php
/** Plugin Name: (#67107) »kaiser« Restrict file upload */

function wpse67107_restrict_upload( $file )
{
    $file_data = getimagesize( $file );
    // Handle cases where we can't get any info:
    if ( ! $file_data )
        return $file;

    list( $width, $height, $type, $hwstring, $mime, $rgb_r_cmyk, $bit ) = $file_data;

    // Add conditions when to abort
    if ( $width > 2048 )
        $file['error'] = 'Error statement';

    return $file;
}
add_filter( 'wp_handle_upload_prefilter', 'wpse67107_restrict_upload' );

Membatasi berdasarkan area akan memungkinkan gambar tinggi / tipis atau lebar / pendek yang dapat diubah ukurannya, membatasi berdasarkan dimensi mungkin lebih mudah untuk dijelaskan

Tom J Nowell
sumber
Yah saya telah berpikir keras dalam apa yang saya inginkan dan apa yang saya inginkan adalah bahwa gambar asli akan mendapatkan ukuran yang sama dengan dimensi yang diatur ke ukuran gambar 'Besar'. Untuk melakukan itu saya pikir saya harus memeriksa dengan 'wp_handle_upload' bagaimana menurut Anda?
Tandai
Ah jadi Anda memang memiliki ukuran besar / sedang, Anda hanya ingin mencegah yang asli tidak digunakan? Saya pikir maksud Anda dia mengunggah gambar besar dan versi besar selalu digunakan dan tidak menghasilkan versi yang lebih kecil?
Tom J Nowell
1
Tapi kait itu terdengar tentang tempat yang tepat, atau bahkan wp_handle_upload_prefilterfilter yang digunakan dalam yang saya sebutkan di atas, beberapa kode pengubahan ukuran PHP daripada penambahan kesalahan bisa melakukan trik selama Anda menulis kembali ke file asli. Pengujian akan diperlukan meskipun
Tom J Nowell
Anda benar. Semua ukuran yang tepat sedang dihasilkan Saya hanya tidak mengerti mengapa WordPress akan menyimpan yang asli ketika dimensi telah ditetapkan di halaman Pengaturan. Atau mungkin buat opsi check-in dengan "Keep Original" yang bisa Anda pilih. Hanya 2 sen saya ...
Tandai
1
karena itu perlu menyimpan file untuk kemudian menggunakannya untuk ukuran lain, dan diperlukan jika ada modifikasi atau regenerasi
Tom J Nowell