Automatycznie zamień oryginalny przesłany obraz na duży rozmiar obrazu

13

Ponieważ nasi użytkownicy regularnie przesyłają ~ 6 MB zdjęć do wykorzystania w witrynie (i nie są zbytnio zaznajomieni z tym, jak najpierw zmienić ich rozmiar), WordPress przechowuje oryginały, a także zmienia ich rozmiar do kilku różnych rozmiarów.

Chciałbym funkcji lub wtyczki, która pobiera przesłany obraz, zmienia rozmiar na coś łatwiejszego do zarządzania, a następnie zastępuje oryginał.

Widziałem niektóre funkcje, które usuwają oryginał, ale go nie zastępują, co oznacza, że ​​nie można ponownie wygenerować miniaturek w późniejszym terminie. Potrzebuję go wymienić, aby użytkownik mógł przesłać duży obraz, a jego rozmiar jest automatycznie zmniejszany i zapisywany do przyszłej zmiany w razie potrzeby.

Shaun
źródło

Odpowiedzi:

10

Dodaj to do pliku functions.php w folderze motywów. Zastępuje oryginalny obraz dużym obrazem ustawionym w ustawieniach. Możesz jednak ustawić nowy format obrazu i użyć go jako nowego rozmiaru oryginalnego.

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');
Paul Phillips
źródło
1
Jeśli to rozwiązanie zadziała, bardzo przydatne byłoby utworzenie wtyczki.
Alexey,
Właśnie próbowałem tego jeszcze raz, ale najpierw dodałem nowy rozmiar (o nazwie „fullsize”), który miał wymiary 2048 x 1536 (dwa razy tyle, ile potrzebuję), a teraz wszystko działa, oryginalne obrazy są zapisywane tylko dwa razy tak duże, jak ich potrzebuję (które chcę zachować na przyszłość) zamiast wiele razy. Dzięki!
Shaun
Świetne rzeczy, cieszę się, że Ci się udało!
Paul Phillips
Ten kod usunął wszystko z mojego pliku functions.php. Po sprawdzeniu w edytorze WP i na FTP plik był pusty. Musiałem przywrócić plik z kopii zapasowej. :(
jlg
1
@Ciprian Musiałbyś skonfigurować skrypt, aby iterować je wszystkie. Jestem pewien, że istnieje sposób WordPressa na uzyskanie wszystkich informacji o załączniku, ale $ wpdb-> get_col ('SELECT id FROM wp_posts WHERE post_type = "załącznik" ORDER BY id'); będzie działać, aby uzyskać listę identyfikatorów postów dla zdjęć. Może dodaj: AND post_mime_type = "image / jpeg", aby ograniczyć się tylko do plików jpeg. Rzeczywista lokalizacja każdego obrazu jest przechowywana w wp_postmeta.
Paul Phillips
3

W powyższym rozwiązaniu jest jeden paskudny błąd. Rozwiązanie działa jako urok nowych zdjęć, ale w przypadku starych obrazów nigdy nie należy porównywać, $upload_dir['path']ponieważ jest to folder przesyłania bieżącego miesiąca.

Zamień następujące:

//$large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file'];
$large_image_location = $upload_dir['basedir'] . '/'.$image_data['sizes']['large']['path'];
timocouckuyt
źródło
2

Czy mogę zasugerować aktualizację kodu powyższej odpowiedzi? Niestety w nowszych wersjach Wordpress kluczowa „ścieżka” nie jest już dostępna dla rozmiarów plików. Aby więc działał na starszych przesłanych postach, powinniśmy najpierw pobrać bieżący podkatalog z oryginalnego obrazu i użyć go do utworzenia ścieżki lokalizacji dla dużego obrazu.

Więc zamień ten wiersz:

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

przez te 2 linie:

$current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
$large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];
leendertvb
źródło
0

Wysłałem to na inne bardzo podobne pytanie tutaj, ale pomyślałem, że warto je opublikować.

Miałem problemy z powyższym kodem i to, co zadziałało, zasadniczo zmieniło te linie:

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

z:

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

Zamieściłem pełny kod i dodatkowe wyjaśnienia tutaj: Usunąć oryginalny obraz - zachować miniaturę?

Pitchpole
źródło