Kompletny przewodnik dla programistów: WP_Query, get_posts, shortcody. Dowiedz się, jak filtrować wpisy po kategorii i optymalizować zapytania.
PL

Wyciąganie listy postów z kategorii w WordPress

5.00 /5 - (29 głosów )
Ostatnio zweryfikowano: 1 maja 2026
4min czytania
Poradnik
500+ projektów WP
Full-stack developer

Jednym z najczęstszych zadań, przed którymi staje programista WordPress, jest wyświetlenie listy wpisów z określonej kategorii w niestandardówym miejscu – na stronie głównej, w sidebarze, czy w specjalnej sekcji “Polecane”. Choć WordPress oferuje wbudowane widżety, profesjonalne wdrożenia wymagają pełnej kontroli nad kodem HTML i wydajnością zapytania.

W tym poradniku przejdziemy przez trzy metody osiągnięcia tego celu: od najprostszej funkcji get_posts, przez potężną klasę WP_Query, aż po tworzenie własnych shortcodów. Dowiesz się również, jak robić to wydajnie, aby nie “zabić” swojej bazy danych.

#Metoda 1: Get_posts() – Szybka i prosta

Jeśli potrzebujesz po prostu tablicy wpisów, by wyświetlić je w prostej pętli foreach, funkcja get_posts() jest Twoim najlepszym przyjacielem. Jest to nakładka na WP_Query z domyślnymi ustawieniami „bezpiecznymi” dla większości zastosowań.

#Przykład użycia:

Załóżmy, że chcemy wyświetlić 5 ostatnich wpisów z kategorii o slugu news.

<?php
$args = array(
    'posts_per_page'   => 5,
    'category_name'    => 'news',
    'orderby'          => 'date',
    'order'            => 'DESC',
    'post_type'        => 'post',
    'post_status'      => 'publish',
);

$posts_array = get_posts( $args );

if ( ! empty( $posts_array ) ) : ?>
    <ul class="news-list">
        <?php foreach ( $posts_array as $post ) : setup_postdata( $post ); ?>
            <li>
                <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
                <span class="date"><?php echo get_the_date(); ?></span>
            </li>
        <?php endforeach; 
        wp_reset_postdata(); // Ważne!
        ?>
    </ul>
<?php else : ?>
    <p>Brak wpisów w tej kategorii.</p>
<?php endif; ?>

Kluczowe parametry:

  • posts_per_page: Liczba wpisów (ustaw -1 dla wszystkich, ale uważaj na wydajność!).
  • category_name: Slug kategorii (możesz też użyć category__in z ID kategorii).
  • wp_reset_postdata(): Niezbędne na końcu, aby pętla nie nadpisała globalnego obiektu $post dla reszty strony.

#Metoda 2: Wp_Query – Pełna kontrola

Dla zaawansowanych zastosowań, gdzie potrzebujesz paginacji (stronicowania), złożonych filtrów (np. wpisy z kategorii X, ale z wykluczeniem tagu Y) lub niestandardówych pól (Meta Query), WP_Query jest standardem. To właśnie ta klasa napędza główną pętlę WordPressa.

#Przykład pętli (the loop):

<?php
$query_args = array(
    'cat'            => 12, // ID kategorii
    'posts_per_page' => 3,
    'ignore_sticky_posts' => 1, // Ignoruj przyklejone wpisy
);

$the_query = new WP_Query( $query_args );

// Sprawdź czy są wyniki
if ( $the_query->have_posts() ) : ?>
    <div class="custom-category-feed">
        <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
            <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
                <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
                <div class="excerpt">
                    <?php the_excerpt(); ?>
                </div>
            </article>
        <?php endwhile; ?>
        <?php wp_reset_postdata(); ?>
    </div>
<?php else : ?>
    <p>Niestety, nic nie znaleziono.</p>
<?php endif; ?>

Dlaczego WP_Query? Pozwala na skomplikowane zapytania “Taxonomy Query”. Możesz np. pobrać wpisy, które są w kategorii “Sport” ORAZ mają tag “Piłka nożna”, ale “Kolor” (custom taxonomy) NIE jest “Czerwony”.

'tax_query' => array(
    'relation' => 'AND',
    array(
        'taxonomy' => 'category',
        'field'    => 'slug',
        'terms'    => array( 'sport' ),
    ),
    array(
        'taxonomy' => 'post_tag',
        'field'    => 'slug',
        'terms'    => array( 'pilka-nozna' ),
    ),
),

#Optymalizacja: Nie zabijaj bazy danych

Wywołanie WP_Query to zapytanie do bazy danych. Jeśli masz ich 10 na stronie głównej, strona zwolni.

  1. Cache’owanie: Używaj Transient API, aby zapisać wyniki zapytania na np. godzinę.
    $cache_key = 'news_posts_cache';
    $posts_query = get_transient( $cache_key );
    
    if ( false === $posts_query ) {
        $posts_query = new WP_Query( $args );
        set_transient( $cache_key, $posts_query, HOUR_IN_SECONDS );
    }
  2. Ograniczanie pól: Jeśli potrzebujesz tylko ID wpisów, użyj 'fields' => 'ids', to znacznie przyspieszy zapytanie SQL.
  3. no_found_rows: Jeśli nie potrzebujesz paginacji (np. wyświetlasz tylko 3 ostatnie wpisy w stopce), dodaj 'no_found_rows' => true. WordPress nie będzie wtedy liczył wszystkich pasujących wpisów w bazie, co jest bardzo kosztowną operacją.

#Podsumowanie

Wybór metody zależy od celu:

  • Użyj get_posts() do prostych list w sidebarach czy stopce.
  • Użyj WP_Query dla głównych sekcji contentowych, z paginacją i złożonym filtrowaniem.
  • Pamiętaj o wp_reset_postdata() i cache’owaniu wyników.

Dobre opanowanie tych zapytań to fundament pracy każdego developera WordPress. Unikaj wtyczek typu “Category Posts Widget” – własny kod jest zawsze lżejszy, bezpieczniejszy i daje Ci pełną kontrolę nad HTML-em.

Następny krok

Przekuj artykuł w realne wdrożenie

Pod tym wpisem dokładam linki, które domykają intencję użytkownika i prowadzą dalej w strukturze serwisu.

Chcesz wdrożyć ten temat na swojej stronie?

Jeśli chcesz przełożyć wiedzę z artykułu na działającą stronę, sklep albo przebudowę serwisu, przygotuję konkretny zakres prac.

FAQ do artykułu

Często zadawane pytania

Najważniejsze odpowiedzi, które pomagają wdrożyć temat w praktyce.

SEO-ready GEO-ready AEO-ready 3 Q&A
Kiedy użyć get_posts(), a kiedy WP_Query?
get_posts() wystarczy do prostych list, na przykład w sidebarze czy stopce. WP_Query wybieraj wtedy, gdy potrzebujesz większej kontroli, złożonych filtrów albo paginacji.
Jak nie zabić bazy danych takimi listami?
Najważniejsze jest ograniczenie liczby rekordów, używanie cache i unikanie kosztownych zapytań tam, gdzie wystarczy prostsza pętla lub same ID.
Czy warto używać gotowych widgetów do list wpisów?
Przy prostych wdrożeniach można, ale własny kod zwykle daje lepszą kontrolę nad HTML-em, wydajnością i logiką zapytania.

Potrzebujesz FAQ dopasowanego do branży i rynku? Przygotujemy wersję pod Twoje cele biznesowe.

Porozmawiajmy

Polecane artykuły

Kompletny przewodnik po klasie WP_User_Query. Jak pobrać listę administratorów, redaktorów lub klientów i wyświetlić ją na stronie?
wordpress

Jak wyświetlić listę użytkowników w WordPress? (Wp_User_Query)

Kompletny przewodnik po klasie WP_User_Query. Jak pobrać listę administratorów, redaktorów lub klientów i wyświetlić ją na stronie?

Szybki snippet PHP: Jak wyświetlić samą nazwę kategorii wpisu bez znacznika kotwicy (linku)? Omówienie funkcji get_the_category() i separatorów.
wordpress

Jak pobrać nazwę kategorii bez linku w WordPress? (Get_the_category)

Szybki snippet PHP: Jak wyświetlić samą nazwę kategorii wpisu bez znacznika kotwicy (linku)? Omówienie funkcji get_the_category() i separatorów.

Jak pobrać i wyświetlić listę postów z konkretnej kategorii w WordPress? Poznaj WP_Query, get_posts i niestandardowe pętle. Przykłady kodu i optymalizacja.
wordpress

Pobieranie postów z kategorii w WordPress – przewodnik dewelopera

Jak pobrać i wyświetlić listę postów z konkretnej kategorii w WordPress? Poznaj WP_Query, get_posts i niestandardowe pętle. Przykłady kodu i optymalizacja.