Programowo pobierz obrazy według adresu URL i zapisz w folderze przesyłania

14

Jestem zaangażowany w dużą migrację z innego CMS do WordPress. Mamy kopię bazy danych i opracowaliśmy sposób wyodrębnienia zawartości i programowego tworzenia z niej postów WordPress przy użyciu instancji wpdbklasy.

Istnieje jednak kilka tysięcy zdjęć, które chcielibyśmy automatycznie przeciągnąć, wygenerować różne rozmiary, a następnie dołączyć do postów, aby zaoszczędzić około tygodnia pracy!

Czy istnieje sposób, aby uzyskać obraz ze zdalnej witryny za pomocą adresu URL i zapisać go w folderze wp-uploads? Myślę, że to wykorzystuje, wp_httpale nie jestem z tym zaznajomiony.

Po uzyskaniu obrazu i zapisaniu go jestem w porządku, ponieważ mogę go użyć wp_generate_attachment_metadatado tworzenia różnych rozmiarów i wp_insert_attachmentdołączania go do postu.

Dzięki Simon

Simon Blackbourn
źródło

Odpowiedzi:

29

Jest naprawdę świetna funkcja, która zrobi dla ciebie wszystkie trzy z tych rzeczy:

media_sideload_image( $url, $post_id, $description );

Pierwszym argumentem jest zdalny adres URL obrazu, który chcesz pobrać. Drugi argument to identyfikator posta, do którego chcesz dołączyć obraz. Trzeci argument jest opcjonalny, ale będzie opisem, jeśli zostanie uwzględniony.

Sugeruję znalezienie sposobu na ograniczenie pobrań, aby nie przekraczać limitu czasu, na przykład ograniczenie liczby obrazów pobieranych na obciążenie i ustawienie importera, aby odświeżył się między pobraniami lub użycie AJAX do zrobienia jednego z nich naraz asynchronicznie.

John P. Bloch
źródło
1
to absolutnie fantastyczny John, dziękuję bardzo - działa idealnie. ograniczanie przepustowości nie stanowi problemu, ponieważ ustawiłem go tak, aby czekał na naciśnięcie klawisza po każdym imporcie postu, aby umożliwić nam ręczne sprawdzenie szczegółów i odnotowanie problemów.
Simon Blackbourn
1
tylko dlatego, że potrzebowałem połączyć identyfikator załącznika z innym postem, oto dobry sposób na to
axel
3

Odpowiedź Johna jest poprawna ponownie: używając media_sideload_image, pamiętaj, że może być konieczne wymaganie tych skryptów wcześniej, jeśli nie robisz tego w kontekście Administratora WP:

require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');

Zobacz https://codex.wordpress.org/Function_Reference/media_sideload_image#Notes

bryceadams
źródło