
🔧 WP All Import: как собрать все изображения записи в одну галерею
Импортировали сотню записей через WP All Import, а картинки рассыпались по контенту как попало: где-то растянуты на всю ширину, где-то жмутся к тексту, а где-то висят битыми ссылками. Перебирать каждую запись руками, потеря вечера.
Способ собрать всё в одну галерею есть. Причём автоматически, без ручной правки контента. Метод работает и для свежих импортов, и для записей, загруженных месяц назад. Ниже, два подхода: лёгкий (на лету, через хук pmxi_gallery_image) и постфактум (групповым обновлением). Оба проверены на WP All Import 4.9+.
💡 Быстрый обзор:
- Готовим CSV или XML: ссылки на изображения полными URL, по одной на строку
- В шаблоне импорта настраиваем секцию Images и указываем поле с изображениями
- Добавляем хук
pmxi_gallery_imageвfunctions.php, галерея собирается сама при импорте - Для старых записей: функция замены
<img>на галерейный шорткод и групповое обновление
Как подготовить изображения для импорта
До запуска импорта ссылки на картинки должны быть в правильном формате. WP All Import скачивает изображения, только если URL полный, прямой и ведёт на файл, а не на HTML-страницу.
Допустим, на старом сайте галерея выглядит так:
1 <a href="/cache/images/photo1.jpg" data-lightbox="group:1" title="Photo 1"> 2 <img src="/cache/images/photo1_thumb.jpg" alt="Photo 1"> 3 </a> 4 <a href="/cache/images/photo2.jpg" data-lightbox="group:1" title="Photo 2"> 5 <img src="/cache/images/photo2_thumb.jpg" alt="Photo 2"> 6 </a>
После парсинга в CSV-файле для импорта ссылки должны стать полными URL, по одной на строку, без HTML-обёртки:
1 http://newsite.com/files/photo1.jpg 2 http://newsite.com/files/photo2.jpg
Где http://newsite.com, домен сайта, на который идёт импорт. Критично: если ссылки относительные или ведут на старый домен, WP All Import не подхватит файлы и не загрузит их в медиатеку.
Сами ссылки в теле записи должны совпадать один к одному с теми, что вы подаёте на загрузку плагину. Иначе после импорта часть <img>-тегов останется со старыми URL и не попадёт в галерею.
Настройка шаблона импорта в WP All Import
В интерфейсе плагина переходим к шаблону импорта. Главная секция здесь, Images. Выглядит она так:

В секции Images укажите поле, которое содержит ссылки на изображения. Обычно это отдельная ячейка CSV (например, gallery_images), где ссылки перечислены через разделитель, по умолчанию |:
1 http://newsite.com/files/photo1.jpg | http://newsite.com/files/photo2.jpg | http://newsite.com/files/photo3.jpg
WP All Import распарсит строку, скачает каждое изображение и добавит в медиатеку WordPress. Но картинки пока просто прикреплены к записи как вложения. Галерею соберём отдельно.
Обязательно проверьте, как плагин обрабатывает загрузку. Нажмите Preview & Test, затем Run Test. Зелёная галочка рядом с количеством изображений, всё настроено верно. Красный крест, проверьте URL: они должны быть полными и прямыми.
Перед запуском импорта загрузите файлы картинок в папку files в корне сайта, если плагин берёт изображения с сервера, а не из внешних URL.
Как собрать галерею на лету: хук pmxi_gallery_image
Самый чистый способ, собирать галерею прямо во время импорта. WP All Import предоставляет хук pmxi_gallery_image, который срабатывает для каждого загруженного изображения. Вы перехватываете ID вложения и сохраняете его в метаполе записи в нужном формате.
Три проверенных варианта, выбирайте под свою тему или плагин галереи.
Вариант 1: массив ID вложений. Подходит для большинства тем, ожидающих галерею в виде массива attachment ID:
1 function my_gallery_ids($post_id, $att_id, $filepath, $is_keep_existing_images) 2 { 3 $key = '_my_gallery'; 4 $gallery = get_post_meta($post_id, $key, true); 5 6 if (empty($gallery)) { 7 $gallery = array(); 8 } 9 10 if (!in_array($att_id, $gallery)) { 11 $gallery[] = $att_id; 12 update_post_meta($post_id, $key, $gallery); 13 } 14 } 15 add_action('pmxi_gallery_image', 'my_gallery_ids', 10, 4);
Вариант 2: массив URL. Если теме нужны прямые ссылки на full-size изображения:
1 function my_gallery_urls($post_id, $att_id, $filepath, $is_keep_existing_images) 2 { 3 $key = '_my_gallery'; 4 $size = 'full'; 5 $gallery = get_post_meta($post_id, $key, true); 6 7 if (empty($gallery)) { 8 $gallery = array(); 9 } 10 11 if (!isset($gallery[$att_id])) { 12 $src = wp_get_attachment_image_src($att_id, $size); 13 $gallery[$att_id] = $src[0]; 14 update_post_meta($post_id, $key, $gallery); 15 } 16 } 17 add_action('pmxi_gallery_image', 'my_gallery_urls', 10, 4);
Вариант 3: строка с разделителем. Если метаполе хранит ID через запятую (формат "23,25,31"):
1 function my_gallery_string($post_id, $att_id, $filepath, $is_keep_existing_images) 2 { 3 $key = '_my_gallery'; 4 $sep = ','; 5 $gallery = get_post_meta($post_id, $key, true); 6 7 if (is_string($gallery) || empty($gallery) || $gallery == false) { 8 $gallery = explode($sep, $gallery); 9 if (!in_array($att_id, $gallery)) { 10 if ($gallery[0] == '') unset($gallery[0]); 11 $gallery[] = $att_id; 12 update_post_meta($post_id, $key, implode($sep, $gallery)); 13 } 14 } 15 } 16 add_action('pmxi_gallery_image', 'my_gallery_string', 10, 4);
Код вставляется в functions.php темы. После завершения импорта хук можно удалить, метаполе уже заполнено. Плюс метода: галерея готова сразу после импорта, без дополнительных проходов.
Что делать с уже импортированными записями
Если записи уже загружены и изображения висят в контенте обычными <img>-тегами, нужен другой подход. Проходим по всем постам и заменяем теги на шорткод галереи.
Функция ниже собирает все ID вложений поста и заменяет <img> в контенте на [gallery ids="..."]:
1 function replace_post_images_with_gallery($post_id) 2 { 3 $post = get_post($post_id); 4 if (!$post) return; 5 6 $attachments = get_attached_media('image', $post_id); 7 8 if (empty($attachments)) return; 9 10 $ids = array(); 11 foreach ($attachments as $att) { 12 $ids[] = $att->ID; 13 } 14 15 $gallery_shortcode = '[gallery ids="' . implode(',', $ids) . '"]'; 16 $content = preg_replace('/<img[^>]+>/i', '', $post->post_content); 17 $content = $gallery_shortcode . "\n\n" . $content; 18 19 wp_update_post(array( 20 'ID' => $post_id, 21 'post_content' => $content, 22 )); 23 }
Затем запускаем групповое обновление:
- В админке переходим к списку всех записей.
- В настройках экрана выставляем количество элементов, 50 (оптимально, чтобы сервер не лёг).
- Выделяем все записи, в групповых действиях выбираем «Обновить» и применяем.
WordPress пройдётся по каждой записи, вызовет save_post и связанные с ним хуки. Если функция в functions.php завязана на save_post, она отработает. После завершения **удалите код из **functions.php, иначе при каждом сохранении поста контент будет перестраиваться заново.
⁉️🤔 Частые вопросы
WP All Import** не скачивает изображения при импорте, в чём дело?**
Ссылки в файле импорта должны быть полными URL (с
http://илиhttps://) и вести напрямую на файл изображения, не на HTML-страницу. Проверьте права на запись вwp-content/uploads: если сервер не может сохранить файл, импорт изображений молча пропускается. Самая частая причина, несовпадение ссылок в теле контента и в поле Images шаблона. Если в контентеhttp://oldsite.com/img.jpg, а в Images подаётсяhttp://newsite.com/files/img.jpg, плагин не свяжет их и изображение останется битым. URL должны совпадать один к одному.
Чем pmxi_gallery_image лучше пост-импорта?
Хук срабатывает на каждое изображение в момент загрузки, готовая галерея сразу после импорта, без второго прохода. Пост-импорт через
wp_update_postнагружает сервер: тысяча записей даёт тысячу вызововsave_post. Для объёма до 100 записей разница незаметна, но для крупных миграций хук экономит часы. Плюсpmxi_gallery_imageдаёт доступ к path загруженного файла и attachment ID, можно сразу прописать любую логику: распределить по папкам, добавить в слайдер, синхронизировать с CDN. Пост-импорт такой гибкости не даёт.
Обязательно ли удалять код из functions.php после импорта?
Да. Если функция висит на
pmxi_gallery_image, она срабатывает при ЛЮБОМ добавлении вложения, результат: дубликаты в метаполе галереи при ручной загрузке картинок. Хук отрабатывает один раз, после завершения импорта его можно смело убирать. Если функция завязана наsave_postили используется в групповом обновлении, тем более удалите. Иначе каждое редактирование записи будет перестраивать контент, удаляя<img>-теги и перезаписывая галерею.
Как оставить отдельные изображения вне галереи?
Исключите их из замены. В варианте с
pmxi_gallery_imageдобавьте условие по размеру или alt-тексту. В варианте с пост-импортом вместоpreg_replaceна все<img>используйте выборочную замену: оставьте изображения с определённым CSS-классом или атрибутом, остальные уберите и замените галереей. Например,<img class="keep">остаётся в контенте, все прочие<img>заменяются на[gallery]. Решается доработкой регулярки в функции замены.
WP All Import** Pro или бесплатной версии достаточно?**
Бесплатная версия умеет импортировать изображения в медиатеку и прикреплять их к записи. Хук
pmxi_gallery_imageдоступен и в ней. Pro-версия добавляет: загрузку изображений из внешних URL, Cron-импорты по расписанию, выполнение PHP-функций прямо в шаблоне импорта и поддержку кастомных полей. Для разового импорта с локальными файлами бесплатной версии хватает с запасом. Pro нужна, когда изображения лежат на стороннем сервере и вы не хотите скачивать их вручную, а также для ACF-полей, WooCommerce-импорта и работы с кастомными типами записей.
Какой метод выбрать под вашу задачу
Если вы только планируете импорт, собирайте галерею на лету через pmxi_gallery_image. Быстрее, чище и без двойной нагрузки на сервер. Любой из трёх вариантов выше работает: выбор зависит от того, в каком формате ваша тема или плагин ожидают галерею.
Если записи уже загружены и изображения рассыпаны по контенту, берите функцию замены <img> на [gallery] и запускайте групповое обновление. Для небольших объёмов (до 200 записей) это займёт пару минут. Для тысяч записей разумнее разбить на батчи по 50.
Сам WP All Import, один из самых гибких импортёров для WordPress. 200 000+ активных установок, бесплатная версия на WordPress.org закрывает большинство задач миграции. А Pro-версия снимает последние ограничения по внешним URL и Cron-импортам. Пробуйте.



