Jak ustawić maksymalną szerokość oryginalnych obrazów?

11

Przypadek: Mam klienta, który niewiele wie o świecie cyfrowym. Jednak wie, jak przenieść zdjęcia ze swojego aparatu na komputer i WordPress. Jednak nie wie, jak zmniejszyć zdjęcie do normalnego rozmiaru.

Rozwiązanie: Podoba mi się WordPress, aby automatycznie zmniejszać rozmiar zdjęć w tle do maksymalnej szerokości 1024px.

Problem: Chociaż mogę ustawić maksymalną szerokość w ustawieniach, mogę ustawić $ content_width i mogę dodawać nowe rozmiary obrazów za pomocą 'add_image_size'. Oryginalne zdjęcie jest nadal przechowywane w folderze przesyłania w oryginalnym rozmiarze. Oznacza to, że miejsce na dysku twardym łatwo się zapełni.

Pytanie: Co powinienem umieścić w functions.php, aby WordPress mógł zmniejszyć oryginalny obraz (jeśli jest większy niż maksymalna szerokość)?

znak
źródło

Odpowiedzi:

6

Udało mi się to rozwiązać za pomocą następującego kodu:

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

Oryginalny plik miał 3,3 MB po przesłaniu, a duże wymiary ustawione na 2048 x 2048, zajęło tylko 375 KB na serwerze (redukcja około 90%!)

znak
źródło
1
Czy miałbyś coś przeciwko, gdybym użył tego w blogu obok innego kodu w mojej odpowiedzi?
Tom J Nowell
Jeśli uznasz to za przydatne, nie mam nic przeciwko, jaki jest twój blog?
Mark
Moja witryna to tomjn.com, nie napisałem jeszcze tego posta, zrobię to w ciągu następnego tygodnia i opublikuję adres URL, gdy skończę
Tom J Nowell
3

Zmiana rozmiaru jest już wykonana, aby utworzyć duże / średnie / kciuki, ale problemem jest to, że obraz jest zbyt duży, aby zmienić rozmiar, albo z powodu braku pamięci lub czasu.

Więc zmiana rozmiaru nie jest opcją, jeśli nie, nie miałbyś problemu. Zamiast tego spróbuj ograniczyć obrazy, więc jeśli nastąpi przesłanie 20 MB, zostanie odrzucony komunikat z informacją, że należy go zmniejszyć.

Ograniczanie na podstawie obszaru obrazu / megapikseli:

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

Ograniczenia oparte na szerokości lub wysokości:

/wordpress//posts/67110/revisions

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

Ograniczenie według obszaru pozwoliłoby na zmianę rozmiaru wysokich / cienkich lub szerokich / krótkich obrazów, ograniczenie wymiarów może być łatwiejsze do wyjaśnienia

Tom J Nowell
źródło
Cóż, myślałem intensywnie o tym, czego chcę i chcę, aby oryginalny obraz miał ten sam rozmiar, co wymiar ustawiony na rozmiar „dużego” obrazu. Aby to zrobić, myślę, że muszę sprawdzić za pomocą „wp_handle_upload”, co myślisz?
Mark
Ach, więc masz duże / średnie rozmiary, chcesz po prostu zapobiec używaniu oryginału? Myślałem, że masz na myśli, że przesyła masywne obrazy, a ogromna wersja była zawsze używana i nie generowała mniejszych wersji?
Tom J Nowell
1
Ale ten hak brzmi o właściwym miejscu, a nawet wp_handle_upload_prefilterfiltrze używanym w wymienionych powyżej, jakiś kod zmiany rozmiaru PHP zamiast dodania błędu może załatwić sprawę, pod warunkiem, że napiszesz z powrotem do oryginalnego pliku. Konieczne będą jednak testy
Tom J Nowell
Masz rację. Generowane są wszystkie odpowiednie rozmiary. Po prostu nie rozumiem, dlaczego WordPress zachowałby oryginał, gdy wymiary zostały ustawione na stronie Ustawienia. A może wybierz opcję zameldowania z „Zachowaj oryginał”, z której możesz zrezygnować. Tylko moje 2 centy ...
Mark
1
ponieważ musi zapisać plik, aby następnie użyć go do innych rozmiarów i jest potrzebny, jeśli zostaną wprowadzone jakiekolwiek modyfikacje lub regeneracja
Tom J Nowell