
Wyciąganie listy postów z kategorii w WordPress – Kompletny Poradnik Developer
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-1dla wszystkich, ale uważaj na wydajność!).category_name: Slug kategorii (możesz też użyćcategory__inz ID kategorii).wp_reset_postdata(): Niezbędne na końcu, aby pętla nie nadpisała globalnego obiektu$postdla 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.
- 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 ); } - Ograniczanie pól: Jeśli potrzebujesz tylko ID wpisów, użyj
'fields' => 'ids', to znacznie przyspieszy zapytanie SQL. 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_Querydla 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.