Zaawansowane WP_Query: Taksonomie, Meta Data i Wydajność (2026)
PL

Zaawansowane WP_Query: Taksonomie, Meta Data i Wydajność (2026)

5.00 /5 - (44 głosów )
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_query zamiast starych argumentów stringowych.
  • Używaj 'no_found_rows' => true zawsze, gdy nie potrzebujesz paginacji.
  • Zrozum filtry (relation AND/OR), aby budować złożone zapytania logiczne.

Twoja baza danych (i Twoi użytkownicy) Ci podziękują.