Wie können Sie die maximale Breite für Originalbilder festlegen?

11

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

Lösung: Ich mag es, wenn WordPress diese Fotos im Hintergrund automatisch auf eine maximale Breite von 1024 Pixel verkleinert.

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

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

Kennzeichen
quelle

Antworten:

6

Ich konnte es mit folgendem 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 war nach dem Hochladen 3,3 MB groß. Die großen Abmessungen waren auf 2048 x 2048 eingestellt. Auf dem Server wurden nur 375 KB benötigt (ca. 90% Reduzierung!).

Kennzeichen
quelle
1
Würde es Ihnen etwas ausmachen, wenn ich dies in einem Blogpost neben dem anderen Code in meiner Antwort verwenden würde?
Tom J Nowell
Wenn Sie es nützlich finden, macht es mir nichts aus, was ist Ihr Blog?
Mark
Meine Website ist tomjn.com. Ich habe den Beitrag noch nicht geschrieben. Ich werde dies in der nächsten Woche tun und die URL hier veröffentlichen, wenn ich fertig bin
Tom J Nowell
3

Die Größenänderung wurde bereits durchgeführt, um die Größen groß / mittel / daumen zu erstellen. Das Problem besteht jedoch darin, dass das Bild zu groß ist, um die Größe zu ändern, entweder aufgrund von Speichermangel oder Zeitmangel.

Eine Größenänderung ist also keine Option, wenn dies nicht der Fall wäre, hätten Sie Ihr Problem nicht. Versuchen Sie stattdessen, die Anzahl der Bilder einzuschränken. Wenn also ein Upload von 20 MB erfolgt, wird eine Meldung abgelehnt, die angibt, dass die Größe verkleinert werden muss.

Begrenzung basierend auf Bildfläche / Megapixeln:

<?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:

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

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

Tom J Nowell
quelle
Nun, ich habe mir überlegt, was ich will und was ich will, ist, dass das Originalbild die gleiche Größe erhält wie die Dimension, die auf die "große" Bildgröße eingestellt ist. Um das zu tun, muss ich wohl mit 'wp_handle_upload' nachsehen, was denkst du?
Mark
Ah, Sie haben also große / mittlere Größen, Sie möchten nur verhindern, dass das Original verwendet wird? Ich dachte, Sie meinten, sie würde massive Bilder hochladen und die massive Version wurde immer verwendet und es wurden keine kleineren Versionen generiert?
Tom J Nowell
1
Aber dieser Hook klingt nach der richtigen Stelle oder sogar nach dem wp_handle_upload_prefilterFilter, der in den oben aufgeführten verwendet wird. Ein PHP-Größenänderungscode anstelle des Hinzufügens eines Fehlers könnte den Trick tun, solange Sie in die Originaldatei zurückschreiben. Tests sind jedoch erforderlich
Tom J Nowell
Du hast Recht. Es werden alle richtigen Größen generiert. Ich verstehe nur nicht, warum WordPress das Original beibehalten würde, wenn die Abmessungen auf der Seite "Einstellungen" festgelegt wurden. Oder machen Sie eine Check-in-Option mit "Original behalten", die Sie deaktivieren können. Nur meine 2 Cent ...
Mark
1
weil es die Datei speichern muss, um sie dann für die anderen Größen zu verwenden, und es ist erforderlich, wenn Änderungen vorgenommen oder neu generiert werden
Tom J Nowell