web-dev-qa-db-de.com

Wie kann die maximale Breite für Originalbilder eingestellt werden?

Fall: Ich habe einen Kunden, der nicht viel über die digitale Welt weiß. Was sie jedoch weiß, ist, wie sie die Fotos von ihrer Kamera auf den Computer und in WordPress überträgt. Sie weiß jedoch nicht, wie sie die Fotos auf eine normale Größe verkleinern soll.

Lösung: Ich möchte, dass WordPress diese Fotos im Hintergrund automatisch auf eine maximale Breite von 1024px verkleinert.

Problem: Obwohl ich in den Einstellungen die maximale Breite festlegen kann, kann ich mit 'add_image_size' die $ content_width festlegen und neue Bildgrößen hinzufügen. Das Originalfoto befindet sich noch in Originalgröße im Upload-Ordner. Dies bedeutet, dass der Festplattenspeicher leicht voll wird.

Frage: Was soll ich in functions.php einfügen, damit WordPress das Originalbild verkleinert (wenn es größer als die maximale Breite ist)?

11
Mark

Ich konnte es mit dem folgenden Code lösen:

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

Die ursprüngliche Datei hatte nach dem Hochladen eine Größe von 3,3 MB. Bei einer Größe von 2048 x 2048 KB waren nur 375 KB auf dem Server erforderlich (ca. 90% Reduzierung!).

6
Mark

Die Größenänderung wird bereits durchgeführt, um die Größen Groß/Mittel/Daumen zu erstellen. Das Problem, das Sie sehen, ist jedoch, dass das Bild zu groß ist, um die Größe zu ändern, entweder aufgrund von Speichermangel oder Zeitmangel.

Das Ändern der Größe ist also keine Option. Andernfalls hätten Sie Ihr Problem nicht. Versuchen Sie stattdessen, die Bilder einzuschränken. Wenn also ein Upload von 20 MB stattfindet, wird dies mit einer Meldung abgelehnt, die darauf hinweist, dass die Größe verringert werden muss.

Begrenzung basierend auf Bildfläche/Megapixel:

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

Begrenzung basierend auf Breite oder Höhe:

https://wordpress.stackexchange.com/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' );

Die Begrenzung nach Bereich ermöglicht große/dünne oder breite/kurze Bilder, deren Größe geändert werden kann. Die Begrenzung nach Abmessungen ist möglicherweise einfacher zu erklären

3
Tom J Nowell