Skip to content

Allt om WordPress, webbutveckling — och mer därtill

📋 Komplett WordPress-fusklapp

📋 Komplett WordPress-fusklapp

Öppnade functions.php och glömde hur man kopplar in sidopanelen? Det händer alla som handkodar ett WordPress-tema. Du behöver en sida till hands, inte tio flikar på developer.wordpress.org.

Här hittar du grunderna i WordPress-utveckling: 13 mallfiler och hierarkin för att välja dem, den grundläggande loopen, include-taggar och bloginfo()-parametrar, sedan hooks och filter, villkorstaggar, inläsning av skript, shortcodes, WP_Query, dataescaping, REST API och WP-CLI-kommandon. Alla kodexempel fungerar. Ha den här fliken öppen under utvecklingen och kolla av medan du jobbar.

💡 Snabb översikt:

  • Bokmärk den här sidan och ha den öppen i en separat flik medan du bygger ditt tema.
  • Börja med avsnittet "Ett temas anatomi": skapa temafilerna från listan innan du skriver kod.
  • Kopiera den grundläggande WordPress-loopen till index.php och omslut den med include-taggar för sidhuvud, sidopanel och sidfot.
  • Släpp bloginfo()- och get_bloginfo()-taggar från tabellen direkt i mallarna och dubbelkolla mot kolumnen "Vad den matar ut".
  • Innan publicering, gå igenom reglerna för style.css: validera CSS, minifiera och lägg till utskriftsstilar.
  • Längre ner på sidan finns referensen: mallhierarki, hooks och filter, villkorstaggar, inläsning av skript, shortcodes, WP_Query, escaping, REST API och WP-CLI.

Ett WordPress-temas anatomi

Diagram över WordPress temafilstruktur

Ett WordPress-tema är en uppsättning PHP-filer som förenas av gemensam logik och styrs av mallhierarkin. Nyckelkomponenten: style.css, som hanterar det visuella och samtidigt fungerar som temats identifierare i adminpanelen. Men grunden i varje klassiskt tema är PHP-mallarna: var och en hanterar sin egen del av sidan och anropas i den ordning som WordPress-hierarkin bestämmer.

För att skapa ett standardtema behöver du följande filer, tretton stycken, som var och en täcker en specifik del av webbplatsen:

  • header.php, <head>-sektionen och sidans topp: metadata, webbplatsens titel, inkludering av style.css, öppnande <body>-tagg.
  • index.php, huvudmallen, startpunkten. Sätter ihop andra filer till en enhetlig sida via include-taggar. Om en specialiserad mall inte finns faller WordPress tillbaka på index.php.
  • sidebar.php, sidopanelen: widgetar, kategorier, sökning, sekundär meny.
  • footer.php, sidfoten: copyright, sociala länkar, analysskript, avslutande </body></html>-taggar.
  • page.php, mall för sidor (statiskt innehåll, "Om oss", "Kontakt").
  • single.php, mall för ett enskilt blogginlägg.
  • comments.php, kommentarsblock och kommentarsformulär.
  • 404.php, 404-felsida. Om den här filen saknas visar WordPress ett standardmeddelande från systemet, vilket är sämre för besökaren.
  • search.php, mall för sökresultat.
  • searchform.php, sökformulär (i klassiska teman; moderna använder ofta en widget).
  • archive.php, mall för arkiv: kategorier, taggar, datumarkiv.
  • functions.php, temats funktionella hjärta: anpassade hooks, inläsning av skript och stilar, menyregistrering, widgetområden, anpassade inläggstyper. Allt som lägger till funktionalitet i temat finns här.
  • style.css, den enda icke-PHP-filen på listan, men utan den existerar inte temat: den lagrar temats sidhuvud och definierar webbplatsens utseende.

Du klarar dig med färre mallar, till exempel utgör index.php + style.css redan ett minimalt tema. Men för en fullfjädrad webbplats är det bättre att ha alla tretton: varje fil är anpassad för sin egen uppgift, och WordPress väljer själv rätt fil enligt hierarkin. En typisk index.php ser ut så här:

1<?php get_header(); ?>
2
3<!-- Main content, including the Loop -->
4
5<?php get_sidebar(); ?>
6<?php get_footer(); ?>

Nu går vi vidare till det viktigaste kodfragmentet, utan vilket inte ett enda inlägg visas.

WordPress-loopen

Loopen är den centrala mekanismen för att mata ut innehåll. Utan den skulle du behöva koda visningen av varje inlägg och varje sida manuellt i temamallen. Loopen gör precis vad namnet lovar: den går igenom alla inlägg som matchar den aktuella frågan och applicerar din angivna HTML/PHP-uppmärkning på varje enskilt inlägg.

Grundläggande syntax för loopen:

1<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
2 <!-- HTML markup and template tags for each post -->
3<?php endwhile; endif; ?>

have_posts() kontrollerar om det finns inlägg att mata ut. Om det finns initierar the_post() WordPress interna pekare till det aktuella inlägget, varefter dussintals malltaggar blir tillgängliga inuti loopen: the_title() för titeln, the_content() för inläggstext, the_permalink() för länken, the_excerpt() för utdraget och många andra.

Loopen placeras vanligtvis i index.php för att mata ut en lista med inlägg, men inget hindrar dig från att använda den i single.php, page.php eller archive.php, logiken är densamma, bara sammanhanget skiljer sig. Inuti loopen lägger du till valfria HTML-omslag och PHP-taggar, WordPress applicerar dem på varje inlägg i tur och ordning.

Praktiskt exempel, utmatning av titel och datum för varje inlägg:

1<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
2 <article>
3 <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
4 <time><?php echo get_the_date(); ?></time>
5 </article>
6<?php endwhile; endif; ?>

Nu om hur loopen samverkar med resten av temat, via include-taggar.

Include-taggar för mallar

Include-taggar är PHP-funktioner som laddar innehållet från en temafil till en annan. De utgör stommen i en typisk index.php: sidhuvud, innehåll, sidopanel, sidfot. Fyra grundläggande funktioner:

  • <?php get_header(); ?>, inkluderar header.php. Vanligtvis den första raden i index.php och alla andra mallar som behöver ett sidhuvud.
  • <?php get_sidebar(); ?>, inkluderar sidebar.php. Om sidopanelen inte behövs tar du helt enkelt bort anropet.
  • <?php get_footer(); ?>, inkluderar footer.php. Alltid i slutet av mallen, avslutar sidan.
  • <?php comments_template(); ?>, inkluderar comments.php. Placeras inuti single.php, efter utmatning av inläggsinnehåll.

Alla fyra funktioner letar efter filer i den aktiva temamappen. Om filen inte finns matar WordPress helt enkelt inte ut något (förutom get_header() och get_footer(), deras frånvaro kommer att bryta layouten).

Nästa nivå, taggar som inte bara inkluderar filer utan hämtar data från databasen.

Bloginfo-taggar

Exempel på webbplatsdata via bloginfo-funktionen i WordPress

bloginfo()-taggarna hämtar information om webbplatsen från WordPress-databasen, samma information som du fyller i under Inställningar → Allmänt och i användarprofilen. Funktionen returnerar en sträng och matar omedelbart ut den på skärmen. De vanligaste parametrarna:

Parameter

Vad den matar ut

<?php bloginfo('name'); ?>

Webbplatsens titel

<?php bloginfo('url'); ?>

Webbplatsens URL

<?php bloginfo('description'); ?>

Tagline (webbplatsbeskrivning)

<?php bloginfo('charset'); ?>

Teckenkodning (standard UTF-8)

<?php bloginfo('stylesheet_url'); ?>

URL till det aktiva temats style.css

<?php bloginfo('version'); ?>

Installerad WordPress-version

<?php bloginfo('language'); ?>

Webbplatsens språk

<?php bloginfo('rss_url'); ?>

RSS-flödets URL (RSS 0.92)

<?php bloginfo('rss2_url'); ?>

RSS-flödets URL (RSS 2.0)

Det här är bara toppen av isberget, den fullständiga listan över parametrar finns i WordPress-dokumentationen.

Get_bloginfo(), när du behöver lagra istället för att mata ut

För fall där webbplatsinformation behöver användas i kod snarare än att bara visas på sidan, använd funktionen get_bloginfo():

1<?php $info = get_bloginfo( $show, $filter ); ?>
  • $show, nyckelordet. Värden som stöds är 'name' (titel), 'url' (adress), 'description' (tagline), 'admin_email' (administratörens e-post) med flera; fullständig lista i dokumentationen.
  • $filter, filtreringsläge: 'raw' (värde "som det är", standard) eller 'display' (värdet passerar genom wptexturize(), konverterar citattecken, tankstreck, tecken).

Exempel: hämta webbplatsbeskrivningen och mata ut den med ett prefix:

1<?php $site_description = get_bloginfo( 'description' ); ?>
2<?php echo 'Your site tagline: ' . esc_html( $site_description ); ?>

Resultat: "Din sajts tagline: Bästa premium WordPress-teman".

Förutom bloginfo har WordPress ett omfattande system med malltaggar: allmänna taggar, författartaggar, miniatyrbildstaggar, kategoritaggar, länktaggar, alla fungerar både inuti och utanför loopen, och kombinationer ger full kontroll över innehållsutmatningen.

Temastilmall

style.css har två roller. För det första, identifiering: sidhuvudet högst upp i filen talar om för WordPress temats namn, författare, version, licens. För det andra, visuellt: alla CSS-regler som styr webbplatsens utseende. Ett standard sidhuvud ser ut så här:

1/*
2Theme Name: Theme Name
3Theme URI: https://www.example.com/theme
4Author: Your Name
5Author URI: https://www.example.com/
6Description: Responsive WordPress theme with support for...
7Version: 1.0
8License: GNU General Public License v2 or later
9License URI: http://www.gnu.org/licenses/gpl-2.0.html
10Tags: responsive, two-columns, right-sidebar, custom-header
11Text Domain: mythemename
12*/

Bästa praxis när du arbetar med style.css:

  • Följ WordPress CSS-kodningsstandarder, konsekvent stil förenklar underhåll.
  • Validera CSS genom W3C-validatorn.
  • Minifiera CSS i produktion, men behåll en läsbar källa för utveckling.
  • Lägg till utskriftsstilar (@media print), många läsare skriver ut artiklar.
  • Stila alla standard HTML-element som kan dyka upp i inläggsinnehåll.

WordPress mallhierarki

För varje förfrågan avgör WordPress själv vilken PHP-fil från temat som ska inkluderas, detta är mallhierarkin. En regel: från den mest specifika filen till den mest generella, med index.php som sista reserv för varje gren. Att känna till ordningen tar bort frågan "varför syns inte min single.php-redigering på kategorisidan".

1Single post → single-{post_type}-{slug}.php → single-{post_type}.php → single.php → singular.php → index.php
2Page → {template from editor}.php → page-{slug}.php → page-{id}.php → page.php → singular.php → index.php
3Category → category-{slug}.php → category-{id}.php → category.php → archive.php → index.php
4Archive → archive-{post_type}.php → archive.php → index.php
5Search → search.php → index.php
6404 error → 404.php → index.php
7Front page → front-page.php → home.php → index.php

WordPress tar den första befintliga filen från vänster till höger. Så single-product.php kommer att åsidosätta single.php endast för inlägg av posttypen product, och lämnar resten orörda.

Hooks: actions och filters

Hooks är WordPress förlängningspunkter: de låter dig kroka in i kärnfunktionalitet utan att redigera dess filer. Actions utför en sidoeffekt (köa ett skript, skicka ett mejl), filters tar emot ett värde, modifierar det och måste returnera det tillbaka. En bortglömd return i ett filter är den vanligaste orsaken till tomt innehåll.

1// Registration
2add_action( 'hook_name', 'callback', 10, 1 ); // priority, number of arguments
3add_filter( 'hook_name', 'callback', 10, 1 );
4
5// Execution (in core or your code)
6do_action( 'hook_name', $arg ); // action: returns nothing
7apply_filters( 'hook_name', $value, $arg ); // filter: RETURNS value
8
9// Removal (priority must match the one used when adding)
10remove_action( 'hook_name', 'callback', 10 );

Exempel, lägg till ett stycke i slutet av varje inlägg:

1add_filter( 'the_content', 'my_append_note', 20 );
2function my_append_note( $content ) {
3 return $content . '<p>Thanks for reading!</p>'; // without return content disappears
4}

Viktiga tema-hooks:

  • after_setup_theme, registrera funktionsstöd (add_theme_support()), menyer, miniatyrstorlekar.
  • wp_enqueue_scripts, den enda korrekta platsen att köa frontend-CSS och JS.
  • init, tidig initiering: registrera posttyper och shortcodes.
  • the_content, filtrera inläggets HTML före utmatning.

Lägre prioritet körs tidigare (standard 10). För att en callback ska ta emot mer än ett argument, öka den fjärde parametern accepted_args.

Villkors-taggar

Villkors-taggar är funktioner som returnerar true eller false beroende på vilken sida som för närvarande är öppen. De bygger logiken för "visa sidofält här, men inte på 404".

1is_home() // blog post feed
2is_front_page() // site front page
3is_single() // single post
4is_page() // single page
5is_singular() // any single post/page/CPT
6is_archive() // any archive
7is_category() // category archive
8is_search() // search results page
9is_404() // 404 error page
10is_user_logged_in() // user is logged in
11is_admin() // request is in admin (NOT "user is administrator")

Huvudfälla: frågeberoende villkors-taggar (is_single, is_page, is_home med flera) fungerar bara efter att huvudfrågan har formats, vilket innebär inuti mallfiler och loopen eller från och med template_redirect-hooken. Att anropa tidigt i functions.php eller på init är för tidigt: WordPress kommer att utfärda _doing_it_wrong() och returnera ett felaktigt resultat. Undantag är is_admin() och is_user_logged_in(), de är inte beroende av frågan och är tillgängliga tidigare. Och kom ihåg: is_admin() kontrollerar kontext (admin vs frontend), inte roll; för roll använd current_user_can( 'manage_options' ).

Köa skript och stilmallar

Frestelsen att skriva <link> och <script> direkt i header.php är stark, men det är ett misstag: du förlorar beroendehantering, versionshantering för cache-busting, strategier för defer/async och skydd mot dubbel inläsning (två tillägg kan enkelt köa jQuery två gånger). Den korrekta vägen är WordPress-kön på wp_enqueue_scripts-hooken.

1add_action( 'wp_enqueue_scripts', 'my_theme_assets' );
2function my_theme_assets() {
3 // Theme style with version from style.css header
4 wp_enqueue_style(
5 'my-theme',
6 get_stylesheet_uri(),
7 array(),
8 wp_get_theme()->get( 'Version' )
9 );
10
11 // Script with dependency and modern syntax (WP 6.3+)
12 wp_enqueue_script(
13 'my-app',
14 get_theme_file_uri( 'assets/js/app.js' ),
15 array( 'jquery' ), // dependencies
16 '1.0.0', // version → cache busting
17 array(
18 'in_footer' => true,
19 'strategy' => 'defer',
20 )
21 );
22}

Från och med WordPress 6.3 är den sista parametern i wp_enqueue_script() en $args-array (in_footer, strategy), även om den gamla formen med boolean true för sidfot fortfarande fungerar. För frontend använd wp_enqueue_scripts, för admin använd admin_enqueue_scripts, för inloggningssidan använd login_enqueue_scripts.

Shortcodes

Shortcodes omvandlar en kort inmatning inom hakparenteser till godtycklig HTML, praktiskt för knappar, gallerier och formulär inuti innehåll. Hanteraren måste returnera en sträng, inte skriva ut den via echo, annars kommer resultatet att "hoppa ut" till början av sidan.

1add_shortcode( 'btn', 'my_button_shortcode' );
2function my_button_shortcode( $atts, $content = null, $tag = '' ) {
3 $a = shortcode_atts(
4 array( 'url' => '#', 'label' => 'Button' ),
5 $atts,
6 $tag
7 );
8 return sprintf(
9 '<a class="btn" href="%s">%s</a>',
10 esc_url( $a['url'] ), // escape on output
11 esc_html( $a['label'] )
12 );
13}
14// Usage in post: [btn url="https://example.com" label="Buy"]

shortcode_atts() lägger användarattribut ovanpå standardvärden. Om du behöver köra shortcodes inuti en sträng eller mall, slå in den i do_shortcode(), men för att anropa din egen funktion, anropa den direkt, utan mellanhand.

WP_Query och anpassade frågor

WP_Query är klassen för alla inläggsurval: senaste nytt i sidofältet, kategorisamling, flöde för anpassad posttyp. Efter din loop, anropa alltid wp_reset_postdata(), annars kommer malltaggar längre ner på sidan att få fel inlägg.

1$q = new WP_Query( array(
2 'post_type' => 'post',
3 'posts_per_page' => 5,
4 'category_name' => 'news',
5 'orderby' => 'date',
6 'order' => 'DESC',
7) );
8
9if ( $q->have_posts() ) {
10 while ( $q->have_posts() ) {
11 $q->the_post();
12 the_title( '<h3>', '</h3>' );
13 }
14 wp_reset_postdata(); // restore global $post
15}

För att modifiera huvudsidans fråga (till exempel antal inlägg på förstasidan), använd inte den föråldrade query_posts(), den kör en extra databasfråga och förstör paginering. Korrekt tillvägagångssätt är pre_get_posts-hooken, som modifierar frågan före dess körning:

1add_action( 'pre_get_posts', 'my_main_query' );
2function my_main_query( $query ) {
3 if ( ! is_admin() && $query->is_main_query() && $query->is_home() ) {
4 $query->set( 'posts_per_page', 12 );
5 }
6}

Säkerhet: escaping och sanitering

Den gyllene WordPress-regeln: sanitera vid inmatning, escape:a vid utmatning, validera överallt. All användardata rensas innan den sparas i databasen och escape:as innan den skrivs ut i HTML, även om den redan har rensats.

1// Escaping ON OUTPUT
2echo esc_html( $text ); // text inside tag
3echo esc_attr( $value ); // attribute value
4echo esc_url( $href ); // href/src links
5echo wp_kses_post( $rich_html ); // safe HTML set for content
6
7// Sanitization ON INPUT (before writing to DB)
8$clean = sanitize_text_field( $_POST['name'] );
9$email = sanitize_email( $_POST['email'] );
10$num = absint( $_POST['count'] );

Skydda formulär och actions med nonces, engångstoken mot CSRF:

1// In form:
2wp_nonce_field( 'my_save_action', 'my_nonce' );
3
4// During processing:
5if ( ! isset( $_POST['my_nonce'] ) ||
6 ! wp_verify_nonce( $_POST['my_nonce'], 'my_save_action' ) ) {
7 return; // request rejected
8}

I praktiken är de flesta tema- och plugin-sårbarheter just missad output escaping. Gör det till en vana: inte en enda variabel går in i HTML utan esc_*.

WordPress REST API

REST API returnerar webbplatsdata i JSON-format, används av mobilappar, headless-frontends och integrationer. Basadressen är /wp-json/wp/v2/.

1GET /wp-json/wp/v2/posts // posts
2GET /wp-json/wp/v2/pages // pages
3GET /wp-json/wp/v2/media // media files
4GET /wp-json/wp/v2/users // users
5GET /wp-json/wp/v2/posts/123 // single post
6GET /wp-json/wp/v2/posts?per_page=5&search=theme&_embed

Egna routes registreras på rest_api_init-hooken. Parametern permission_callback är obligatorisk, utan den varnar WordPress; för publik läsning använd '__return_true'.

1add_action( 'rest_api_init', function () {
2 register_rest_route( 'myplugin/v1', '/items/(?P<id>\d+)', array(
3 'methods' => 'GET',
4 'callback' => 'my_get_item',
5 'permission_callback' => '__return_true',
6 ) );
7} );

WP-CLI: kommandon till hands

WP-CLI hanterar webbplatsen från terminalen, snabbare och mer tillförlitligt än att klicka i admin, särskilt när man underhåller flera webbplatser. Vanligaste kommandon:

1wp core update # update WordPress core
2wp core version # what version is installed
3wp plugin install akismet --activate # install and activate plugin
4wp plugin list # plugin list with status and version
5wp theme activate twentytwentyfive # switch active theme
6wp db export backup.sql # database dump to file
7wp search-replace 'old.com' 'new.com' --dry-run # always dry run first
8wp user create bob [email protected] --role=editor # create user
9wp cache flush # flush object cache

wp search-replace förstår serialiserad data, så den ändrar säkert domän vid migrering av en webbplats, till skillnad från en direkt SQL-fråga som förstör serialiseringen. Gör wp db export före varje farlig operation.

Klassiska teman och blockteman 2026

I mitten av 2026 (aktuell version: WordPress 7.0 "Armstrong", rekommenderad PHP 8.3+) är klassiska PHP-teman fortfarande fullt stödda och förblir den vanligaste typen. Men all ny kärnverktygsutveckling sker för blockteman och fullständig webbplatsredigering (Full Site Editing): theme.json istället för en del av inställningarna i functions.php, HTML-mallar istället för PHP. The Loop, bloginfo(), villkors-taggar och hooks förblir relevanta i hybridteman och alla PHP-fragment inuti FSE-teman, så detta lathund tappar inte sitt värde. Den praktiska vägen 2026 är en klassisk grund plus riktat blockstöd där det faktiskt behövs.

⁉️🤔 Vanliga frågor

Är det obligatoriskt att skapa alla 13 filer för ett tema?

Nej, det minsta fungerande temat är index.php + style.css. Men för en fullfjädrad sajt är det bättre att behålla den kompletta uppsättningen: varje fil ger WordPress möjlighet att välja den optimala mallen. Utan single.php renderas till exempel ett inlägg via index.php och tappar kommentarsblocket.

Vad är skillnaden mellan get_bloginfo() och bloginfo()?

bloginfo() skriver ut värdet direkt på skärmen (echo). get_bloginfo() returnerar en sträng till en variabel, du kan bearbeta den, lägga till något eller använda den inuti ett annat uttryck innan den faktiska utmatningen.

Var placerar jag loopen om sidan har flera innehållstyper?

Loopen kan startas flera gånger. Typiskt scenario: en loop för huvudlistan med inlägg, en andra för en widget med "senaste nytt" i sidofältet. Återställ pekaren före den andra loopen med wp_reset_postdata(), annars får nästa kod på sidan fel inläggskontext.

Fungerar det här lathundet för blockteman (FSE)?

Delvis. Blockteman (Full Site Editing) använder theme.json istället för functions.php för många inställningar och mallar i HTML snarare än PHP. Men loopen, bloginfo() och include-taggar är fortfarande relevanta för hybridteman och alla PHP-mallar inuti FSE-teman.

Vad gör man om functions.php blir för stor?

Bryt ut logiken i separata filer och inkludera dem från functions.php via require_once eller include. Till exempel: require_once get_template_directory() . '/inc/custom-post-types.php';. Detta förbättrar läsbarheten och förenklar underhållet, en best practice för alla teman med fler än 20-30 hooks.

Vad är skillnaden mellan en action och ett filter?

En action utför en sidoeffekt och returnerar ingenting (köa ett skript, skicka ett mejl). Ett filter tar emot ett värde, modifierar det och måste returnera det, en glömd return i ett filter nollställer innehållet. De registreras på samma sätt: add_action() och add_filter().

Varför fungerar inte is_single() i functions.php?

Villkorstaggar för frågor är bara tillgängliga efter att huvudfrågan har formats, det vill säga i mallfiler eller från och med template_redirect-hooken. I början av functions.php är frågan inte redo än, så WordPress kommer att utfärda _doing_it_wrong(). Endast is_admin() och is_user_logged_in() fungerar utan frågeberoende.

Vad du ska ha till hands när du utvecklar för WordPress

Det här lathundet är stommen som WordPress-utveckling utgår från. Temafiler och mallhierarki, loopen, include-taggar och bloginfo() bygger ihop temat, medan hooks och filter, villkorstaggar, skriptinköning, shortcodes, WP_Query, escaping, REST API och WP-CLI täcker den stora majoriteten av rutinuppgifter. Resten är övning och dokumentation.

För fördjupning är handboken för temautveckling på developer.wordpress.org den första adressen. Referensen för malltaggar med hundratals funktioner för alla tillfällen finns också där. Om du går från HTML-layout till ett färdigt tema, börja med steg-för-steg-guiden för att skapa ett WordPress-tema från HTML, där loopen och taggar förklaras i skarpt läge, från layout till fungerande tema.

Bokmärk det här lathundet och ha det till hands under utvecklingen.

Vilken tagg eller hook slår du oftast upp? Skriv i kommentarerna vilken WordPress-uppgift du stötte på och dela ditt användningsfall, levande erfarenhetsutbyte är värt ett dussin officiella guider.