
🔧 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-імпортів. Спробуйте.



