Hver WordPress-utvikler vet hvordan man kjører en enkel løkke. Men hva skjer når kunden spør: “Vis meg alle Produkter, som er i Sommerkolleksjon (Kategori) OG Rød (Stikkord), MEN ekskluder Utsolgte varer?”
Plutselig holder ikke query_posts (Gud forby) eller en enkel cat=5.
Du trenger Avansert WP_Query.
I denne guiden skal vi mestre tax_query, meta_query og ytelsesoptimaliseringene som skiller juniorer fra seniorer.
1. Anatomien til tax_query (taksonomi-spørringer)
Glem cat eller tag_id. De er utdaterte parametere.
tax_query er standard, kraftig og tillater kompleks logikk.
Scenario: Flere taksonomier (and-relasjon)
Du vil ha filmer som er “Action” (Sjanger) OG fra året “2026” (År).
$args = [
'post_type' => 'movie',
'tax_query' => [
'relation' => 'AND', // Begge betingelser må være sanne
[
'taxonomy' => 'genre',
'field' => 'slug',
'terms' => 'action',
],
[
'taxonomy' => 'year',
'field' => 'slug',
'terms' => '2026',
],
],
];
$query = new WP_Query( $args );
Scenario: Kompleks “or”-logikk
Du vil ha produkter som er ENTEN “På tilbud” ELLER “Lagersalg”.
$args = [
'post_type' => 'product',
'tax_query' => [
'relation' => 'OR',
[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'on-sale',
],
[
'taxonomy' => 'product_label',
'field' => 'slug',
'terms' => 'clearance',
],
],
];
2. Dynamiske “relaterte innlegg” etter taksonomi
Et av de vanligste kravene er “Relaterte innlegg”. Ikke bruk en plugin. Det er 10 linjer med kode.
function wppoland_get_related_posts() {
$current_id = get_the_ID();
$terms = get_the_terms( $current_id, 'category' );
if ( empty( $terms ) ) return [];
// Hent alle term-IDer knyttet til gjeldende innlegg
$term_ids = wp_list_pluck( $terms, 'term_id' );
$args = [
'category__in' => $term_ids,
'post__not_in' => [ $current_id ], // Ekskluder seg selv
'posts_per_page' => 3,
'orderby' => 'rand', // Tilfeldig
'no_found_rows' => true, // YTELSES-BOOST
];
return new WP_Query( $args );
}
3. Ytelsesoptimalisering (seniordelen)
Standard WP_Query er tung. Den teller alle rader (for paginering) og cacher alt.
Hvis du kjører en løkke i en widget eller sidefelt, trenger du ikke paginering.
Optimaliser dine spørringsargumenter:
$args = [
'posts_per_page' => 5,
// 1. Ikke tell totale rader (Sparer en SQL CALC_FOUND_ROWS)
'no_found_rows' => true,
// 2. Ikke oppdater meta-cache (Hvis du ikke viser egendefinerte felter)
'update_post_meta_cache' => false,
// 3. Ikke oppdater term-cache (Hvis du ikke viser stikkord/kategorier)
'update_post_term_cache' => false,
// 4. Returner kun ID-er (Hvis du bare sjekker eksistens)
// 'fields' => 'ids',
];
4. Blanding av meta_query og tax_query
E-handel i den virkelige verden trenger ofte begge deler. “Vis T-skjorter (Taksonomi) som koster mindre enn 200 kr (Meta).”
$args = [
'post_type' => 'product',
'tax_query' => [
[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 't-shirts',
]
],
'meta_query' => [
[
'key' => '_price',
'value' => 200,
'compare' => '<=',
'type' => 'NUMERIC' // Kritisk for tallsammenligning!
]
]
];
Oppsummering
- Bruk alltid
tax_query-array-syntaks over utdaterte streng-argumenter. - Bruk
'no_found_rows' => truenår paginering ikke er nødvendig. - Forstå filtre (
relationAND/OR) for å bygge komplekse logiske spørringer.
Databasen din (og brukerne dine) vil takke deg.



