Hente innleggslister fra kategorier i WordPress - Utviklerguide
NB

Hente innleggslister fra kategorier i WordPress - Utviklerguide

Sist verifisert: 1. juli 2026
8 min lesetid
Veiledning
500+ WP-prosjekter
Full-stack-utvikler

#Introduksjon til kategoribasert innleggshenting

Lær mer om profesjonell WordPress-utvikling hos WPPoland.

En av de vanligste oppgavene i WordPress-utvikling er å hente innlegg fra bestemte kategorier. Enten du bygger en tilpasset forsidelayout, oppretter en kategoriarkivmal eller viser relatert innhold, er forståelse av hvordan du effektivt spør etter innlegg per kategori essensiell for enhver WordPress-utvikler.

Denne omfattende guiden dekker flere tilnærminger til å hente innleggslister fra kategorier, fra enkle implementeringer til avanserte optimaliseringsteknikker.

#Forstå WordPress-kategorier

Før vi dykker inn i koden, er det viktig å forstå hvordan WordPress håndterer kategorier:

  • Kategorier er en innebygd taksonomi i WordPress
  • Hvert innlegg kan tilhøre flere kategorier
  • Kategorier kan være hierarkiske (forelder/barn-relasjoner)
  • Kategoridata lagres i tabellene wp_terms og wp_term_taxonomy
  • Innlegg-kategori-relasjoner lagres i wp_term_relationships

#Finne en kategori-ID fra slug eller navn

De fleste spørringsargumenter godtar enten en slug eller en numerisk ID, men ID-baserte argumenter (cat, category__in) er raskest fordi de hopper over et termoppslag. Når du bare kjenner slug-en, løs den opp én gang og gjenbruk ID-en:

// From a slug
$term = get_category_by_slug('news');
$news_id = $term ? $term->term_id : 0;

// From a display name
$news_id = get_cat_ID('News'); // returns 0 if not found

// From any taxonomy (categories included)
$term = get_term_by('slug', 'news', 'category');

Cache den oppløste ID-en i en konstant eller et option hvis du hardkoder den i en mal. Å kalle get_cat_ID() ved hver forespørsel legger til en spørring du fint kan unngå.

#Metode 1: WP_Query (den fleksible tilnærmingen)

WP_Query er WordPress sin primære klasse for å spørre etter innlegg. Den tilbyr maksimal fleksibilitet og brukes i nesten alle profesjonelle norske temaer.

#Grunnleggende kategorisporring

$args = array(
    'category_name' => 'news',
    'posts_per_page' => 10,
    'orderby' => 'date',
    'order' => 'DESC'
);

$query = new WP_Query($args);

if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        ?>
        <article>
            <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
            <div class="entry-content">
                <?php the_excerpt(); ?>
            </div>
        </article>
        <?php
    }
    wp_reset_postdata();
}

#Sporring etter kategori-ID

$args = array(
    'cat' => 5,
    'posts_per_page' => 5
);

$query = new WP_Query($args);

#Flere kategorier

// Innlegg i NOEN av disse kategoriene (ELLER-relasjon)
$args = array(
    'category__in' => array(5, 10, 15),
    'posts_per_page' => 10
);

// Innlegg i ALLE disse kategoriene (OG-relasjon)
$args = array(
    'category__and' => array(5, 10),
    'posts_per_page' => 10
);

// Ekskluder bestemte kategorier
$args = array(
    'category__not_in' => array(3, 7),
    'posts_per_page' => 10
);

#Metode 2: get_posts() (den enkle tilnærmingen)

For enklere bruksområder gir get_posts() et mer direkte API. Den passer godt når du bare trenger en flat liste uten å forholde deg til hovedsløyfen.

$posts = get_posts(array(
    'category' => 5,
    'posts_per_page' => 10,
    'orderby' => 'date',
    'order' => 'DESC'
));

foreach ($posts as $post) {
    setup_postdata($post);
    ?>
    <article>
        <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
    </article>
    <?php
}
wp_reset_postdata();

#Metode 3: Shortcodes for innholdsredaktører

function category_posts_shortcode($atts) {
    $atts = shortcode_atts(array(
        'category' => '',
        'posts' => 5,
        'orderby' => 'date',
        'order' => 'DESC'
    ), $atts);
    
    $args = array(
        'category_name' => $atts['category'],
        'posts_per_page' => intval($atts['posts']),
        'orderby' => $atts['orderby'],
        'order' => $atts['order']
    );
    
    $query = new WP_Query($args);
    
    ob_start();
    
    if ($query->have_posts()) {
        echo '<div class="category-posts-list">';
        while ($query->have_posts()) {
            $query->the_post();
            ?>
            <article class="category-post">
                <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
                <p><?php the_excerpt(); ?></p>
            </article>
            <?php
        }
        echo '</div>';
    }
    
    wp_reset_postdata();
    
    return ob_get_clean();
}
add_shortcode('category_posts', 'category_posts_shortcode');

Bruk: [category_posts category="news" posts="5"]

#Metode 4: Modifisere hovedspørringen

function modify_category_queries($query) {
    if ($query->is_category() && $query->is_main_query() && !is_admin()) {
        $query->set('posts_per_page', 20);
    }
}
add_action('pre_get_posts', 'modify_category_queries');

#Metode 5: tax_query for presis, taksonomibevisst filtrering

Snarveiene cat og category_name er praktiske, men tax_query er argumentet du griper til når kravene blir spesifikke: å kombinere kategorier med etiketter, ekskludere underkategorier eller spørre mot en egendefinert taksonomi. Den uttrykker også AND/OR-logikk eksplisitt, noe snarveisargumentene ikke klarer.

$args = array(
    'posts_per_page' => 10,
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'category',
            'field'    => 'slug',
            'terms'    => array('news'),
        ),
        array(
            'taxonomy' => 'post_tag',
            'field'    => 'slug',
            'terms'    => array('featured'),
        ),
    ),
);

$query = new WP_Query($args);

Nøkkelen include_children er detaljen de fleste overser. Som standard trekker en category-tax_query inn alle etterkommertermer, noe et arkiv vanligvis vil ha, men sjelden det en kuratert forsideblokk vil ha:

'tax_query' => array(
    array(
        'taxonomy'         => 'category',
        'field'            => 'term_id',
        'terms'            => array(5),
        'include_children' => false, // only posts filed directly under term 5
    ),
),

Fordi tax_query fungerer mot enhver taksonomi, henter det samme mønsteret innlegg fra en egendefinert product_cat i en norsk WooCommerce-nettbutikk, portfolio_type eller hvilken som helst taksonomi temaet ditt registrerer, uten en egen funksjon per taksonomi.

#Ytelsesoptimalisering

#1. Bruk transients for kostbare spørringer

function get_cached_category_posts($category_id, $count = 5) {
    $cache_key = 'cat_posts_' . $category_id . '_' . $count;
    $posts = get_transient($cache_key);
    
    if (false === $posts) {
        $args = array(
            'cat' => $category_id,
            'posts_per_page' => $count
        );
        
        $query = new WP_Query($args);
        $posts = $query->posts;
        
        set_transient($cache_key, $posts, HOUR_IN_SECONDS);
    }
    
    return $posts;
}

#Avanserte teknikker

#AJAX-lasting av kategoriinnlegg

For en bedre brukeropplevelse kan du implementere AJAX-lasting. To detaljer feller folk: ajaxurl er bare definert i wp-admin, så på frontenden må du sende den inn selv, og hver forespørsel trenger en nonce for å overleve en sikkerhetsgjennomgang.

Kø opp skriptet og gi det admin-ajax-URL-en pluss en nonce:

function enqueue_category_loader() {
    wp_enqueue_script(
        'category-loader',
        get_theme_file_uri('/js/category-loader.js'),
        array('jquery'),
        '1.0',
        true
    );
    wp_localize_script('category-loader', 'catLoader', array(
        'ajaxurl' => admin_url('admin-ajax.php'),
        'nonce'   => wp_create_nonce('load_category_posts'),
    ));
}
add_action('wp_enqueue_scripts', 'enqueue_category_loader');

Frontend-forespørselen leser deretter fra det lokaliserte objektet:

jQuery(document).ready(function($) {
    $('.load-more').on('click', function() {
        var button = $(this);

        $.ajax({
            url: catLoader.ajaxurl,
            type: 'POST',
            data: {
                action: 'load_category_posts',
                nonce: catLoader.nonce,
                category: button.data('category'),
                page: button.data('page')
            },
            success: function(response) {
                $('.posts-container').append(response);
                button.data('page', button.data('page') + 1);
            }
        });
    });
});

Til slutt registrerer du handleren for både innloggede og anonyme besøkende (wp_ajax_ og wp_ajax_nopriv_), verifiserer nonce-en og returnerer den ferdige markupen:

function load_category_posts_handler() {
    check_ajax_referer('load_category_posts', 'nonce');

    $category = sanitize_text_field($_POST['category'] ?? '');
    $page     = max(1, intval($_POST['page'] ?? 1));

    $query = new WP_Query(array(
        'category_name'  => $category,
        'posts_per_page' => 5,
        'paged'          => $page,
    ));

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            printf(
                '<article><h3><a href="%s">%s</a></h3></article>',
                esc_url(get_permalink()),
                esc_html(get_the_title())
            );
        }
        wp_reset_postdata();
    }

    wp_die(); // required so admin-ajax stops cleanly
}
add_action('wp_ajax_load_category_posts', 'load_category_posts_handler');
add_action('wp_ajax_nopriv_load_category_posts', 'load_category_posts_handler');

#Vise kategoriinnlegg i et blokktema

På blokktemaer (standard siden WordPress 6.1) trenger du ofte ikke PHP i det hele tatt. Query Loop-blokken filtrert på kategori viser den samme listen fra editoren: sett inn en Query Loop, åpne blokkinnstillingene og legg til kategorien du vil ha under Filtre. Lagre den som et synkronisert mønster, så kan redaktørene slippe den kuraterte listen inn på hvilken som helst side uten å røre en mal. Dette er en av grunnene til at mange norske redaksjoner har gått over til blokktemaer.

Grip til kodetilnærmingene over når du trenger logikk blokken ikke kan uttrykke: transient-caching, betingede ekskluderinger per arkiv, eller utdata som konsumeres av noe annet enn temaet (et e-postsammendrag, et REST-svar).

#Hente kategoriinnlegg via REST-API-et

For hodeløse frontender, en React-øy eller en ekstern integrasjon eksponerer WordPress kategoriinnlegg over REST-API-et uten at det kreves et eget endepunkt:

GET /wp-json/wp/v2/posts?categories=5&per_page=10&_fields=id,title,link,excerpt

Bruk categories_exclude for å filtrere ut en term, _embed for å hente fremhevede bilder og termnavn i én forespørsel, og _fields for å trimme nyttelasten til det klienten faktisk viser. For å løse en slug til ID-en endepunktet forventer, spør /wp-json/wp/v2/categories?slug=news først.

#Feilsøke en kategorispørring som returnerer feil innlegg

Når en spørring returnerer for mange, for få eller uventede innlegg, undersøk SQL-en den faktisk kjørte i stedet for å gjette på argumentene. Installer Query Monitor, så viser den hver spørring på siden, inkludert den sløyfen din genererte, med de trege markert. For en rask sjekk uten plugin, dump den tolkede spørringen:

$query = new WP_Query($args);
// The exact SQL WordPress built from your $args
error_log($query->request);

De to synderne bak de fleste overraskelsene er inkludering av underkategorier (se include_children over) og et villfarent pre_get_posts-filter fra en plugin eller temaet som endrer hovedspørringen. Hvis SQL-en ser riktig ut, men resultatet er tomt, bekreft at termen faktisk har publiserte innlegg tildelt i gjeldende språk eller kontekst, en klassisk felle på flerspråklige norske nettsteder som kjører bokmål og engelsk side om side.

#Vanlige fallgruver å unngå

  1. Ikke tilbakestille innleggsdata: Kall alltid wp_reset_postdata() etter tilpassede sløyfer, ellers risikerer du at oppfølgende kall til hovedsløyfen returnerer feil data.
  2. Spørre ved hver sidelasting: Bruk caching (transients eller objektcache) for kostbare spørringer mot kategorier med mye innhold.
  3. Ikke sjekke om innlegg finnes: Verifiser alltid have_posts() før du går inn i sløyfen, ellers feiler tema-tag-kallene stille.
  4. Modifisere hovedspørringen feil: Bruk pre_get_posts-handlingen i stedet for å opprette nye spørringer på toppen av den eksisterende.

#Konklusjon

WordPress tilbyr flere måter å hente innlegg fra kategorier på:

  • WP_Query: best for komplekse, tilpassede visninger med multipel filtrering
  • get_posts(): ideell for enkle innleggslister i widgets eller relaterte-saker-bokser
  • Shortcodes: perfekt for fleksibilitet i Gutenberg eller klassisk redaktør
  • pre_get_posts: essensiell for å modifisere arkivsider uten å duplisere kode

Husk å alltid vurdere ytelse, spesielt på nettsteder med store mengder innhold. Implementer caching-strategier og test spørringene dine med verktøy som Query Monitor.

Neste steg

Gjor artikkelen om til faktisk implementering

Denne blokken styrker intern lenking og sender leseren videre til de mest relevante tjenestene og innholdet.

Vil du fa dette implementert pa nettstedet ditt?

Hvis du vil gjore kunnskapen i artikkelen om til konkrete forbedringer, redesign eller en tydelig leveranseplan, kan jeg ta det videre.

Relevant klynge

Utforsk andre WordPress-tjenester og kunnskapsbase

Styrk virksomheten din med profesjonell teknisk støtte innen kjerneområdene i WordPress-økosystemet.

Ma jeg vare en erfaren utvikler for a bruke denne guiden?#
Denne guiden er designet for WordPress-utviklere på middels niva. Grunnleggende PHP- og WordPress-kunnskap forutsettes, men all kode forklares trinn for trinn.
Vil disse teknikkene fungere med ethvert WordPress-tema?#
De fleste teknikker er tema-agnostiske og fungerer med standard WordPress-temaer. Noen sterkt tilpassede temaer kan kreve ytterligere tilpasning.
Er det trygt a implementere disse endringene på et aktivt nettsted?#
Test alltid endringer i et staging-miljo forst. Selv om disse teknikkene er produksjonsklare, forhindrer testing potensielle problemer på aktive nettsteder.
Fungerer disse metodene med sidebyggere som Elementor?#
Ja, de fleste metoder fungerer sammen med sidebyggere. Noen kan kreve spesifikke integrasjonstrinn som er notert i implementeringsseksjonen.
Trenger jeg fortsatt kode på et blokktema?#
Ikke for en enkel liste. Query Loop-blokken filtrert på kategori viser kategoriinnleggene rett fra editoren. Bruk kodetilnærmingene når du trenger caching, betingede ekskluderinger eller utdata som brukes utenfor temaet, for eksempel et REST-svar.

Trenger du FAQ tilpasset bransje og marked? Vi lager en versjon som støtter dine forretningsmål.

Ta kontakt

Relaterte artikler