
Zaawansowane WP_Query: Taksonomie, Meta Data i Wydajność (2026)
Spis treści
Każdy programista WordPress wie, jak uruchomić prostą pętlę. Ale co się stanie, gdy klient zapyta: “Pokaż mi wszystkie Produkty, które są w Kolekcji Letniej (Kategoria) ORAZ są Czerwone (Tag), ALE wyklucz te Niedostępne?”
Nagle query_posts (uchowaj Boże) lub podstawowe cat=5 nie wystarczy.
Potrzebujesz Zaawansowanego WP_Query.
W tym przewodniku opanujemy tax_query, meta_query oraz optymalizacje wydajności, które odróżniają juniora od seniora.
1. Anatomia tax_query (Zapytania Taksonomiczne)
Zapomnij o cat czy tag_id. To przestarzałe parametry.
tax_query jest standardem, jest potężne i pozwala na złożoną logikę.
Scenariusz: Wiele Taksonomii (Relacja AND)
Chcesz filmy, które są “Akcji” (Gatunek) ORAZ z roku “2026” (Rok).
$args = [
'post_type' => 'movie',
'tax_query' => [
'relation' => 'AND', // Oba warunki muszą być spełnione
[
'taxonomy' => 'genre',
'field' => 'slug',
'terms' => 'action',
],
[
'taxonomy' => 'year',
'field' => 'slug',
'terms' => '2026',
],
],
];
$query = new WP_Query( $args );
Scenariusz: Złożona Logika “OR”
Chcesz produkty, które są ALBO “W Wyprzedaży” ALBO “Ostatnie Sztuki”.
$args = [
'post_type' => 'product',
'tax_query' => [
'relation' => 'OR',
[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'on-sale',
],
[
'taxonomy' => 'product_label',
'field' => 'slug',
'terms' => 'clearance',
],
],
];
2. Dynamiczne “Podobne Wpisy” po Taksonomii
Jednym z najczęstszych wymagań są “Podobne Wpisy”. Nie używaj wtyczki. To 10 linijek kodu.
function wppoland_get_related_posts() {
$current_id = get_the_ID();
$terms = get_the_terms( $current_id, 'category' );
if ( empty( $terms ) ) return [];
// Pobierz ID wszystkich terminów przypisanych do wpisu
$term_ids = wp_list_pluck( $terms, 'term_id' );
$args = [
'category__in' => $term_ids,
'post__not_in' => [ $current_id ], // Wyklucz siebie
'posts_per_page' => 3,
'orderby' => 'rand', // Losowo
'no_found_rows' => true, // BOOST WYDAJNOŚCI
];
return new WP_Query( $args );
}
3. Optymalizacja Wydajności (Poziom Seniora)
Domyślne WP_Query jest ciężkie. Liczy wszystkie wiersze (do paginacji) i cache’uje wszystko.
Jeśli uruchamiasz pętlę w widżecie lub sidebarze, nie potrzebujesz paginacji.
Zoptymalizuj argumenty zapytania:
$args = [
'posts_per_page' => 5,
// 1. Nie licz wszystkich wierszy database (Oszczędza SQL CALC_FOUND_ROWS)
'no_found_rows' => true,
// 2. Nie aktualizuj cache meta danych (Jeśli nie wyświetlasz custom fields)
'update_post_meta_cache' => false,
// 3. Nie aktualizuj cache terminów (Jeśli nie wyświetlasz tagów/kategorii)
'update_post_term_cache' => false,
// 4. Zwróć tylko ID (Jeśli sprawdzasz tylko istnienie)
// 'fields' => 'ids',
];
4. Łączenie meta_query i tax_query
E-commerce w prawdziwym świecie często wymaga obu. “Pokaż Koszulki (Taksonomia), które kosztują mniej niż 20 PLN (Meta).”
$args = [
'post_type' => 'product',
'tax_query' => [
[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 't-shirts',
]
],
'meta_query' => [
[
'key' => '_price',
'value' => 20,
'compare' => '<=',
'type' => 'NUMERIC' // Kluczowe dla porównywania liczb!
]
]
];
Podsumowanie
- Zawsze używaj składni tablicowej
tax_queryzamiast starych argumentów stringowych. - Używaj
'no_found_rows' => truezawsze, gdy nie potrzebujesz paginacji. - Zrozum filtry (
relationAND/OR), aby budować złożone zapytania logiczne.
Twoja baza danych (i Twoi użytkownicy) Ci podziękują.