Skip to content

Alt om WordPress, webutvikling — og mer til

🔧 WP All Import: hvordan samle alle innleggsbilder i ett enkelt galleri

🔧 WP All Import: hvordan samle alle innleggsbilder i ett enkelt galleri

Importerte hundre innlegg via WP All Import, og bildene spredte seg tilfeldig utover innholdet: strukket til full bredde noen steder, presset mot tekst andre steder, og hengende som ødelagte lenker andre steder igjen. Å gå gjennom hvert innlegg manuelt er en bortkastet kveld.

Det finnes en måte å samle alt i ett enkelt galleri. Automatisk, uten manuell redigering av innhold. Metoden fungerer både for ferske importer og innlegg lastet opp for en måned siden. Nedenfor er to tilnærminger: den enkle (i farten, via pmxi_gallery_image-hooken) og i etterkant (med masseoppdatering). Begge testet på WP All Import 4.9+.

💡 Rask oversikt:

  • Forbered CSV eller XML: bildelenker som fullstendige URL-er, én per linje
  • I importmalen konfigurerer du Bilder-seksjonen og spesifiserer feltet med bilder
  • Legg til pmxi_gallery_image-hooken i functions.php, galleriet bygger seg selv under importen
  • For gamle innlegg: en funksjon for å erstatte <img> med galleri-shortcode og masseoppdatering

Hvordan forberede bilder for import

Før du kjører importen, må bildelenkene være i riktig format. WP All Import laster ned bilder bare hvis URL-en er fullstendig, direkte og peker til en fil, ikke en HTML-side.

Anta at galleriet på den gamle siden ser slik ut:

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>

Etter parsing må lenkene i CSV-filen for import bli fullstendige URL-er, én per linje, uten HTML-omslag:

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

Der http://newsite.com er domenet til siden du importerer til. Kritisk: hvis lenkene er relative eller peker til det gamle domenet, vil ikke WP All Import plukke opp filene og vil ikke laste dem opp til mediebiblioteket.

Lenkene i innleggsteksten må samsvare én-til-én med dem du mater til plugin-en for opplasting. Ellers vil noen <img>-tagger forbli med gamle URL-er etter import og vil ikke bli inkludert i galleriet.

Konfigurere importmalen i WP All Import

I plugin-grensesnittet går du til importmalen. Hovedseksjonen her er Bilder. Den ser slik ut:

WP All Import-grensesnitt for bildeinnstillinger

I Bilder-seksjonen spesifiserer du feltet som inneholder bildelenker. Vanligvis er dette en separat CSV-celle (for eksempel gallery_images), der lenker er listet med et skilletegn, som standard |:

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

WP All Import vil parse strengen, laste ned hvert bilde og legge det til i WordPress-mediebiblioteket. Men bildene er foreløpig bare festet til innlegget som vedlegg. Vi setter sammen galleriet separat.

Sørg for å sjekke hvordan plugin-en håndterer opplastingen. Klikk Forhåndsvis og test, deretter Kjør test. En grønn hake ved siden av antall bilder betyr at alt er riktig konfigurert. Et rødt kryss betyr at du må sjekke URL-ene: de må være fullstendige og direkte.

Før du starter importen, last opp bildefilene til files-mappen i nettstedets rot, hvis plugin-en henter bilder fra serveren og ikke fra eksterne URL-er.

Hvordan sette sammen galleriet i farten: pmxi_gallery_image-hook

Den reneste måten er å sette sammen galleriet direkte under importen. WP All Import tilbyr pmxi_gallery_image-hooken, som utløses for hvert opplastede bilde. Du fanger opp vedleggs-ID-en og lagrer den i postens meta-felt i ønsket format.

Tre testede varianter, velg for ditt tema eller galleri-plugin.

Variant 1: array med vedleggs-ID-er. Passer for de fleste temaer som forventer galleriet som en array med vedleggs-ID-er:

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 URL-er. Hvis temaet trenger direkte lenker til bilder i full størrelse:

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: streng med skilletegn. Hvis meta-feltet lagrer ID-er separert med komma (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 settes inn i temaets functions.php. Etter at importen er fullført, kan hooken fjernes, meta-feltet er allerede fylt. Fordel med denne metoden: galleriet er klart umiddelbart etter import, uten ekstra gjennomganger.

Hva du gjør med allerede importerte innlegg

Hvis innlegg allerede er lastet opp og bilder henger i innholdet som vanlige <img>-tagger, trenger du en annen tilnærming. Gå gjennom alle innlegg og erstatt taggene med galleri-shortcode.

Funksjonen nedenfor samler alle vedleggs-ID-er for et innlegg og erstatter <img> i innholdet 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}

Kjør deretter en masseoppdatering:

  • I admin-panelet går du til listen over alle innlegg.
  • I skjerminnstillinger setter du antall elementer til 50 (optimalt så serveren ikke krasjer).
  • Velg alle innlegg, velg «Oppdater» i massehandlinger og bruk.

WordPress vil gå gjennom hvert innlegg, kalle save_post og relaterte hooker. Hvis funksjonen i functions.php er knyttet til save_post, vil den kjøres. Etter fullføring, **fjern koden fra **functions.php, ellers vil innholdet bygges om på nytt ved hver lagring av innlegg.

⁉️🤔 Ofte stilte spørsmål

WP All Import** laster ikke ned bilder under import, hva er galt?**

Lenker i importfilen må være fullstendige URL-er (med http:// eller https://) og lede direkte til en bildefil, ikke til en HTML-side. Sjekk skrivetillatelser for wp-content/uploads: hvis serveren ikke kan lagre filen, hoppes bildeimporten over uten varsel. Den vanligste årsaken er manglende samsvar mellom lenker i innholdsteksten og i Bilder-feltet i malen. Hvis innholdet har http://oldsite.com/img.jpg, og Bilder mates med http://newsite.com/files/img.jpg, vil plugin-en ikke koble dem og bildet forblir ødelagt. URL-er må samsvare én-til-én.

Hvorfor er pmxi_gallery_image bedre enn etterimport?

Hooken utløses for hvert bilde i opplastingsøyeblikket, galleriet er klart rett etter import, uten en ny gjennomgang. Etterimport via wp_update_post belaster serveren: tusen innlegg gir tusen save_post-kall. For volumer opp til 100 innlegg er forskjellen ubetydelig, men for store migreringer sparer hooken timer. I tillegg gir pmxi_gallery_image tilgang til banen til den opplastede filen og vedleggs-ID, du kan umiddelbart foreskrive enhver logikk: fordele i mapper, legge til i slider, synkronisere med CDN. Etterimport gir ikke slik fleksibilitet.

Er det nødvendig å fjerne koden fra functions.php etter import?

Ja. Hvis funksjonen henger på pmxi_gallery_image, utløses den ved ALLE vedleggstillegg, resultatet: duplikater i galleriets meta-felt ved manuell opplasting av bilder. Hooken kjøres én gang, etter at importen er fullført kan den trygt fjernes. Hvis funksjonen er knyttet til save_post eller brukes i masseoppdatering, fjern den så absolutt. Ellers vil hver redigering av innlegg bygge om innholdet, fjerne <img>-tagger og skrive om galleriet.

Hvordan la enkeltbilder være utenfor galleriet?

Ekskluder dem fra erstatning. I varianten med pmxi_gallery_image, legg til en betingelse etter størrelse eller alt-tekst. I varianten med etterimport, i stedet for preg_replace for alle <img>, bruk selektiv erstatning: la bilder med en spesifikk CSS-klasse eller attributt være, fjern resten og erstatt med galleri. For eksempel, <img class="keep"> forblir i innholdet, alle andre <img> erstattes med [gallery]. Løses ved å raffinere regex i erstatningsfunksjonen.

Er WP All Import Pro nødvendig eller holder gratisversjonen?

Gratisversjonen kan importere bilder til mediebiblioteket og feste dem til et innlegg. pmxi_gallery_image-hooken er tilgjengelig i den også. Pro-versjonen legger til: lasting av bilder fra eksterne URL-er, Cron-import på tidsplan, kjøring av PHP-funksjoner direkte i importmalen og støtte for egendefinerte felt. For en engangsimport med lokale filer er gratisversjonen mer enn nok. Pro trengs når bilder ligger på en tredjepartsserver og du ikke vil laste dem ned manuelt, samt for ACF-felt, WooCommerce-import og arbeid med egendefinerte innleggstyper.

Hvilken metode du bør velge for din oppgave

Hvis du bare planlegger en import, sett sammen galleriet i farten via pmxi_gallery_image. Raskere, renere og uten dobbel belastning på serveren. Enhver av de tre variantene ovenfor fungerer: valget avhenger av hvilket format temaet eller plugin-en din forventer galleriet i.

Hvis innlegg allerede er lastet opp og bilder er spredt utover innholdet, ta funksjonen for å erstatte <img> med [gallery] og kjør en masseoppdatering. For små volumer (opptil 200 innlegg) vil dette ta et par minutter. For tusenvis av innlegg er det lurere å dele opp i batcher på 50.

WP All Import selv er en av de mest fleksible importørene for WordPress. 200 000+ aktive installasjoner, gratisversjonen på WordPress.org dekker de fleste migreringsoppgaver. Og Pro-versjonen fjerner de siste begrensningene på eksterne URL-er og Cron-import. Prøv den.