Як можна встановити максимальну ширину для оригінальних зображень?


11

Випадок: у мене є клієнт, який мало знає про цифровий світ. Однак те, що вона знає, - це як отримати фотографії з камери на комп'ютер та в WordPress. Однак вона не знає, як зменшити розмір фотографії до нормального розміру.

Рішення: Мені подобається, що WordPress автоматично зменшує розмір фотографії у фоновому режимі до максимальної ширини 1024 пікселів.

Проблема: Хоча я можу встановити максимальну ширину в налаштуваннях, я можу встановити $ content_width і можу додати нові розміри зображень за допомогою "add_image_size". Оригінальна фотографія все ще зберігається в папці для завантаження в оригінальному розмірі. Значить, простір жорсткого диска легко заповниться.

Запитання: Що мені потрібно поставити у function.php, щоб WordPress зменшив розмір оригінального зображення (якщо воно більше, ніж максимальна ширина)?

Відповіді:


6

Мені вдалося вирішити це за допомогою наступного коду:

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' );

Оригінальний файл після завантаження був 3,3 Мб, з великими розмірами, встановленими на 2048х2048, на сервері знадобилося лише 375 Кб (зменшення приблизно на 90%!)


1
Не заперечуєте, якби я використовував це в пості на блозі поряд з іншим кодом у своїй відповіді?
Том Дж. Ноуелл

Якщо ви вважаєте це корисним, я не заперечую, який ваш блог?
Марк

Tomjn.com мого сайту, я ще не написав повідомлення, я зроблю це протягом наступного тижня і розміщую URL-адресу тут, коли закінчу
Том Дж. Ноуелл

3

Змінення розміру вже робиться для створення великих / середніх розмірів / великого пальця, але проблема, з якою ви стикаєтесь, полягає в тому, що зображення занадто велике, щоб змінити розмір, або через брак пам'яті або часу.

Тож зміна розміру не є варіантом, якби не його, у вас не було б проблеми. Натомість спробуйте обмежити зображення, тож якщо завантаження 20 Мб трапиться, йому буде відмовлено у повідомленні, що його потрібно зменшити.

Обмеження на основі площі зображення / мегапікселів:

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

Обмеження на основі ширини або висоти:

/wordpress//posts/67110/reitions

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

Обмеження за площею дозволить високим / тонким або широким / коротким зображенням, які можна змінити, а обмеження за розмірами може бути простіше пояснити


Ну, я дуже важко замислювався над тим, що я хочу, і що я хочу, щоб оригінальне зображення набуло того ж розміру, що і розмірність, встановлена ​​на розмір зображення "Великий". Для цього я думаю, що я повинен перевірити 'wp_handle_upload', що ти думаєш?
Марк

Так, у вас є великі / середні розміри, ви просто хочете не допустити використання оригіналу? Я думав, ти маєш на увазі, що вона завантажує величезні зображення, а масова версія завжди застосовується, і не генерувати менші версії?
Tom J Nowell

1
Але цей гачок звучить про потрібне місце, або навіть про wp_handle_upload_prefilterфільтр, який використовується у тих, що я перераховував вище, якийсь код зміни розміру PHP, а не додавання помилки, може зробити трюк до тих пір, поки ви не повернетеся до вихідного файлу. Тестування знадобиться, хоча
Том Дж. Ноуелл

Ви праві. Усі потрібні розміри створюються, я просто не розумію, чому WordPress буде зберігати оригінал, коли параметри були встановлені на сторінці налаштувань. Або, можливо, зробіть параметр реєстрації за допомогою "Зберігати оригінал", який ви можете відмовитися. Тільки мої 2 копійки ...
Марк

1
тому що йому потрібно зберегти файл, щоб потім використовувати його для інших розмірів, і це потрібно, якщо якісь модифікації чи регенерація зроблено
Tom J Nowell
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.