Программное получение изображений по URL и сохранение в папке uploads

18 мар. 2011 г., 16:41:39
Просмотры: 15.9K
Голосов: 18

Я занимаюсь крупной миграцией с другой CMS на WordPress. У нас есть копия базы данных, и мы разобрались, как извлекать контент и программно создавать записи WordPress с помощью экземпляра класса wpdb.

Однако у нас есть несколько тысяч изображений, которые мы хотели бы автоматически перенести, сгенерировать различные размеры и прикрепить к записям, чтобы сэкономить около недели работы!

Есть ли способ получить изображение с удаленного сайта по URL и сохранить его в папке wp-uploads? Полагаю, для этого используется wp_http, но я с ним не знаком.

Как только я получу изображение и сохраню его, дальше я справлюсь, так как смогу использовать wp_generate_attachment_metadata для создания различных размеров и wp_insert_attachment для прикрепления к записи.

Спасибо, Саймон

0
Все ответы на вопрос 2
4
35

На самом деле существует отличная функция, которая сделает все три вещи за вас:

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

Первый аргумент — это удалённый URL изображения, которое вы хотите загрузить. Второй аргумент — это ID записи, к которой вы хотите прикрепить изображение. Третий аргумент необязательный, но если он указан, будет использоваться как описание.

Я бы рекомендовал найти способ регулировать загрузку, чтобы избежать таймаутов, например, ограничивая количество изображений, загружаемых за один раз, и настраивая импортёр на обновление между загрузками, или используя AJAX для асинхронной загрузки по одному изображению за раз.

18 мар. 2011 г. 16:56:41
Комментарии

Это просто потрясающе, Джон, огромное спасибо - всё работает идеально. Ограничение скорости не проблема, так как я настроил ожидание нажатия клавиши после каждого импорта записи, чтобы у нас была возможность вручную проверить детали и отметить проблемные.

Simon Blackbourn Simon Blackbourn
18 мар. 2011 г. 17:28:43

Просто потому что мне нужен был ID вложения для связи с другой записью, вот хороший способ сделать это

axel axel
15 сент. 2014 г. 12:18:16

Это отлично работает, но можем ли мы сделать то же самое с файлом, не являющимся изображением. Например, с PDF. Если я пытаюсь запустить ту же функцию с PDF, я получаю такую ошибку: array(1) { ["image_sideload_failed"]=> array(1) { [0]=> string(18) "Invalid image URL." } }

Marcello Perri Marcello Perri
12 июн. 2023 г. 16:45:31

@MarcelloPerri самый быстрый способ сделать это — добавить нужные расширения файлов в фильтр функции sideload перед её запуском: add_filter( 'image_sideload_extensions', fn( $exts ) => array_merge( $exts, [ 'pdf' ] ) );. Насколько я могу судить, в самой функции нет ничего, что требовало бы, чтобы файлы были именно изображениями.

John P Bloch John P Bloch
13 июн. 2023 г. 00:43:53
0

Ответ Джона верен относительно использования media_sideload_image, просто учтите, что вам может потребоваться подключить эти скрипты заранее, если вы не выполняете это в контексте админ-панели WordPress:

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

Смотрите https://codex.wordpress.org/Function_Reference/media_sideload_image#Notes

24 авг. 2016 г. 11:47:37