Hopp til innholdet
🛠 Slik legger du til ett egendefinert felt i mange innlegg i WordPress

🛠 Slik legger du til ett egendefinert felt i mange innlegg i WordPress

Et nettsted på WordPress har vokst til hundrevis av innlegg, og hvert enkelt trenger et nytt egendefinert felt lagt til. Å åpne hvert innlegg for hånd og klikke «Oppdater» er en halvdagsjobb, minst.

Særlig hvis du finjusterer et tema eller kobler til en SEO-plugin som trenger samme meta_key på tvers av hele innholdsstrømmen. WordPress-administrasjonspanelet tilbyr ingen «bruk på alle»-knapp, men det gir deg to måter å løse dette med kode på.

Nedenfor finner du begge metodene med klare til bruk-kodebiter: rask (én SQL-spørring for hele bunten) og enkel (en løkke over ID-er med den innebygde add_post_meta-funksjonen). Velg basert på oppgaven.

To skjermer viser forskjellige blokker med kildekode og utviklingsfiler på en utviklers arbeidsplass

💡 Rask oversikt:

  • Du kan massetildele det samme egendefinerte feltet til alle innlegg ved å bruke add_post_meta i en løkke, 4 linjer kode.
  • Hvis det er hundrevis av innlegg og hastighet betyr noe, én direkte INSERT inn i wp_postmeta-tabellen via en egendefinert funksjon.
  • Begge metodene fungerer via temaets functions.php eller Code Snippets-pluginen. Ta sikkerhetskopi av databasen før du kjører noe SQL.

Hvorfor legge til ett felt på mange innlegg samtidig

Egendefinerte felt (også kjent som postmeta) lagrer tilleggsinformasjon om en oppføring: visningsantall, tagger for intern filtrering, et «favoritt»-flagg, en relatert produkt-ID. Alt som ikke passer inn i standardfeltene post_title og post_content.

Vanligvis legges et felt til fra sak til sak: åpne et innlegg, finn «Egendefinerte felt»-blokken i redigeringsverktøyet, skriv inn et nøkkel-verdi-par. Men når feltet må vises på alle 200 innlegg samtidig, er den manuelle metoden uaktuell.

Typiske scenarioer der massehandling er nødvendig:

  • Du aktiverte et child theme som bruker get_post_meta($post_id, 'featured_post', true) for å markere populære innlegg. Uten massepopulering vil gamle innlegg ikke vises i utdataene.
  • En SEO-gjennomgang krevde at noindex ble satt for en bestemt innholdstype via et metafelt, i stedet for gjennom robots.txt.
  • Migrering fra en annen plattform: data fra det gamle CMS-et havnet i en CSV, og det må lastes inn i wp_postmeta for tusenvis av poster.

WordPress har ingen innebygd add_multiple_posts_meta-funksjon. Men det finnes to utprøvde veier, velg basert på situasjonen.

Metode 1. Én SQL-spørring for alle innlegg

Den raskeste metoden, en direkte INSERT inn i wp_postmeta-tabellen i en enkelt transaksjon. I stedet for 200 individuelle databasespørringer gjør du én, og den utføres på millisekunder.

Nedenfor finner du add_multiple_posts_meta-funksjonen, som mottar en array med innleggs-ID-er og speiler signaturen til den innebygde add_post_meta: samme parametere, samme rekkefølge.

Legg til koden i child themeets functions.php eller via Code Snippets-pluginen. Funksjonen sjekker selv om et slikt felt allerede finnes for innlegget (hvis $unique = true er sendt inn) og filtrerer ut ugyldige ID-er.

1if( !function_exists( 'add_multiple_posts_meta' ) ){
2 function add_multiple_posts_meta( $post_ids, $meta_key, $meta_value, $unique = false ){
3
4 // If key or ID is not set — exit
5 if( !$meta_key || empty( $post_ids ) ){
6 return false;
7 }
8
9 // One post — pass to native add_post_meta
10 if( is_numeric( $post_ids ) || ( is_array( $post_ids ) && count( $post_ids ) === 1 ) ){
11 return add_post_meta(
12 is_array( $post_ids ) ? $post_ids[0] : $post_ids,
13 $meta_key,
14 $meta_value,
15 $unique
16 );
17 }
18
19 global $wpdb;
20
21 // Filter out invalid IDs and duplicates
22 $valid_post_ids = array_unique(
23 array_filter( $post_ids, function( $post_id ) use ( $wpdb, $meta_key, $unique ){
24 return $post_id
25 && is_numeric( $post_id )
26 && get_post_status( $post_id )
27 && (
28 ! $unique
29 || ! $wpdb->get_var( $wpdb->prepare(
30 "SELECT COUNT(*) FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = %s",
31 $post_id,
32 $meta_key
33 ) )
34 );
35 } )
36 );
37
38 if( ! count( $valid_post_ids ) ){
39 return false;
40 }
41
42 // Sanitization
43 $meta_key = wp_unslash( $meta_key );
44 $meta_value = sanitize_meta( $meta_key, wp_unslash( $meta_value ), 'post' );
45
46 // Collect data and format strings for a single INSERT
47 $insert_data = [];
48 $insert_formats = [];
49
50 foreach( $valid_post_ids as $post_id ){
51 array_push( $insert_data, $post_id, $meta_key, $meta_value );
52 $insert_formats[] = '(%d, %s, %s)';
53 }
54
55 $sql_string = "INSERT INTO $wpdb->postmeta (`post_id`, `meta_key`, `meta_value`) VALUES "
56 . implode( ', ', $insert_formats );
57
58 // ... unpacks the array into separate arguments for prepare
59 $sql_query = $wpdb->prepare( $sql_string, ...$insert_data );
60
61 return $wpdb->query( $sql_query );
62 }
63}

Her er hva som skjer linje for linje. !function_exists-sjekken er en beskyttelse mot konflikter: hvis en annen plugin allerede har deklarert en funksjon med det navnet, vil det ikke oppstå noen fatal feil. is_numeric($post_ids)-blokken sender en enkelt ID til den innebygde add_post_meta, slik at samme funksjon fungerer med både et enkelt innlegg og en array. array_filter-filteret forkaster ID-er for utkast, slettede poster og de der det unike feltet allerede finnes. Sanering via wp_unslash og sanitize_meta er obligatorisk: uten det vil serialiserte data og spesialtegn ødelegge spørringen.

*Viktig merknad om ...$insert_data.* ... (splat)-operatoren pakker ut arrayen til en flat liste med argumenter. Uten den ville $wpdb->prepare mottatt ett array-argument i stedet for et sett med (%d, %s, %s), og spørringen ville feilet med en plassholderantallsfeil. PHP 5.6+ (WordPress krever minimum 7.0, så du er trygg).

Slik bruker du den

Send inn en array med innleggs-ID-er, nøkkelen og verdien som et vanlig kall. Den fjerde parameteren, unikhetsflagget: true vil ikke legge til feltet hvis det allerede finnes for innlegget.

1$post_ids = [ 1, 2, 3, 42, 108 ];
2$meta_key = 'featured_priority';
3$meta_value = 'high';
4$unique = false; // will set for all, even if the field already existed
5
6add_multiple_posts_meta( $post_ids, $meta_key, $meta_value, $unique );

Det er praktisk å kjøre et slikt kall via init-hooken (én gang, fjern den deretter) eller via WP-CLI med wp eval-file-kommandoen. Etter kjøring må du huske å fjerne koden fra functions.php, ellers vil funksjonen kjøre på hver sidevisning.

Metode 2. Løkke over ID-er med add_post_meta

Hvis du ikke vil røre SQL direkte, bruk den innebygde add_post_meta i en løkke. Koden er fire ganger kortere og støtter seg fullstendig på WordPress-kjernen.

1$post_ids = [ 1, 2, 3, 42, 108 ];
2$meta_key = 'featured_priority';
3$meta_value = 'high';
4$unique = false;
5
6foreach( $post_ids as $post_id ){
7 add_post_meta( $post_id, $meta_key, $meta_value, $unique );
8}

Løkken itererer over arrayen og kaller add_post_meta for hver ID. Funksjonen sjekker selv postens eksistens, nøkkelunikhet (hvis $unique = true er satt) og datakorrekthet; ingen ytterligere validering er nødvendig.

Ytelse. Med hundre innlegg er forskjellen fra SQL-spørringen umerkelig. Men hvis du har 5 000 poster, genererer hvert add_post_meta-kall en separat INSERT, pluss interne hooker (added_post_meta, update_post_meta_cache). Ved slike volumer vil den første metoden med én enkelt spørring kjøre 10-20 ganger raskere.

For engangsoperasjoner med et par dusin innlegg, bruk løkken, ikke overkompliser ting.

Sammenligning av tilnærminger

Kriterium

Metode 1 (enkelt SQL)

Metode 2 (add_post_meta-løkke)

Hastighet på 5 000 innlegg

~0,2 sek (1 spørring)

~3-6 sek (5 000 spørringer)

Kodekompleksitet

~50 linjer med validering

4 linjer

Sikkerhet

Manuell sanering nødvendig

add_post_meta håndterer alt

WordPress-hooker

Kalles ikke

added_post_meta, update_post_meta_cache

Når du bør velge

Masseimport, CSV-import

Engangsredigeringer, opptil hundre innlegg

En universell regel: hvis det er færre enn hundre innlegg og operasjonen er en engangsforeteelse, bruk løkken. Hvis det innebærer regelmessig synkronisering eller migrering av tusenvis av poster, kun den direkte spørringen med den forberedte funksjonen.

⁉️🤔 Vanlige spørsmål

Kan jeg tildele et felt selektivt, bare til innlegg fra en bestemt kategori?

Ja. Hent innleggs-ID-ene via get_posts med 'category' => ID_рубрики-parameteren, og send deretter arrayen til en av de to metodene ovenfor. For tusenvis av innlegg, legg til 'numberposts' => -1 og 'fields' => 'ids'; spørringen vil bare returnere en array med ID-er, uten å laste objekter.

Her er et klart til bruk-eksempel: $post_ids = get_posts( [ 'category' => 5, 'numberposts' => -1, 'fields' => 'ids', 'post_type' => 'post' ] );. Kall deretter add_multiple_posts_meta($post_ids, ...) eller en løkke med add_post_meta.

Hva om jeg trenger en annen feltverdi for forskjellige innlegg?

Masseinnsetting vil ikke fungere her. Bygg en assosiativ array [ ID_поста => значение ] og iterer over den i en løkke med add_post_meta eller update_post_meta. Én verdi for alle, SQL; forskjellige verdier for forskjellige innlegg, kun en løkke.

For 50+ innlegg med unike verdier, bruk update_post_meta i stedet for add_post_meta: den oppretter ikke duplikater hvis feltet allerede finnes.

Er det trygt å skrive SQL-spørringer direkte til wp_postmeta?

Det er trygt under to forutsetninger. For det første: kjør alltid data gjennom $wpdb->prepare; den unnslipper spesialtegn og blokkerer SQL-injeksjoner. For det andre: ta en full sikkerhetskopi av databasen før du kjører. Én feilaktig UPDATE uten WHERE, og wp_postmeta tømmes for alle poster.

Sikkerhetskopikommando via WP-CLI: wp db export backup-before-meta.sql. Gjenoppretting: wp db import backup-before-meta.sql.

Hvordan skiller add_post_meta seg fra update_post_meta?

add_post_meta legger til en ny rad i wp_postmeta, selv om nøkkelen allerede finnes for innlegget, noe som resulterer i en duplikat. update_post_meta sjekker om nøkkelen finnes: hvis den finnes, oppdaterer den verdien; hvis ikke, oppretter den den. For massepopulering der det er én nøkkel per innlegg, gir add_post_meta med $unique = true samme effekt.

I praksis: add_post_meta($id, 'views', 0, true) vil opprette feltet én gang og aldri røre det igjen. update_post_meta($id, 'views', $count) vil overskrive verdien ved hvert kall.

Hvor bør jeg plassere koden, i temaet eller en plugin?

For engangsoperasjoner, i child themeets functions.php, med umiddelbar fjerning etter kjøring. For gjentakende oppgaver, pakk den som en Must-Use-plugin (wp-content/mu-plugins/-mappen) eller legg den til i Code Snippets med «Kjør én gang»-flagget. Kode i et aktivt tema uten fjerning vil treffe databasen på hver sidevisning; det er unødvendig belastning.

Hva du bør velge for din oppgave

Praksis viser: 9 av 10 tilfeller dekkes av løkken med add_post_meta. Det er fire linjer kode, en innebygd funksjon og ingen overraskelser.

En direkte SQL-spørring er berettiget i to situasjoner: masseimport (tusenvis av innlegg, tid er verdifullt) og periodisk synkronisering der du kontrollerer sanering ved inndata. Ellers, ikke overkompliser ting.

Hva du bør gjøre nå:

  • Hvis du trenger å tildele et felt til ≤100 innlegg, kopier løkken fra den andre metoden, plugg inn dine ID-er og kjør den.
  • Hvis det er flere tusen innlegg, ta funksjonen fra den første metoden, men test den på en sidekopi først.
  • I ethvert scenario, ta sikkerhetskopi av databasen før du kjører. Dette er ikke en forholdsregel; det er en regel.

Og hvilken metode bruker du vanligvis for å legge til egendefinerte felt: via administrasjonspanelet, kode eller en plugin som ACF? Skriv i kommentarfeltet, det er interessant å sammenligne tilnærminger.