Originalbild löschen - Miniaturansicht behalten?

8

Ich verwende viele Thumbnails, aber niemals die Originaldatei. Um Platz zu sparen, möchte ich verhindern, dass das Original auf der Festplatte gespeichert wird, aber nur eine Miniaturansicht von 100 Pixel behalten. Wie kann ich das machen?

Danke, Dennis

FLX
quelle
1
Könnte es vielleicht eine Idee sein, überhaupt keine großen Bilder hochzuladen?
2
Keine Option, da die Einsendungen Crowd-Sourcing sind :)
FLX
1
Wäre ein Cron-Skript, das die Originale durchläuft und regelmäßig löscht, eine Option?
Joshua
Bitte sehen Sie meine Antwort auf die gleiche Frage wordpress.stackexchange.com/questions/17719/…
Cristian
Wenn Sie bereits einige Bilder haben und diese später entdecken, verwenden Sie diese Erweiterung: wordpress.org/plugins/regenerate-thumbnails. Sie ruft den Haken auf, der in den Antworten von Cristian und SimonSimCity verwendet wird
SimonSimCity

Antworten:

11
add_filter( 'wp_generate_attachment_metadata', 'delete_fullsize_image' );
function delete_fullsize_image( $metadata )
{
    $upload_dir = wp_upload_dir();
    $full_image_path = trailingslashit( $upload_dir['basedir'] ) . $metadata['file'];
    $deleted = unlink( $full_image_path );

    return $metadata;
}
Cristian
quelle
Super, es funktioniert! Das einzige (kleinere) Problem, das ich habe, ist, dass beim Betrachten der Medienbibliothek keine Bilder angezeigt werden, da die vollständigen Bilder (offensichtlich) gelöscht wurden. Gibt es eine Möglichkeit, das Miniaturbild als Medienbibliothekssymbol festzulegen? Beispiel: i.imgur.com/koijq.png (oben verwendet Ihre Methode, unten ist das Original ohne Löschung)
FLX
Wenn Sie eine cmd-Aktualisierung versuchen, fand ich WP klug genug, um eine andere Version zu verwenden. Ich habe diese Methode vor einiger Zeit verwendet, kann mich also nicht erinnern. Ich würde damit herumspielen müssen. Entschuldigung, ich habe jetzt keine direkte Antwort!
Cristian
1
Wenn es nur darum geht, diese riesigen 16 MPix-Bilder zu löschen, die Endbenutzer möglicherweise hochladen, besteht eine andere Version darin, ein etwas kleines Miniaturbild in den vollständigen früheren Namen zu kopieren. Auf diese Weise wird der Speicherplatz immer noch zu 95% gespart, niemand kann auf die vollständigen Speicher zugreifen (da er nicht mehr vorhanden ist), aber die Anzeige der Medienbibliothek funktioniert weiterhin ... (?)
Frank Nocke
4

Ich habe eine andere Lösung im Web gefunden. Es basiert auf dem hier akzeptierten, aber es geht noch weiter.

Der hier akzeptierte entfernt das Hauptbild und fährt fort. Die Lösung, die ich gefunden habe, ersetzt das Originalbild durch das für "groß" erzeugte Bild. Es wird nur ersetzt, wenn diese Bildauflösung nicht definiert ist.

Auf diese Weise wird sichergestellt, dass jedes Skript, das sich auf das Originalbild stützt, weiterhin wie zuvor funktioniert - beispielsweise die Regeneration von Thumnail.

http://www.wprecipes.com/how-to-automatically-use-resized-image-instead-of-originals

BEARBEITEN:

@dalbaeb hat mich auf ein Problem hingewiesen, das in den Kommentaren zum Blog-Beitrag geschrieben wurde. Ich habe den Code basierend auf der API anstelle der dort bereitgestellten Lösung neu geschrieben. Es ist kein so großer Unterschied, sondern nur die gleichen Funktionsaufrufe wie in der API zu verwenden;)

function replace_uploaded_image($image_data) {
    // if there is no large image : return
    if (!isset($image_data['sizes']['large'])) return $image_data;

    // paths to the uploaded image and the large image
    $upload_dir = wp_upload_dir();
    $uploaded_image_location = $upload_dir['basedir'] . '/' .$image_data['file'];
    $large_image_filename = $image_data['sizes']['large']['file'];

    // Do what wordpress does in image_downsize() ... just replace the filenames ;)
    $image_basename = wp_basename($uploaded_image_location);
    $large_image_location = str_replace($image_basename, $large_image_filename, $uploaded_image_location);

    // delete the uploaded image
    unlink($uploaded_image_location);

    // rename the large image
    rename($large_image_location, $uploaded_image_location);

    // update image metadata and return them
    $image_data['width'] = $image_data['sizes']['large']['width'];
    $image_data['height'] = $image_data['sizes']['large']['height'];
    unset($image_data['sizes']['large']);

    // Check if other size-configurations link to the large-file
    foreach($image_data['sizes'] as $size => $sizeData) {
        if ($sizeData['file'] === $large_image_filename)
            unset($image_data['sizes'][$size]);
    }

    return $image_data;
}
add_filter('wp_generate_attachment_metadata', 'replace_uploaded_image');

EDIT2:

Ich hatte ein Problem mit dem Code auf einem Client, auf dem eine andere Größenkonfiguration mit der großen Datei verknüpft war. Ich habe den Code entsprechend aktualisiert. Wenn Sie irgendwelche Probleme damit haben, schreiben Sie mir eine Mail.

SimonSimCity
quelle
Vielen Dank für die Veröffentlichung einer Alternative! Obwohl 1) die Lösung gemäß den Kommentaren nach dem Artikel fehlerhaft zu sein scheint; und 2) es ist immer gut, den Code direkt in der Antwort zu posten, da der verlinkte Artikel immer verschwinden könnte.
Montrealist
2
Danke für den Hinweis, @dalbaeb. Ich habe meinen Kommentar entsprechend aktualisiert.
SimonSimCity
1

Ich habe gerade ein Plugin erstellt, weil ich das gleiche Problem hatte. Sie können es hier herunterladen

Carlos Minatti
quelle
0

Ich weiß, dass dies sehr alt ist, aber ich musste dieses Problem noch lösen. Dies hat möglicherweise für neue Bilder funktioniert, als ich es in functions.php verwendet habe, aber ich hatte einige Probleme und Bilder, die unbrauchbar wurden, und ich konnte dies auch nicht zum Aktualisieren nutzen vorhandene Bilder. Ich hatte ungefähr 2000 vorhandene Bilder, die ich brauchte, um sie alle durchzugehen und alle alten großen Bilder kleiner zu machen. Ich habe im Frontend eine Seite erstellt, auf die nur ein Administrator zugreifen kann, und diesen Code verwendet.

Der große Unterschied besteht darin, dass anstatt das OG-Bild zu löschen und das 'große' Bild in den OG-Namen umzubenennen. (Dies hat bei mir nicht funktioniert, ich habe bei dieser Methode einige Bilder verloren.) Stattdessen habe ich das große Bild kopiert und die Kopie genauso benannt wie das OG-Bild. Daher wird das große Bild durch das kleinere "große" Bild überschrieben. Auch im Frontend musste ich ändern, wie die Metadaten aktualisiert werden.

Testen Sie dies zuerst an einzelnen Posts. Stellen Sie sicher, dass dies für Sie funktioniert, bevor Sie numposts auf -1 ändern. Ich habe dumm ungefähr 100 Bilder verloren, die versucht haben, den Originalcode auszuführen, ohne zuerst die Ergebnisse sorgfältig zu überprüfen.

FRONT END CODE ZUM AKTUALISIEREN BESTEHENDER BILDER:

function replace_uploaded_image_frontend($image_data, $attachment_id) {

 // if there is no large image : return
  if (!isset($image_data['sizes']['large'])) return $image_data;

  // paths to the uploaded image and the large image
  $upload_dir = wp_upload_dir();
  $uploaded_image_location = $upload_dir['basedir'] . '/' .$image_data['file'];
  $current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
  $large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];

  //Original code was delete OG file and rename the large file to the OG name. This means you no longer have the large size image. So...
  //Instead I want to take the large file and make a copy and overwrite it over the large file.
    $file_to_be_copied = $large_image_location;
    $copied_file_name = $uploaded_image_location;
  //make a copy of the large image and name that the title of the original image
    if (!copy($file_to_be_copied, $copied_file_name)) {
        echo "failed to copy $file...\n";
    }  
    fixImageMeta($attachment_id );

}

    function fixImageMeta($attach_id) {

            $file = get_attached_file($attach_id);
            if (!empty($file)) {
                $info = getimagesize($file);
                $meta = array (
                    'width' => $info[0],
                    'height' => $info[1],
                    'hwstring_small' => "height='{$info[1]}' width='{$info[0]}'",
                    'file' => basename($file),
                    'sizes' => array(),         // thumbnails etc.
                    'image_meta' => array(),    // EXIF data
                );
                update_post_meta($attach_id, '_wp_attachment_metadata', $meta);
            }
    }


          $args = array(
        'post_type' => 'exhibitions',
        'p' => 12926,
        'order' => 'DESC',
        /*'date_query'     => array(
            'after' => array(
                'year'  => 2016,
                'month' => 2,
                'day'   => 28,
            ),
            'before' => array(
                'year'  => 2016,
                'month' => 6,
                'day'   => 30,
            ),
        ),*/
        'numberposts' => 1
    );
    $myposts = get_posts($args);
    foreach ($myposts as $mypost){

        $attachment_id = get_post_thumbnail_id( $mypost->ID );
        echo '<br>Attach ID: ' . $attachment_id . ' ';
        $unfiltered = false;
        $image_data = wp_get_attachment_metadata( $attachment_id, $unfiltered );
        print_r($image_data);
        replace_uploaded_image_frontend($image_data, $attachment_id);

    }

Dies ist natürlich mehrmals auf Fehler gestoßen, wie ich mir aufgrund einiger beschädigter Bilder vorstellen kann. Nachdem ich versucht hatte, sie alle auf einmal durchzugehen und Fehler zu erhalten, musste ich einige Zeit damit verbringen, Datumsbereiche durchzugehen, um sicherzugehen, dass ich sie alle aktualisiert habe.

CODE FÜR NEUE BILDER, In functions.php

function replace_uploaded_image($image_data) {
      // if there is no large image : return
  if (!isset($image_data['sizes']['large'])) return $image_data;

  // paths to the uploaded image and the large image
  $upload_dir = wp_upload_dir();
  $uploaded_image_location = $upload_dir['basedir'] . '/' .$image_data['file'];
  $current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
  $large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];

  //Instead I want to take the large file and make a copy and overwrite it over the original file.
    $file_to_be_copied = $large_image_location; 
    $copied_file_name = $uploaded_image_location;
  //make a copy of the large image and name that the title of the original image
    if (!copy($file_to_be_copied, $copied_file_name)) {
        echo "failed to copy $file...\n";
    }

  // update image metadata and return them
  $image_data['width'] = $image_data['sizes']['large']['width'];
  $image_data['height'] = $image_data['sizes']['large']['height'];

  return $image_data;
}
add_filter('wp_generate_attachment_metadata','replace_uploaded_image');
Pitchpole
quelle