Den “berømte 5-minuttersinstallasjonen” er et markedsføringsslagord, ikke en profesjonell standard. En standardinstallasjon av WordPress er “pratsom”, uoptimalisert og ofte usikker.
Som utviklere “installerer” vi ikke bare WordPress. Vi gjør det klart til å kjøre i et bestemt miljø. Denne guiden dekker de viktigste konfigurasjonskonstantene og herdingsteknikkene som bør inngå i grunnoppsettet for hvert kundeprosjekt i 2026.
Konfigurere wp-config.php etter at WordPress er installert
Dette er hjernen i installasjonen din. Slutt å la den stå på standardinnstillingene.
Sette WP_ENVIRONMENT_TYPE i wp-config.php
Fra WordPress 5.5 er WP_ENVIRONMENT_TYPE standard. Bruk den for å hindre at utviklingsfeil lekker ut i produksjon.
// I wp-config.php
define( 'WP_ENVIRONMENT_TYPE', 'production' ); // 'local', 'development', 'staging', 'production'Deretter i koden din:
if ( wp_get_environment_type() === 'production' ) {
// Slå på hurtigbuffer, slå av feilmeldinger
}Slå av filredigering og tvinge SSL i wp-config.php
Hindre at kunder (eller angripere) ødelegger nettstedet via administrasjonspanelet.
// Slå av filredigereren (tema-/utvidelsesredigerer)
define( 'DISALLOW_FILE_EDIT', true );
// Blokker installasjon/oppdatering av utvidelser (bra for uforanderlige utrullinger)
define( 'DISALLOW_FILE_MODS', true );
// Tving SSL i admin
define( 'FORCE_SSL_ADMIN', true );Slik begrenser du innleggsrevisjoner i WordPress
Databasedreperen. Trenger du virkelig 100 versjoner av “Om oss”-siden?
define( 'WP_POST_REVISIONS', 10 ); // Behold de siste 10
// ELLER
define( 'WP_POST_REVISIONS', false ); // Slå av helt (anbefales ikke)Slik slår du på WP_DEBUG_LOG uten å vise feil
Vis aldri feil i frontend. Logg dem.
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', '/tmp/wp-errors.log' ); // Flytt loggen ut av den offentlige katalogen!
define( 'WP_DEBUG_DISPLAY', false );
// Logg SQL-spørringer for ytelsesfeilsøking (slå av i produksjon!)
define( 'SAVEQUERIES', false );Slik slår du av emoji og XML-RPC i WordPress
WordPress leveres med funksjoner som 90% av bedriftsnettsteder ikke trenger: emoji, oEmbeds og XML-RPC.
Ikke installer en utvidelse for å slå dem av. Lag en must-use-utvidelse (wp-content/mu-plugins/lean-core.php).
<?php
/* Plugin Name: Lean Core */
// 1. Slå av emoji (sparer en HTTP-forespørsel)
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'wp_print_styles', 'print_emoji_styles' );
// 2. Slå av XML-RPC (sikkerhet)
add_filter( 'xmlrpc_enabled', '__return_false' );
// 3. Fjern WP-versjonen (security by obscurity)
remove_action( 'wp_head', 'wp_generator' );
// 4. Slå av RSS-strømmer (hvis du bygger et enkelt bedriftsnettsted)
// function wppoland_disable_feed() {
// wp_die( 'Ingen strøm her, besøk forsiden vår!' );
// }
// add_action('do_feed', 'wppoland_disable_feed', 1);Bytte salt-nøklene i wp-config.php
Du kjenner autentiseringsnøklene i wp-config.php.
define('AUTH_KEY', 'skriv inn din unike frase her');
// ...Fakta: Når du endrer dem, logges alle brukere ut umiddelbart. Det er “atomknappen” hvis nettstedet er hacket. Profftips: Automatiser rotasjonen med et CLI-skript eller Vault hvis du drifter enterprise-nettsteder.
Hva du bør sette i wp-config.php før nettstedet lanseres
Før lansering:
- Sett
WP_ENVIRONMENT_TYPEtil production. - Sett
DISALLOW_FILE_EDITtil true. - Begrens
WP_POST_REVISIONS. - Flytt
WP_DEBUG_LOGtil en privat mappe. - Slå av emoji/XML-RPC i kode.
En godt konfigurert WordPress-instans er stille, sikker og rask.
Hvilke permalenker du bør velge i WordPress
Optimal permalenkestruktur
Innstillinger > Permalenker > InnleggsnavnHvorfor:
- Kortere og mer lesbare URL-er
- Bedre for SEO (søkeord i URL-en)
- Lettere å huske og dele
Konfigurasjon i wp-config.php:
// Tving permalenkestrukturen (valgfritt)
define('WP_POST_REVISIONS', 10);Struktur for kategorier og stikkord
- Opprett grunnleggende kategorier (3-7 hovedkategorier)
- Definer hierarkiet (over- og underkategorier)
- Velg en standardkategori (ikke “Ukategorisert”)
- Planlegg en stikkordstrategi (valgfritt, 5-10 stikkord per innlegg)
Medieinnstillinger og bildestørrelser i WordPress
Bildestørrelser
Innstillinger > MediaAnbefalte innstillinger:
- Miniatyrbilde: 150x150px (huk av for å beskjære miniatyrbildet til nøyaktige mål)
- Middels: 300x300px
- Stor: 1024x1024px
- Full størrelse: alltid tilgjengelig
Automatisk bildeoptimalisering
// I mu-plugin: wp-content/mu-plugins/image-optimization.php
<?php
/* Plugin Name: Image Optimization */
// Ikke generer ekstra størrelser du ikke bruker
function remove_unused_image_sizes() {
remove_image_size('1536x1536'); // WordPress 5.3+
remove_image_size('2048x2048'); // WordPress 5.3+
}
add_action('init', 'remove_unused_image_sizes');
// Slå på lazy loading for bilder
add_filter('wp_lazy_loading_enabled', '__return_true');
// Optimaliser bilder ved opplasting
add_filter('wp_image_editors', function($editors) {
return ['WP_Image_Editor_Imagick', 'WP_Image_Editor_GD'];
});Slik slår du på WebP-opplasting i WordPress
// Slå på WebP (krever støtte på serveren)
add_filter('wp_upload_image_mime_transforms', function($transforms) {
$transforms['image/jpeg'] = ['image/webp', 'image/jpeg'];
$transforms['image/png'] = ['image/webp', 'image/png'];
return $transforms;
});Slik sikrer du WordPress etter installasjon
Endre standard tabellprefiks
Under installasjonen: Skriv inn et eget prefiks i stedet for wp_ (for eksempel x7k9_, mysite_, proj23_)
Etter installasjonen (avansert):
-- Endre prefikset i phpMyAdmin (ta sikkerhetskopi først!)
RENAME TABLE wp_posts TO x7k9_posts;
RENAME TABLE wp_options TO x7k9_options;
-- ... gjenta for alle tabeller
-- Oppdater wp-config.php
define('DB_PREFIX', 'x7k9_');Beskytte filen wp-config.php
# I .htaccess (rotkatalogen til WordPress)
<files wp-config.php>
order allow,deny
deny from all
</files>
# Ekstra beskyttelse
<files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
</files>Blokkere tilgang til kataloger
# I wp-content/uploads/.htaccess
Options -Indexes
# I wp-includes/.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>Begrense påloggingsforsøk
// I mu-plugin: wp-content/mu-plugins/login-security.php
<?php
/* Plugin Name: Login Security */
// Begrens påloggingsforsøk (uten utvidelse)
add_action('wp_login_failed', function($username) {
$ip = $_SERVER['REMOTE_ADDR'];
$attempts = get_transient('login_attempts_' . $ip);
if ($attempts === false) {
set_transient('login_attempts_' . $ip, 1, HOUR_IN_SECONDS);
} else {
set_transient('login_attempts_' . $ip, $attempts + 1, HOUR_IN_SECONDS);
if ($attempts >= 5) {
wp_die('For mange påloggingsforsøk. Prøv igjen om en time.');
}
}
});
// Skjul WordPress-versjonen
remove_action('wp_head', 'wp_generator');
add_filter('the_generator', '__return_empty_string');Tofaktorautentisering (2FA)
// Krev sterke passord
add_action('user_profile_update_errors', function($errors) {
$password = $_POST['pass1'];
if (!empty($password) && strlen($password) < 12) {
$errors->add('password_error', 'Passordet må ha minst 12 tegn.');
}
});Slik gjør du WordPress raskere etter installasjon
Grunnleggende databaseoptimalisering
// I wp-config.php
// Begrens innleggsrevisjoner
define('WP_POST_REVISIONS', 10);
// Tøm papirkurven automatisk etter 7 dager
define('EMPTY_TRASH_DAYS', 7);
// Slå av filredigereren (sikkerhet + ytelse)
define('DISALLOW_FILE_EDIT', true);Rydde i databasen
// I mu-plugin: wp-content/mu-plugins/db-cleanup.php
<?php
/* Plugin Name: DB Cleanup */
// Slett gamle revisjoner (behold de siste 10)
add_action('wp_scheduled_auto_draft_delete', function() {
global $wpdb;
$wpdb->query("DELETE FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY)");
$wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_%' AND option_value < UNIX_TIMESTAMP()");
$wpdb->query("OPTIMIZE TABLE {$wpdb->posts}, {$wpdb->options}, {$wpdb->postmeta}");
});Optimalisere Heartbeat API
// Senk frekvensen til Heartbeat
add_filter('heartbeat_settings', function($settings) {
$settings['interval'] = 60; // sekunder (standard 15)
return $settings;
});
// Slå av Heartbeat i frontend
add_action('init', function() {
if (!is_admin()) {
wp_deregister_script('heartbeat');
}
}, 1);Fjerne RSD-, kortlenke- og REST API-lenker fra wp_head
// I mu-plugin: wp-content/mu-plugins/disable-bloat.php
<?php
/* Plugin Name: Disable Bloat */
// Slå av emoji
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
// Slå av XML-RPC
add_filter('xmlrpc_enabled', '__return_false');
// Slå av RSD-lenken
remove_action('wp_head', 'rsd_link');
// Slå av Windows Live Writer-lenken
remove_action('wp_head', 'wlwmanifest_link');
// Slå av kortlenken
remove_action('wp_head', 'wp_shortlink_wp_head');
// Slå av REST API-lenken (hvis du ikke bruker den)
remove_action('wp_head', 'rest_output_link_wp_head');Grunnleggende SEO-innstillinger i WordPress
Nettstedstittel, slagord og synlighet for søkemotorer
Innstillinger > Generelt:
- Nettstedstittel: [Ditt merke] | [Kort beskrivelse]
- Slagord: 2-3 setninger om nettstedet (metabeskrivelse)
- Synlighet for søkemotorer: IKKE huk av for "Be søkemotorer om ikke å indeksere dette nettstedet"SEO-vennlig permalenkestruktur
Innstillinger > Permalenker > InnleggsnavnXML-nettstedskart
// Slå på WordPress sitt innebygde nettstedskart
add_filter('wp_sitemaps_enabled', '__return_true');
// Legg egne innholdstyper til i nettstedskartet
add_filter('wp_sitemaps_post_types', function($post_types) {
$post_types[] = 'portfolio';
return $post_types;
});Grunnleggende bildeoptimalisering for SEO
// Automatiske ALT-attributter (reserveløsning)
add_filter('wp_get_attachment_image_attributes', function($attributes, $attachment) {
if (empty($attributes['alt'])) {
$attributes['alt'] = get_the_title($attachment->ID);
}
return $attributes;
}, 10, 2);
// Bildetitler
add_filter('wp_insert_attachment_data', function($data, $postarr) {
if (empty($data['post_title'])) {
$filename = basename($data['guid']);
$data['post_title'] = sanitize_title($filename);
}
return $data;
}, 10, 2);Slik tar du sikkerhetskopi av WordPress
Automatiske kopier av databasen
// I mu-plugin: wp-content/mu-plugins/backup-scheduler.php
<?php
/* Plugin Name: Backup Scheduler */
// Daglig kopi av databasen
add_action('daily_database_backup', function() {
$upload_dir = wp_upload_dir();
$backup_dir = $upload_dir['basedir'] . '/backups';
if (!file_exists($backup_dir)) {
wp_mkdir_p($backup_dir);
}
$filename = $backup_dir . '/db-backup-' . date('Y-m-d-H-i-s') . '.sql';
// Bruk WP-CLI eller mysqldump
exec('mysqldump --user=' . DB_USER . ' --password=' . DB_PASSWORD . ' --host=' . DB_HOST . ' ' . DB_NAME . ' > ' . $filename);
// Slett gamle kopier (behold de siste 7)
$files = glob($backup_dir . '/db-backup-*.sql');
if (count($files) > 7) {
array_multisort(array_map('filemtime', $files), SORT_ASC, $files);
for ($i = 0; $i < count($files) - 7; $i++) {
unlink($files[$i]);
}
}
});
// Planlegg jobben
if (!wp_next_scheduled('daily_database_backup')) {
wp_schedule_event(time(), 'daily', 'daily_database_backup');
}Sette opp eksterne kopier
Anbefalte løsninger:
- UpdraftPlus: gratisversjonen holder for små nettsteder
- BlogVault: betalt, men svært pålitelig
- WPvivid: et godt gratis alternativ
Konfigurasjon:
- Daglig kopi (database)
- Ukentlig kopi (fullstendig)
- Oppbevaring: minst 30 dager
- Ekstern plassering: Google Drive, Dropbox, S3
Konfigurere SMTP i WordPress
SMTP i stedet for mail()
// I wp-config.php eller en mu-plugin
define('SMTP_USER', '[email protected]');
define('SMTP_PASS', 'your-password');
define('SMTP_HOST', 'smtp.gmail.com');
define('SMTP_PORT', '587');
define('SMTP_SECURE', 'tls');
define('SMTP_FROM', '[email protected]');
define('SMTP_NAME', 'Ditt nettsted');
// I mu-plugin
add_action('phpmailer_init', function($phpmailer) {
$phpmailer->isSMTP();
$phpmailer->Host = SMTP_HOST;
$phpmailer->SMTPAuth = true;
$phpmailer->Username = SMTP_USER;
$phpmailer->Password = SMTP_PASS;
$phpmailer->SMTPSecure = SMTP_SECURE;
$phpmailer->Port = SMTP_PORT;
$phpmailer->From = SMTP_FROM;
$phpmailer->FromName = SMTP_NAME;
});Slik sender du en test-e-post fra WordPress
// Testfunksjon (kjør én gang)
add_action('admin_init', function() {
if (isset($_GET['test_email'])) {
wp_mail(get_option('admin_email'), 'Test Email', 'Dette er en testmelding fra WordPress.');
wp_die('Test-e-post sendt!');
}
});Overvåking av WordPress og feillogging
Feillogging
// I wp-config.php
define('WP_DEBUG', false);
define('WP_DEBUG_LOG', '/var/log/wp-errors.log'); // Utenfor den offentlige katalogen
define('WP_DEBUG_DISPLAY', false);
// Logging av SQL-spørringer (bare i feilsøkingsmodus)
// define('SAVEQUERIES', true);Oppetidsovervåking
Anbefalte verktøy:
- UptimeRobot (gratisplan: 50 monitorer, 5-minuttersintervaller)
- Pingdom (betalt, men mer avansert)
- Better Uptime (moderne alternativ)
Logge administratorinnlogginger og innleggsendringer
// I mu-plugin: wp-content/mu-plugins/activity-log.php
<?php
/* Plugin Name: Activity Log */
add_action('wp_login', function($user_login, $user) {
error_log('User logged in: ' . $user_login . ' from IP: ' . $_SERVER['REMOTE_ADDR']);
}, 10, 2);
add_action('save_post', function($post_id, $post, $update) {
if ($update && $post->post_status === 'publish') {
error_log('Post updated: ' . $post->post_title . ' by user: ' . get_current_user_id());
}
}, 10, 3);Hva du bør sjekke før du lanserer et WordPress-nettsted
Sjekkliste før lansering
- Alle SEO-innstillinger er riktige
- Nettstedskart er generert
- Google Search Console er satt opp
- Google Analytics er installert
- Personvernerklæring og vilkår er lagt til
- Kontaktskjemaer er testet
- E-post fungerer
- SSL fungerer (HTTPS)
- Videresending mellom www og uten www er satt opp
- Sikkerhetskopi er tatt
- Hurtigbufferutvidelser er konfigurert (valgfritt)
- CDN er konfigurert (valgfritt)
- Ytelsestester er kjørt (PageSpeed Insights)
- Tester av mobilvisning
- Tester i ulike nettlesere
- 404-side er satt opp
- Favicon er lagt til
Teste sjekksummer og filtilgang med WP-CLI og curl
# WP-CLI-tester
wp core verify-checksums
wp plugin verify-checksums --all
wp db check
# Sikkerhetstester
curl -I https://ditt-nettsted.no/wp-admin/install.php # Skal returnere 404
curl -I https://ditt-nettsted.no/wp-config.php # Skal returnere 403Oppsummering: sjekklisten med 50 punkter
Sikkerhet (1-15)
- ✅ Endre tabellprefikset i databasen
- ✅ Velg sterke passord (minst 12 tegn)
- ✅ Endre brukernavnet admin
- ✅ Slå av filredigereren i administrasjonen
- ✅ Blokker installasjon av utvidelser (valgfritt)
- ✅ Tving SSL i administrasjonspanelet
- ✅ Beskytt wp-config.php med .htaccess
- ✅ Blokker tilgang til kataloger (no indexes)
- ✅ Slå av XML-RPC
- ✅ Skjul WordPress-versjonen
- ✅ Begrens påloggingsforsøk
- ✅ Sett opp tofaktorautentisering (2FA)
- ✅ Roter autentiseringsnøklene (salts) jevnlig
- ✅ Installer et SSL-sertifikat
- ✅ Sett opp beskyttelse på servernivå (brannmur, begrensning av påloggingsforsøk)
Ytelse (16-25)
- ✅ Begrens innleggsrevisjoner (5-10)
- ✅ Slå av emoji
- ✅ Slå av ubrukte funksjoner (XML-RPC, RSD)
- ✅ Optimaliser bildestørrelser
- ✅ Slå på lazy loading
- ✅ Sett opp hurtigbuffer (objektbuffer, sidebuffer)
- ✅ Optimaliser Heartbeat API
- ✅ Slå på GZIP/Brotli-komprimering
- ✅ Sett opp CDN (valgfritt)
- ✅ Optimaliser databasen (automatisk opprydding)
SEO (26-35)
- ✅ Velg permalenkestrukturen “Innleggsnavn”
- ✅ Sett nettstedstittel og slagord
- ✅ Slå på XML-nettstedskartet
- ✅ Legg nettstedet til i Google Search Console
- ✅ Sett opp Google Analytics / GA4
- ✅ Optimaliser bilder (ALT-attributter)
- ✅ Lag kategoristrukturen
- ✅ Sett opp brødsmuler
- ✅ Legg til Organization-skjema
- ✅ Klargjør Open Graph-metatagger
Sikkerhetskopier (36-42)
- ✅ Sett opp automatiske kopier av databasen
- ✅ Sett opp ukentlige fullstendige kopier
- ✅ Oppbevar kopiene et eksternt sted
- ✅ Test gjenoppretting fra kopi
- ✅ Angi oppbevaringstid for kopier (minst 30 dager)
- ✅ Dokumenter gjenopprettingsrutinen
- ✅ Kontroller integriteten til kopiene jevnlig
Innhold og funksjonalitet (43-50)
- ✅ Lag grunnleggende sider (Om oss, Kontakt, Personvernerklæring)
- ✅ Sett opp navigasjonsmenyer
- ✅ Test alle skjemaer
- ✅ Sett opp SMTP for e-post
- ✅ Lag en egen 404-side
- ✅ Legg til favicon og PWA-ikoner
- ✅ Kjør ytelsestester
- ✅ Dokumenter konfigurasjonen
Se vår sikkerhetsrevisjon av WordPress hvis du vil få oversikt over risikoer og beskyttelse på nettstedet.
Forskjeller i wp-config.php mellom staging og produksjon
Denne guiden setter WP_DEBUG to ganger med ulike verdier: true i avsnittet om feilsøking og false i avsnittet om overvåking. Begge er riktige, hver for sitt miljø, og derfor bør ikke den samme kopien av wp-config.php havne uendret på både staging og produksjon. Før du flytter filen mellom servere, gå gjennom disse konstantene:
WP_ENVIRONMENT_TYPE:stagingpå testkopien,productionpå det levende nettstedet. Alle betingelser som bygger påwp_get_environment_type()avhenger av denne verdien.WP_DEBUG: på i staging, av i produksjon.WP_DEBUG_DISPLAYforblirfalsebegge steder, og loggen havner utenfor den offentlige katalogen.SAVEQUERIES: bare mens du leter etter trege spørringer, aldri i produksjon.DISALLOW_FILE_MODS: blokkerer i produksjon installasjon og oppdatering av utvidelser fra administrasjonen, så oppdateringer går via utrulling eller WP-CLI. Avklar dette med kunden før vedkommende legger merke til at oppdateringsknappen mangler.- Autentiseringsnøkler: genereres tilfeldig for hver installasjon. En kopi av produksjon på staging får sitt eget sett, og produksjonsnøklene lar du være i fred, fordi en endring logger ut alle brukere.
Når filen er flyttet, kjører du wp core verify-checksums og wp plugin verify-checksums --all fra avsnittet om tester før lansering.







