Программное получение изображений по URL и сохранение в папке uploads
Я занимаюсь крупной миграцией с другой CMS на WordPress. У нас есть копия базы данных, и мы разобрались, как извлекать контент и программно создавать записи WordPress с помощью экземпляра класса wpdb
.
Однако у нас есть несколько тысяч изображений, которые мы хотели бы автоматически перенести, сгенерировать различные размеры и прикрепить к записям, чтобы сэкономить около недели работы!
Есть ли способ получить изображение с удаленного сайта по URL и сохранить его в папке wp-uploads? Полагаю, для этого используется wp_http
, но я с ним не знаком.
Как только я получу изображение и сохраню его, дальше я справлюсь, так как смогу использовать wp_generate_attachment_metadata
для создания различных размеров и wp_insert_attachment
для прикрепления к записи.
Спасибо, Саймон

На самом деле существует отличная функция, которая сделает все три вещи за вас:
media_sideload_image( $url, $post_id, $description );
Первый аргумент — это удалённый URL изображения, которое вы хотите загрузить. Второй аргумент — это ID записи, к которой вы хотите прикрепить изображение. Третий аргумент необязательный, но если он указан, будет использоваться как описание.
Я бы рекомендовал найти способ регулировать загрузку, чтобы избежать таймаутов, например, ограничивая количество изображений, загружаемых за один раз, и настраивая импортёр на обновление между загрузками, или используя AJAX для асинхронной загрузки по одному изображению за раз.

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

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

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

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

Ответ Джона верен относительно использования 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
