Skip to content

Allt om WordPress, webbutveckling — och mer därtill

🔧 WP All Import: hur du samlar alla inläggsbilder i ett enda galleri

🔧 WP All Import: hur du samlar alla inläggsbilder i ett enda galleri

Importerade hundra inlägg genom WP All Import, och bilderna spreds slumpmässigt över innehållet: utsträckta till full bredd på vissa ställen, ihopklämda mot text på andra, och hängande som trasiga länkar på ytterligare andra. Att gå igenom varje inlägg manuellt är en bortkastad kväll.

Det finns ett sätt att samla allt i ett enda galleri. Automatiskt, utan manuell innehållsredigering. Metoden fungerar både för färska importer och inlägg som laddades upp för en månad sedan. Nedan finns två tillvägagångssätt: det enkla (i farten, via pmxi_gallery_image-hooken) och i efterhand (med massuppdatering). Båda testade på WP All Import 4.9+.

💡 Snabb översikt:

  • Förbered CSV eller XML: bildlänkar som fullständiga webbadresser, en per rad
  • I importmallen, konfigurera Bilder-sektionen och ange fältet med bilder
  • Lägg till pmxi_gallery_image-hooken i functions.php, galleriet sätts ihop under importen
  • För gamla inlägg: en funktion för att ersätta <img> med galleriets shortcode och massuppdatera

Så förbereder du bilder för import

Innan du kör importen måste bildlänkarna vara i rätt format. WP All Import laddar bara ner bilder om webbadressen är fullständig, direkt och pekar på en fil, inte en HTML-sida.

Anta att galleriet på den gamla sajten ser ut så här:

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>

Efter parsning, i CSV-filen för import, måste länkarna bli fullständiga webbadresser, en per rad, utan HTML-omslag:

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

Där http://newsite.com är domänen för sajten du importerar till. Kritiskt: om länkarna är relativa eller pekar på den gamla domänen, kommer WP All Import inte att hämta filerna och inte ladda upp dem till mediebiblioteket.

Länkarna i inläggets brödtext måste matcha en-till-en med dem du matar till pluginet för uppladdning. Annars kommer vissa <img>-taggar efter importen att finnas kvar med gamla webbadresser och inte inkluderas i galleriet.

Konfigurera importmallen i WP All Import

I pluginets gränssnitt, gå till importmallen. Huvudsektionen här är Bilder. Den ser ut så här:

WP All Import bildinställningsgränssnitt

I Bilder-sektionen anger du fältet som innehåller bildlänkar. Vanligtvis är detta en separat CSV-cell (till exempel gallery_images), där länkar listas med en avgränsare, som standard |:

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

WP All Import kommer att tolka strängen, ladda ner varje bild och lägga till den i WordPress mediebibliotek. Men bilderna är tills vidare bara bifogade till inlägget som bilagor. Vi sätter ihop galleriet separat.

Se till att kontrollera hur pluginet hanterar uppladdningen. Klicka på Förhandsgranska & Testa, sedan Kör test. En grön bock bredvid antalet bilder betyder att allt är korrekt konfigurerat. Ett rött kryss betyder att du ska kontrollera webbadresserna: de måste vara fullständiga och direkta.

Innan du startar importen, ladda upp bildfilerna till mappen files i sajtroten, om pluginet hämtar bilder från servern och inte från externa webbadresser.

Så sätter du ihop galleriet i farten: pmxi_gallery_image-hooken

Det renaste sättet är att sätta ihop galleriet direkt under importen. WP All Import tillhandahåller pmxi_gallery_image-hooken, som aktiveras för varje uppladdad bild. Du fångar upp bilagans ID och sparar det i inläggets meta-fält i önskat format.

Tre testade varianter, välj för ditt tema eller galleriplugin.

Variant 1: array med bilagors ID:n. Passar de flesta teman som förväntar sig galleriet som en array av bilagors ID:n:

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

Variant 2: array med webbadresser. Om temat behöver direkta länkar till bilder i full storlek:

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

Variant 3: sträng med avgränsare. Om meta-fältet lagrar ID:n separerade med kommatecken (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);

Koden infogas i temats functions.php. När importen är klar kan hooken tas bort, meta-fältet är redan ifyllt. Fördelen med denna metod: galleriet är klart direkt efter import, utan extra genomgångar.

Vad du gör med redan importerade inlägg

Om inlägg redan är uppladdade och bilder hänger i innehållet som vanliga <img>-taggar, behöver du en annan approach. Gå igenom alla inlägg och ersätt taggarna med gallery shortcode.

Funktionen nedan samlar in alla bilagors ID:n för ett inlägg och ersätter <img> i innehållet med [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}

Kör sedan en massuppdatering:

  • I adminpanelen, gå till listan över alla inlägg.
  • I skärmalternativ, ställ in antalet objekt till 50 (optimalt så att servern inte kraschar).
  • Markera alla inlägg, välj "Uppdatera" i massåtgärder och verkställ.

WordPress kommer att gå igenom varje inlägg, anropa save_post och relaterade hookar. Om funktionen i functions.php är kopplad till save_post, kommer den att köras. Efter slutförandet, **ta bort koden från **functions.php, annars kommer innehållet att byggas om igen vid varje inläggssparande.

⁉️🤔 Vanliga frågor

WP All Import** laddar inte ner bilder under import, vad är fel?**

Länkar i importfilen måste vara fullständiga webbadresser (med http:// eller https://) och leda direkt till en bildfil, inte till en HTML-sida. Kontrollera skrivrättigheter för wp-content/uploads: om servern inte kan spara filen hoppas bildimporten över tyst. Den vanligaste orsaken är en mismatch mellan länkar i innehållets brödtext och i mallens Bilder-fält. Om innehållet har http://oldsite.com/img.jpg, och Bilder matas med http://newsite.com/files/img.jpg, kommer pluginet inte att länka dem och bilden förblir trasig. Webbadresserna måste matcha en-till-en.

Varför är pmxi_gallery_image bättre än efterimport?

Hooken aktiveras för varje bild vid uppladdningstillfället, galleriet är klart direkt efter import, utan en andra genomgång. Efterimport via wp_update_post belastar servern: tusen inlägg ger tusen save_post-anrop. För volymer upp till 100 inlägg är skillnaden försumbar, men för stora migreringar sparar hooken timmar. Dessutom ger pmxi_gallery_image tillgång till sökvägen för den uppladdade filen och bilagans ID, du kan omedelbart föreskriva vilken logik som helst: fördela i mappar, lägg till i slider, synka med CDN. Efterimport ger inte sådan flexibilitet.

Är det nödvändigt att ta bort koden från functions.php efter import?

Ja. Om funktionen hänger på pmxi_gallery_image, aktiveras den vid VARJE bilagetillägg, resultatet: dubbletter i galleriets meta-fält vid manuell bilduppladdning. Hooken körs en gång, efter att importen är klar kan den säkert tas bort. Om funktionen är kopplad till save_post eller används i massuppdatering, ta bort den desto mer. Annars kommer varje inläggsredigering att bygga om innehållet, ta bort <img>-taggar och skriva om galleriet.

Hur lämnar man enskilda bilder utanför galleriet?

Exkludera dem från ersättning. I varianten med pmxi_gallery_image, lägg till ett villkor efter storlek eller alt-text. I varianten med efterimport, istället för preg_replace för alla <img>, använd selektiv ersättning: lämna bilder med en specifik CSS-klass eller attribut, ta bort resten och ersätt med galleri. Till exempel, <img class="keep"> finns kvar i innehållet, alla andra <img> ersätts med [gallery]. Löses genom att förfina regexet i ersättningsfunktionen.

Behövs WP All Import Pro eller räcker gratisversionen?

Gratisversionen kan importera bilder till mediebiblioteket och bifoga dem till ett inlägg. pmxi_gallery_image-hooken är tillgänglig i den också. Pro-versionen lägger till: laddning av bilder från externa webbadresser, Cron-importer enligt schema, körning av PHP-funktioner direkt i importmallen och stöd för anpassade fält. För en engångsimport med lokala filer är gratisversionen mer än tillräcklig. Pro behövs när bilder finns på en tredjepartsserver och du inte vill ladda ner dem manuellt, samt för ACF-fält, WooCommerce-import och arbete med anpassade inläggstyper.

Vilken metod du ska välja för din uppgift

Om du just planerar en import, sätt ihop galleriet i farten via pmxi_gallery_image. Snabbare, renare och utan dubbel belastning på servern. Vilken som helst av de tre varianterna ovan fungerar: valet beror på vilket format ditt tema eller plugin förväntar sig galleriet i.

Om inlägg redan är uppladdade och bilder är utspridda över innehållet, ta funktionen för att ersätta <img> med [gallery] och kör en massuppdatering. För små volymer (upp till 200 inlägg) tar detta ett par minuter. För tusentals inlägg är det klokare att dela upp i batcher om 50.

WP All Import i sig är en av de mest flexibla importörerna för WordPress. 200 000+ aktiva installationer, gratisversionen på WordPress.org täcker de flesta migreringsuppgifter. Och Pro-versionen tar bort de sista begränsningarna för externa webbadresser och Cron-importer. Testa den.