Ersetzen Sie das ursprünglich hochgeladene Bild automatisch durch ein großes Bild


13

Da unsere Benutzer regelmäßig ca. 6 MB Bilder hochladen, um sie auf der Website zu verwenden (und nicht so gut damit vertraut sind, wie sie zuerst ihre Größe ändern), speichert WordPress die Originale und ändert ihre Größe auf verschiedene Größen.

Ich hätte gerne eine Funktion oder ein Plugin, das das hochgeladene Bild auf eine verwaltbare Größe verkleinert und dann das Original ersetzt.

Ich habe einige Funktionen gesehen, die das Original löschen, aber nicht ersetzen. Das bedeutet, dass es unmöglich ist, die Miniaturansichten zu einem späteren Zeitpunkt neu zu generieren. Ich muss dieses ersetzen, damit der Benutzer ein großes Bild hochladen kann und es automatisch verkleinert und für zukünftige Größenänderungen gespeichert wird, falls erforderlich.

Antworten:


10

Fügen Sie dies der Datei functions.php im Theme-Ordner hinzu. Es ersetzt das Originalbild durch das in den Einstellungen festgelegte große Bild. Möglicherweise möchten Sie ein neues Bildformat einrichten und dieses als neue Originalgröße 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_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file']; // ** This only works for new image uploads - fixed for older images below.
  $current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
  $large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];

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

  return $image_data;
}

add_filter('wp_generate_attachment_metadata','replace_uploaded_image');

1
Wenn diese Lösung funktioniert, wäre es sehr nützlich, ein Plugin zu erstellen.
Alexey

Ich habe es gerade noch einmal versucht, aber zuerst habe ich eine neue Größe hinzugefügt (genannt "Vollbild"), die 2048x1536 (doppelt so groß wie ich es brauche) und jetzt funktioniert alles, die Originalbilder werden doppelt so gespeichert groß wie ich sie brauche (was ich für die Zukunft behalten möchte), anstatt oft. Vielen Dank!
Shaun

Tolles Zeug, ich bin froh, dass es für dich geklappt hat!
Paul Phillips

Dieser Code hat alles aus meiner functions.php-Datei gelöscht. Ich habe im WP-Editor und in FTP nachgesehen und die Datei war leer. Musste die Datei von einem Backup wiederherstellen. :(
jlg

1
@ Ciprian Sie müssten ein Skript einrichten, um sie alle durchlaufen zu können. Ich bin sicher, dass es eine WordPress-Methode gibt, mit der alle Anhangsinformationen abgerufen werden können, außer $ wpdb-> get_col ('SELECT id FROM wp_posts WHERE post_type = "attachment" ORDER BY id'); würde funktionieren, um eine Liste der Beitrags-IDs für die Bilder zu erhalten. Fügen Sie möglicherweise Folgendes hinzu: AND post_mime_type = "image / jpeg", um die Beschränkung auf nur jpegs vorzunehmen. Die tatsächliche Position jedes Bildes befindet sich in wp_postmeta.
Paul Phillips

3

Es gibt einen bösen Fehler in der obigen Lösung. Die Lösung wirkt wie ein Zauber für neue Bilder, aber für alte Bilder sollten Sie niemals einen Vergleich anstellen, $upload_dir['path']da dies der aktuelle Upload-Ordner des aktuellen Monats ist.

Ersetzen Sie Folgendes:

//$large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file'];
$large_image_location = $upload_dir['basedir'] . '/'.$image_data['sizes']['large']['path'];

2

Darf ich eine Aktualisierung des Codes der obigen Antwort vorschlagen? Leider wird in neueren Versionen von Wordpress der Schlüssel "Pfad" für die Dateigrößen nicht mehr bereitgestellt. Damit dies bei älteren Post-Uploads funktioniert, sollten wir zuerst das aktuelle Unterverzeichnis aus dem Originalbild abrufen und daraus den Pfad für das große Bild erstellen.

Also ersetzen Sie diese Zeile:

$large_image_location = $upload_dir['basedir'] . '/'.$image_data['sizes']['large']['path'];

durch diese 2 Zeilen:

$current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
$large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];

0

Ich habe dies hier auf einer anderen, sehr ähnlichen Frage gepostet, aber es lohnt sich, es erneut zu posten.

Ich hatte Probleme mit dem obigen Code und das, was für mich funktionierte, änderte im Wesentlichen diese Zeilen:

unlink($uploaded_image_location);
rename($large_image_location, $uploaded_image_location);

mit:

    $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";
    }

Ich habe meinen vollständigen Code und weitere Erklärungen hier gepostet: Originalbild löschen - Thumbnail behalten?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.