
🛠 Hur du lägger till ett anpassat fält till många inlägg i WordPress
En webbplats på WordPress har vuxit till hundratals inlägg, och varje inlägg behöver ett nytt anpassat fält. Att öppna varje inlägg för hand och klicka på "Uppdatera" är minst en halvdags jobb.
Särskilt om du finslipar ett tema eller kopplar in ett SEO-plugin som behöver samma meta_key över hela inläggsflödet. WordPress adminpanel erbjuder ingen "tillämpa på alla"-knapp, men den ger dig två sätt att lösa detta med kod.
Här nedanför finns båda metoderna med färdiga kodsnuttar: snabb (en SQL-fråga för hela batchen) och enkel (en loop över ID:n med den inbyggda funktionen add_post_meta). Välj utifrån uppgiften.

💡 Snabb översikt:
- Du kan masstilldela samma anpassade fält till alla inlägg med
add_post_metai en loop, 4 rader kod. - Om det finns hundratals inlägg och hastighet spelar roll, använd en direkt INSERT i
wp_postmeta-tabellen via en anpassad funktion. - Båda metoderna fungerar via temats
functions.phpeller tillägget Code Snippets. Säkerhetskopiera databasen innan du kör någon SQL.
Varför lägga till ett fält i många inlägg på en gång
Anpassade fält (även kallade post meta) lagrar extra information om en post: visningsantal, taggar för intern filtrering, en "favorit"-flagga, ett relaterat produkt-ID. Allt som inte passar i standardfälten post_title och post_content.
Vanligtvis läggs ett fält till från fall till fall: öppna ett inlägg, hitta blocket "Anpassade fält" i redigeraren, ange ett nyckel-värde-par. Men när fältet måste finnas på alla 200 inlägg samtidigt är den manuella metoden utesluten.
Typiska scenarier där massåtgärd behövs:
- Du aktiverade ett barntema som använder
get_post_meta($post_id, 'featured_post', true)för att markera populära inlägg. Utan massifyllning kommer gamla inlägg inte att visas i utdatan. - En SEO-revision krävde att
noindexsätts för en specifik innehållstyp via ett metafält, snarare än via robots.txt. - Migrering från en annan plattform: data från det gamla CMS:et hamnade i en CSV, och den måste laddas in i
wp_postmetaför tusentals poster.
WordPress har ingen inbyggd funktion add_multiple_posts_meta. Men det finns två beprövade vägar, välj utifrån situationen.
Metod 1. En SQL-fråga för alla inlägg
Den snabbaste metoden, en direkt INSERT i wp_postmeta-tabellen i en enda transaktion. Istället för 200 individuella databasfrågor gör du en, och den körs på millisekunder.
Här nedanför finns funktionen add_multiple_posts_meta, som tar emot en array med post-ID:n och speglar signaturen hos den inbyggda add_post_meta: samma parametrar, samma ordning.
Lägg till koden i barntemats functions.php eller via tillägget Code Snippets. Funktionen kontrollerar själv om ett sådant fält redan finns för posten (om $unique = true skickas med) och filtrerar bort ogiltiga ID:n.
1 if( !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 }
Vad som händer här rad för rad. Kontrollen !function_exists är en skyddsmekanism mot konflikter: om ett annat tillägg redan har deklarerat en funktion med det namnet blir det inget fatalt fel. Blocket is_numeric($post_ids) skickar ett enskilt ID till den inbyggda add_post_meta, så samma funktion fungerar med både ett enskilt inlägg och en array. array_filter-filtret kastar bort ID:n för utkast, raderade poster och de där det unika fältet redan finns. Sanering via wp_unslash och sanitize_meta är obligatoriskt: utan det kommer serialiserad data och specialtecken att förstöra frågan.
*Viktig notering om ...$insert_data.* Operatorn ... (splat) packar upp arrayen till en platt lista med argument. Utan den skulle $wpdb->prepare ta emot ett array-argument istället för en uppsättning (%d, %s, %s), och frågan skulle misslyckas med ett platshållarantal-fel. PHP 5.6+ (WordPress kräver minst 7.0, så du är säker).
Så här använder du
Skicka en array med post-ID:n, nyckeln och värdet som ett vanligt anrop. Den fjärde parametern, unikhetsflaggan: true kommer inte att lägga till fältet om det redan finns för posten.
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 6 add_multiple_posts_meta( $post_ids, $meta_key, $meta_value, $unique );
Det är praktiskt att köra ett sådant anrop via init-hooken (en gång, ta sedan bort det) eller via WP-CLI med kommandot wp eval-file. Efter körning, se till att ta bort koden från functions.php, annars kommer funktionen att köras vid varje sidladdning.
Metod 2. Loopa över ID:n med add_post_meta
Om du inte vill röra SQL direkt, använd den inbyggda add_post_meta i en loop. Koden är fyra gånger kortare och förlitar sig helt på WordPress kärna.
1 $post_ids = [ 1, 2, 3, 42, 108 ]; 2 $meta_key = 'featured_priority'; 3 $meta_value = 'high'; 4 $unique = false; 5 6 foreach( $post_ids as $post_id ){ 7 add_post_meta( $post_id, $meta_key, $meta_value, $unique ); 8 }
Loopen itererar över arrayen och anropar add_post_meta för varje ID. Funktionen kontrollerar själv postens existens, nyckelunikhet (om $unique = true är satt) och datakorrekthet; ingen ytterligare validering behövs.
Prestanda. Med hundra inlägg är skillnaden mot SQL-frågan omärkbar. Men om du har 5 000 poster genererar varje add_post_meta-anrop en separat INSERT, plus interna hookar (added_post_meta, update_post_meta_cache). Vid sådana volymer kommer den första metoden med en enda fråga att gå 10-20 gånger snabbare.
För engångsoperationer med ett par dussin inlägg, använd loopen, överkomplicera inte saker.
Jämförelse av tillvägagångssätt
Kriterium | Metod 1 (enkel SQL) | Metod 2 (add_post_meta-loop) |
|---|---|---|
Hastighet vid 5 000 inlägg | ~0,2 sek (1 fråga) | ~3-6 sek (5 000 frågor) |
Kodkomplexitet | ~50 rader med validering | 4 rader |
Säkerhet | Manuell sanering krävs | add_post_meta hanterar allt |
WordPress-hookar | Anropas inte | added_post_meta, update_post_meta_cache |
När man ska välja | Massmigrering, CSV-import | Engångsredigeringar, upp till hundra inlägg |
En universell regel: om det finns färre än hundra inlägg och operationen är en engångsföreteelse, använd loopen. Om det handlar om regelbunden synkronisering eller migrering av tusentals poster, endast den direkta frågan med den preparerade funktionen.
⁉️🤔 Vanliga frågor
Kan jag tilldela ett fält selektivt, bara till inlägg från en specifik kategori?
Ja. Hämta post-ID:n via get_posts med parametern 'category' => ID_рубрики, skicka sedan arrayen till någon av de två metoderna ovan. För tusentals inlägg, lägg till 'numberposts' => -1 och 'fields' => 'ids'; frågan returnerar endast en array med ID:n, utan att ladda objekt.
Här är ett färdigt exempel:
$post_ids = get_posts( [ 'category' => 5, 'numberposts' => -1, 'fields' => 'ids', 'post_type' => 'post' ] );. Anropa sedanadd_multiple_posts_meta($post_ids, ...)eller en loop medadd_post_meta.
Vad händer om jag behöver ett annat fältvärde för olika inlägg?
Massinsättning fungerar inte här. Bygg en associativ array [ ID_поста => значение ] och iterera över den i en loop med add_post_meta eller update_post_meta. Ett värde för alla, SQL; olika värden för olika inlägg, endast en loop.
För 50+ inlägg med unika värden, använd
update_post_metaistället föradd_post_meta: den skapar inga dubbletter om fältet redan finns.
Är det säkert att skriva SQL-frågor direkt mot wp_postmeta?
Det är säkert under två förutsättningar. För det första: kör alltid data genom $wpdb->prepare; den escapar specialtecken och blockerar SQL-injektioner. För det andra: gör en fullständig databassäkerhetskopia innan du kör. En felaktig UPDATE utan WHERE, och wp_postmeta rensas för alla poster.
Backup-kommando via WP-CLI:
wp db export backup-before-meta.sql. Återställning:wp db import backup-before-meta.sql.
Hur skiljer sig add_post_meta från update_post_meta?
add_post_meta lägger till en ny rad i wp_postmeta, även om nyckeln redan finns för posten, vilket resulterar i en dubblett. update_post_meta kontrollerar nyckelns existens: om den finns uppdateras värdet; om inte skapas det. För massifyllning där det finns en nyckel per post ger add_post_meta med $unique = true samma effekt.
I praktiken:
add_post_meta($id, 'views', 0, true)skapar fältet en gång och rör det aldrig igen.update_post_meta($id, 'views', $count)skriver över värdet vid varje anrop.
Var ska jag placera koden, i temat eller ett tillägg?
För engångsoperationer, i barntemats functions.php, med omedelbar borttagning efter körning. För återkommande uppgifter, paketera det som ett Must-Use-tillägg (mappen wp-content/mu-plugins/) eller lägg till det i Code Snippets med flaggan "Kör en gång". Kod i ett aktivt tema utan borttagning kommer att träffa databasen vid varje sidladdning; det är onödig belastning.
Vad du ska välja för din uppgift
Praktiken visar: 9 av 10 fall täcks av loopen med add_post_meta. Det är fyra rader kod, en inbyggd funktion och inga överraskningar.
En direkt SQL-fråga är motiverad i två situationer: massmigrering (tusentals inlägg, tid är värdefull) och periodisk synkronisering där du kontrollerar sanering vid inmatning. Annars, överkomplicera inte saker.
Vad du ska göra just nu:
- Om du behöver tilldela ett fält till ≤100 inlägg, kopiera loopen från den andra metoden, koppla in dina ID:n och kör den.
- Om det finns flera tusen inlägg, ta funktionen från den första metoden, men testa den på en kopia av webbplatsen först.
- I alla scenarier, säkerhetskopiera databasen innan du kör. Detta är inte en försiktighetsåtgärd; det är en regel.
Och vilken metod brukar du använda för att lägga till anpassade fält: via adminpanelen, kod eller ett tillägg som ACF? Skriv i kommentarerna, det är intressant att jämföra tillvägagångssätt.

![🛠 Hur du lägger till din egen shortcode i WordPress: add_shortcode() förklarat [+2 exempel]](/api/media/file/ai-cover-1785346567950.avif)
