Skip to content

Wszystko o WordPressie, tworzeniu stron — i nie tylko

🔧 WP All Import: jak zebrać wszystkie obrazy wpisu w jedną galerię

🔧 WP All Import: jak zebrać wszystkie obrazy wpisu w jedną galerię

Zaimportowali Państwo setkę wpisów przez WP All Import, a zdjęcia rozsypały się po treści w dowolny sposób: gdzieś rozciągnięte na całą szerokość, gdzieś przyklejone do tekstu, a gdzieś wiszą jako martwe linki. Przebieranie każdego wpisu ręcznie to stracony wieczór.

Sposób, by zebrać wszystko w jedną galerię, istnieje. I to automatycznie, bez ręcznej edycji treści. Metoda działa zarówno dla świeżych importów, jak i dla wpisów załadowanych miesiąc temu. Poniżej dwa podejścia: lekkie (w locie, przez hook pmxi_gallery_image) i post factum (przez aktualizację grupową). Oba sprawdzone na WP All Import 4.9+.

💡 Szybki przegląd:

  • Przygotowujemy CSV lub XML: linki do zdjęć jako pełne adresy URL, po jednym w wierszu
  • W szablonie importu konfigurujemy sekcję Images i wskazujemy pole ze zdjęciami
  • Dodajemy hook pmxi_gallery_image w functions.php, galeria składa się sama podczas importu
  • Dla starych wpisów: funkcja zamiany <img> na shortcode galerii i aktualizacja grupowa

Jak przygotować zdjęcia do importu

Przed uruchomieniem importu linki do zdjęć muszą być w prawidłowym formacie. WP All Import pobiera zdjęcia tylko wtedy, gdy URL jest pełny, bezpośredni i prowadzi do pliku, a nie do strony HTML.

Załóżmy, że na starej stronie galeria wygląda tak:

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>

Po parsowaniu w pliku CSV do importu linki powinny stać się pełnymi adresami URL, po jednym w wierszu, bez otoczki HTML:

1http://newsite.com/files/photo1.jpg
2http://newsite.com/files/photo2.jpg

Gdzie http://newsite.com to domena strony, na którą idzie import. Krytyczne: jeśli linki są względne lub prowadzą na starą domenę, WP All Import nie przechwyci plików i nie załaduje ich do biblioteki mediów.

Same linki w treści wpisu muszą pokrywać się jeden do jednego z tymi, które podają Państwo do załadowania przez wtyczkę. W przeciwnym razie po imporcie część tagów <img> zostanie ze starymi adresami URL i nie trafi do galerii.

Konfiguracja szablonu importu w WP All Import

W interfejsie wtyczki przechodzimy do szablonu importu. Główna sekcja tutaj to Images. Wygląda ona tak:

Interfejs konfiguracji obrazów w WP All Import

W sekcji Images proszę wskazać pole, które zawiera linki do zdjęć. Zazwyczaj jest to osobna komórka CSV (na przykład gallery_images), gdzie linki są wymienione przez separator, domyślnie |:

1http://newsite.com/files/photo1.jpg | http://newsite.com/files/photo2.jpg | http://newsite.com/files/photo3.jpg

WP All Import sparsuje ciąg, załaduje każde zdjęcie i doda je do biblioteki mediów WordPress. Ale zdjęcia na razie są po prostu dołączone do wpisu jako załączniki. Galerię złożymy osobno.

Koniecznie proszę sprawdzić, jak wtyczka obsługuje ładowanie. Proszę kliknąć Preview & Test, potem Run Test. Zielony znacznik obok liczby zdjęć oznacza, że wszystko skonfigurowano prawidłowo. Czerwony krzyżyk: proszę sprawdzić adresy URL, muszą być pełne i bezpośrednie.

Przed uruchomieniem importu proszę załadować pliki zdjęć do folderu files w katalogu głównym strony, jeśli wtyczka pobiera zdjęcia z serwera, a nie z zewnętrznych adresów URL.

Jak złożyć galerię w locie: hook pmxi_gallery_image

Najczystszy sposób to złożenie galerii bezpośrednio podczas importu. WP All Import udostępnia hook pmxi_gallery_image, który uruchamia się dla każdego załadowanego zdjęcia. Przechwytują Państwo ID załącznika i zapisują je w metapolu wpisu w wymaganym formacie.

Trzy sprawdzone warianty, proszę wybrać pod swój motyw lub wtyczkę galerii.

Wariant 1: tablica ID załączników. Pasuje do większości motywów, które oczekują galerii w postaci tablicy attachment ID:

1function 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}
15add_action('pmxi_gallery_image', 'my_gallery_ids', 10, 4);

Wariant 2: tablica adresów URL. Jeśli motyw wymaga bezpośrednich linków do zdjęć w pełnym rozmiarze:

1function 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}
17add_action('pmxi_gallery_image', 'my_gallery_urls', 10, 4);

Wariant 3: ciąg z separatorem. Jeśli metapole przechowuje ID przez przecinek (format "23,25,31"):

1function 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}
16add_action('pmxi_gallery_image', 'my_gallery_string', 10, 4);

Kod wstawia się do functions.php motywu. Po zakończeniu importu hook można usunąć, metapole jest już wypełnione. Plus metody: galeria jest gotowa od razu po imporcie, bez dodatkowych przebiegów.

Co zrobić z już zaimportowanymi wpisami

Jeśli wpisy są już załadowane, a zdjęcia wiszą w treści jako zwykłe tagi <img>, potrzebne jest inne podejście. Przechodzimy przez wszystkie posty i zamieniamy tagi na shortcode galerii.

Poniższa funkcja zbiera wszystkie ID załączników posta i zamienia <img> w treści na [gallery ids="..."]:

1function 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}

Następnie uruchamiamy aktualizację grupową:

  • W panelu administracyjnym przechodzimy do listy wszystkich wpisów.
  • W ustawieniach ekranu ustawiamy liczbę elementów na 50 (optymalnie, żeby serwer nie padł).
  • Zaznaczamy wszystkie wpisy, w działaniach grupowych wybieramy „Aktualizuj" i stosujemy.

WordPress przejdzie przez każdy wpis, wywoła save_post i powiązane z nim hooki. Jeśli funkcja w functions.php jest podpięta pod save_post, wykona się. Po zakończeniu **proszę usunąć kod z **functions.php, w przeciwnym razie przy każdym zapisie posta treść będzie przebudowywana od nowa.

⁉️🤔 Częste pytania

WP All Import** nie ładuje zdjęć podczas importu, o co chodzi?**

Linki w pliku importu muszą być pełnymi adresami URL (z http:// lub https://) i prowadzić bezpośrednio do pliku zdjęcia, nie do strony HTML. Proszę sprawdzić prawa zapisu w wp-content/uploads: jeśli serwer nie może zapisać pliku, import zdjęć jest po cichu pomijany. Najczęstsza przyczyna to niezgodność linków w treści i w polu Images szablonu. Jeśli w treści jest http://oldsite.com/img.jpg, a w Images podaje się http://newsite.com/files/img.jpg, wtyczka ich nie powiąże i zdjęcie pozostanie martwe. Adresy URL muszą zgadzać się jeden do jednego.

Dlaczego pmxi_gallery_image jest lepszy niż post-import?

Hook uruchamia się dla każdego zdjęcia w momencie ładowania, gotowa galeria jest od razu po imporcie, bez drugiego przebiegu. Post-import przez wp_update_post obciąża serwer: tysiąc wpisów daje tysiąc wywołań save_post. Dla objętości do 100 wpisów różnica jest niezauważalna, ale dla dużych migracji hook oszczędza godziny. Dodatkowo pmxi_gallery_image daje dostęp do ścieżki załadowanego pliku i attachment ID, można od razu zapisać dowolną logikę: rozdzielić po folderach, dodać do slidera, zsynchronizować z CDN. Post-import nie daje takiej elastyczności.

Czy koniecznie trzeba usuwać kod z functions.php po imporcie?

Tak. Jeśli funkcja wisi na pmxi_gallery_image, uruchamia się podczas KAŻDEGO dodania załącznika, skutek: duplikaty w metapolu galerii podczas ręcznego ładowania zdjęć. Hook wykonuje się raz, po zakończeniu importu można go bezpiecznie usunąć. Jeśli funkcja jest podpięta pod save_post lub używana w aktualizacji grupowej, tym bardziej proszę usunąć. W przeciwnym razie każda edycja wpisu będzie przebudowywać treść, usuwając tagi <img> i nadpisując galerię.

Jak zostawić pojedyncze zdjęcia poza galerią?

Proszę wykluczyć je z zamiany. W wariancie z pmxi_gallery_image proszę dodać warunek według rozmiaru lub tekstu alt. W wariancie z post-importem zamiast preg_replace na wszystkie <img> proszę użyć zamiany selektywnej: zostawić zdjęcia z określoną klasą CSS lub atrybutem, resztę usunąć i zastąpić galerią. Na przykład <img class="keep"> zostaje w treści, wszystkie pozostałe <img> są zamieniane na [gallery]. Rozwiązuje się to przez dopracowanie wyrażenia regularnego w funkcji zamiany.

WP All Import** Pro czy wystarczy wersja darmowa?**

Darmowa wersja potrafi importować zdjęcia do biblioteki mediów i dołączać je do wpisu. Hook pmxi_gallery_image jest w niej również dostępny. Wersja Pro dodaje: ładowanie zdjęć z zewnętrznych adresów URL, importy Cron według harmonogramu, wykonywanie funkcji PHP bezpośrednio w szablonie importu oraz obsługę pól niestandardowych. Do jednorazowego importu z plikami lokalnymi darmowa wersja wystarcza z dużym zapasem. Pro jest potrzebna, gdy zdjęcia leżą na zewnętrznym serwerze i nie chcą Państwo ładować ich ręcznie, a także do pól ACF, importu WooCommerce i pracy z niestandardowymi typami wpisów.

Którą metodę wybrać do swojego zadania

Jeśli dopiero planują Państwo import, proszę składać galerię w locie przez pmxi_gallery_image. Szybciej, czyściej i bez podwójnego obciążenia serwera. Każdy z trzech powyższych wariantów działa: wybór zależy od tego, w jakim formacie Państwa motyw lub wtyczka oczekują galerii.

Jeśli wpisy są już załadowane, a zdjęcia rozsypane po treści, proszę wziąć funkcję zamiany <img> na [gallery] i uruchomić aktualizację grupową. Dla niewielkich objętości (do 200 wpisów) zajmie to parę minut. Dla tysięcy wpisów rozsądniej jest podzielić na partie po 50.

Sam WP All Import to jeden z najelastyczniejszych importerów dla WordPressa. 200 000+ aktywnych instalacji, darmowa wersja na WordPress.org pokrywa większość zadań migracyjnych. A wersja Pro zdejmuje ostatnie ograniczenia dotyczące zewnętrznych adresów URL i importów Cron. Proszę spróbować.