Wyciąganie listy postów z kategorii w WordPress – Kompletny Poradnik Developer
PL

Wyciąganie listy postów z kategorii w WordPress – Kompletny Poradnik Developer

5.00 /5 - (29 głosów )
Spis treści

Jednym z najczęstszych zadań, przed którymi staje programista WordPress, jest wyświetlenie listy wpisów z określonej kategorii w niestandardowym 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 niestandardowych 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.