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.

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

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

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.