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_termsogwp_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å
- 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. - Spørre ved hver sidelasting: Bruk caching (transients eller objektcache) for kostbare spørringer mot kategorier med mye innhold.
- Ikke sjekke om innlegg finnes: Verifiser alltid
have_posts()før du går inn i sløyfen, ellers feiler tema-tag-kallene stille. - 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.







