Skip to content

Alles für WordPress, Webentwicklung — und mehr

🔧 WP All Import: So sammeln Sie alle Beitragsbilder in einer einzigen Galerie

🔧 WP All Import: So sammeln Sie alle Beitragsbilder in einer einzigen Galerie

Hundert Beiträge über WP All Import importiert, und die Bilder verteilten sich willkürlich im Content: an manchen Stellen auf volle Breite gestreckt, an anderen an den Text gequetscht, andernorts als defekte Links. Jeden Beitrag manuell durchzugehen ist ein verlorener Abend.

Es gibt einen Weg, alles in einer einzigen Galerie zu sammeln. Automatisch, ohne manuelle Nachbearbeitung des Contents. Die Methode funktioniert sowohl für frische Importe als auch für Beiträge, die vor einem Monat hochgeladen wurden. Nachfolgend zwei Ansätze: der einfache (on the fly, über den pmxi_gallery_image-Hook) und der nachträgliche (per Massenaktualisierung). Beide getestet mit WP All Import 4.9+.

💡 Kurzüberblick:

  • CSV oder XML vorbereiten: Bildlinks als vollständige URLs, eine pro Zeile
  • Im Import-Template den Bereich Bilder konfigurieren und das Feld mit den Bildern angeben
  • Den pmxi_gallery_image-Hook in functions.php einfügen, die Galerie baut sich beim Import selbst zusammen
  • Für alte Beiträge: eine Funktion, die <img> durch den Galerie-Shortcode ersetzt, und Massenaktualisierung

Wie Sie Bilder für den Import vorbereiten

Vor dem Import müssen die Bildlinks im korrekten Format vorliegen. WP All Import lädt Bilder nur herunter, wenn die URL vollständig, direkt und auf eine Datei verweisend ist, nicht auf eine HTML-Seite.

Angenommen, auf der alten Seite sieht die Galerie so aus:

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>

Nach dem Parsen müssen die Links in der CSV-Datei für den Import als vollständige URLs vorliegen, eine pro Zeile, ohne HTML-Hülle:

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

Wobei http://newsite.com die Domain der Seite ist, auf die Sie importieren. Kritisch: Sind die Links relativ oder verweisen auf die alte Domain, erkennt WP All Import die Dateien nicht und lädt sie nicht in die Medienbibliothek hoch.

Die Links im Beitragsbody müssen eins zu eins mit denen übereinstimmen, die Sie dem Plugin zum Hochladen übergeben. Andernfalls bleiben nach dem Import einige <img>-Tags mit alten URLs erhalten und werden nicht in die Galerie aufgenommen.

Das Import-Template in WP All Import konfigurieren

Gehen Sie im Plugin-Interface zum Import-Template. Der zentrale Bereich hier ist Bilder. Er sieht so aus:

WP All Import Bild-Einstellungen Oberfläche

Geben Sie im Bereich Bilder das Feld an, das die Bildlinks enthält. Üblicherweise ist das eine separate CSV-Zelle (zum Beispiel gallery_images), in der die Links mit einem Trennzeichen, standardmäßig |, aufgelistet sind:

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

WP All Import parst die Zeichenkette, lädt jedes Bild herunter und fügt es der WordPress-Medienbibliothek hinzu. Die Bilder sind damit jedoch vorerst nur als Anhänge mit dem Beitrag verknüpft. Die Galerie stellen wir separat zusammen.

Prüfen Sie unbedingt, wie das Plugin den Upload verarbeitet. Klicken Sie auf Vorschau & Test, dann auf Test ausführen. Ein grüner Haken neben der Bildanzahl bedeutet, dass alles korrekt konfiguriert ist. Ein rotes Kreuz heißt: Überprüfen Sie die URLs, sie müssen vollständig und direkt sein.

Laden Sie vor dem Start des Imports die Bilddateien in den Ordner files im Wurzelverzeichnis der Seite hoch, falls das Plugin die Bilder vom Server und nicht von externen URLs bezieht.

So stellen Sie die Galerie on the fly zusammen: pmxi_gallery_image-Hook

Der sauberste Weg ist, die Galerie direkt während des Imports zusammenzustellen. WP All Import stellt den pmxi_gallery_image-Hook bereit, der für jedes hochgeladene Bild feuert. Sie fangen die Anhang-ID ab und speichern sie im gewünschten Format im Post-Meta-Feld.

Drei getestete Varianten, wählen Sie passend zu Ihrem Theme oder Galerie-Plugin.

Variante 1: Array mit Anhang-IDs. Geeignet für die meisten Themes, die die Galerie als Array von Anhang-IDs erwarten:

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);

Variante 2: Array mit URLs. Wenn das Theme direkte Links zu den Bildern in voller Größe benötigt:

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);

Variante 3: Zeichenkette mit Trennzeichen. Wenn das Meta-Feld IDs kommagetrennt speichert (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);

Der Code wird in die functions.php des Themes eingefügt. Nach Abschluss des Imports kann der Hook entfernt werden, das Meta-Feld ist bereits befüllt. Vorteil dieser Methode: Die Galerie steht unmittelbar nach dem Import bereit, ohne zusätzliche Durchläufe.

Was tun mit bereits importierten Beiträgen

Sind die Beiträge bereits hochgeladen und die Bilder hängen als normale <img>-Tags im Content, brauchen Sie einen anderen Ansatz. Gehen Sie alle Beiträge durch und ersetzen Sie die Tags durch den Galerie-Shortcode.

Die folgende Funktion sammelt alle Anhang-IDs eines Beitrags und ersetzt <img> im Content durch [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}

Führen Sie dann eine Massenaktualisierung durch:

  • Gehen Sie im Admin-Panel zur Liste aller Beiträge.
  • Stellen Sie in den Bildschirmoptionen die Anzahl der Einträge auf 50 (optimal, damit der Server nicht abstürzt).
  • Wählen Sie alle Beiträge aus, wählen Sie in den Massenaktionen „Aktualisieren" und wenden Sie diese an.

WordPress geht jeden Beitrag durch, ruft save_post und zugehörige Hooks auf. Wenn die Funktion in functions.php an save_post gebunden ist, wird sie ausgeführt. **Entfernen Sie den Code nach Abschluss aus **functions.php, andernfalls wird der Content bei jedem Speichern eines Beitrags erneut umgebaut.

⁉️🤔 Häufig gestellte Fragen

WP All Import** lädt beim Import keine Bilder herunter, woran liegt das?**

Links in der Importdatei müssen vollständige URLs sein (mit http:// oder https://) und direkt zu einer Bilddatei führen, nicht zu einer HTML-Seite. Prüfen Sie die Schreibrechte für wp-content/uploads: Kann der Server die Datei nicht speichern, wird der Bildimport stillschweigend übersprungen. Die häufigste Ursache ist eine Nichtübereinstimmung zwischen Links im Content-Body und im Bilder-Feld des Templates. Steht im Content http://oldsite.com/img.jpg, wird im Bilder-Feld aber http://newsite.com/files/img.jpg übergeben, verknüpft das Plugin sie nicht und das Bild bleibt defekt. URLs müssen eins zu eins übereinstimmen.

Warum ist pmxi_gallery_image besser als die Nachbearbeitung nach dem Import?

Der Hook feuert für jedes Bild im Moment des Uploads, die Galerie steht direkt nach dem Import bereit, ohne zweiten Durchlauf. Die Nachbearbeitung via wp_update_post belastet den Server: Tausend Beiträge ergeben tausend save_post-Aufrufe. Bei Mengen bis 100 Beiträgen ist der Unterschied vernachlässigbar, bei großen Migrationen spart der Hook Stunden. Zudem gibt pmxi_gallery_image Zugriff auf den Pfad der hochgeladenen Datei und die Anhang-ID, Sie können sofort jede Logik hinterlegen: auf Ordner verteilen, in Slider einbinden, mit CDN synchronisieren. Die Nachbearbeitung bietet diese Flexibilität nicht.

Muss der Code nach dem Import aus functions.php entfernt werden?

Ja. Hängt die Funktion an pmxi_gallery_image, feuert sie bei JEDER Anhang-Hinzufügung, Ergebnis: Duplikate im Galerie-Meta-Feld beim manuellen Hochladen von Bildern. Der Hook läuft einmal, nach Abschluss des Imports kann er bedenkenlos entfernt werden. Ist die Funktion an save_post gebunden oder wird bei der Massenaktualisierung genutzt, gilt das erst recht. Andernfalls baut jede Beitragsbearbeitung den Content um, entfernt <img>-Tags und schreibt die Galerie neu.

Wie lassen sich einzelne Bilder außerhalb der Galerie belassen?

Schließen Sie sie von der Ersetzung aus. Fügen Sie bei der Variante mit pmxi_gallery_image eine Bedingung nach Größe oder Alt-Text hinzu. Nutzen Sie bei der Variante mit Nachbearbeitung statt preg_replace für alle <img> eine selektive Ersetzung: Bilder mit einer bestimmten CSS-Klasse oder einem Attribut bleiben erhalten, der Rest wird entfernt und durch die Galerie ersetzt. Beispiel: <img class="keep"> bleibt im Content, alle anderen <img> werden durch [gallery] ersetzt. Gelöst wird das durch Verfeinerung des regulären Ausdrucks in der Ersetzungsfunktion.

Ist WP All Import Pro nötig oder reicht die kostenlose Version?

Die kostenlose Version kann Bilder in die Medienbibliothek importieren und mit einem Beitrag verknüpfen. Der pmxi_gallery_image-Hook ist auch darin verfügbar. Die Pro-Version ergänzt: Laden von Bildern von externen URLs, Cron-Importe nach Zeitplan, Ausführung von PHP-Funktionen direkt im Import-Template und Unterstützung für benutzerdefinierte Felder. Für einen einmaligen Import mit lokalen Dateien ist die kostenlose Version mehr als ausreichend. Pro wird benötigt, wenn Bilder auf einem fremden Server liegen und Sie sie nicht manuell herunterladen möchten, sowie für ACF-Felder, WooCommerce-Import und die Arbeit mit benutzerdefinierten Beitragstypen.

Welche Methode für Ihre Aufgabe wählen

Wenn Sie einen Import gerade planen, stellen Sie die Galerie on the fly via pmxi_gallery_image zusammen. Schneller, sauberer und ohne doppelte Serverlast. Jede der drei obigen Varianten funktioniert: Die Wahl hängt davon ab, in welchem Format Ihr Theme oder Plugin die Galerie erwartet.

Sind die Beiträge bereits hochgeladen und die Bilder über den Content verstreut, nehmen Sie die Funktion zum Ersetzen von <img> durch [gallery] und führen Sie eine Massenaktualisierung durch. Bei kleinen Mengen (bis 200 Beiträge) dauert das ein paar Minuten. Bei Tausenden von Beiträgen ist es sinnvoller, in Stapeln zu 50 aufzuteilen.

WP All Import selbst ist einer der flexibelsten Importer für WordPress. Über 200.000 aktive Installationen, die kostenlose Version auf WordPress.org deckt die meisten Migrationsaufgaben ab. Und die Pro-Version beseitigt die letzten Einschränkungen bei externen URLs und Cron-Importen. Probieren Sie es aus.