Wprowadzenie do pobierania postów według kategorii
Dowiedz się więcej o profesjonalnym tworzeniu stron WordPress w WPPoland. Jednym z najczęstszych zadań w tworzeniu WordPress jest pobieranie postów z konkretnych kategorii. Niezależnie od tego, czy budujesz niestandardówy układ strony głównej, tworzysz szablon archiwum kategorii, czy wyświetlasz powiązane treści, zrozumienie jak sprawnie odpytywać posty według kategorii jest niezbędne dla każdego dewelopera WordPress.
Ten kompleksowy przewodnik obejmuje wiele podejść do pobierania list postów z kategorii, od prostych implementacji po zaawansowane techniki optymalizacji. Po jego lekturze będziesz dysponować kompletnym zestawem narzędzi do obsługi zapytań opartych na kategoriach w każdym projekcie WordPress.
Zrozumienie kategorii WordPress
Zanim przejdziemy do kodu, warto zrozumieć, jak WordPress obsługuje kategorie:
- Kategorie to wbudowana taksonomia w WordPress
- Każdy post może należeć do wielu kategorii
- Kategorie mogą być hierarchiczne (relacje rodzic-dziecko)
- Dane kategorii są przechowywane w tabelach
wp_termsiwp_term_taxonomy - Relacje post-kategoria są przechowywane w
wp_term_relationships
Zrozumienie tej struktury pomaga pisać bardziej wydajne zapytania i rozwiązywać problemy, gdy się pojawią.
Metoda 1: WP_Query (podejście elastyczne)
WP_Query to podstawowa klasa WordPress do odpytywania postów. Oferuje maksymalną elastyczność i jest zalecanym podejściem w większości przypadków.
Podstawowe zapytanie kategorii
$args = array(
'category_name' => 'news',
'posts_per_page' => 10,
'orderby' => 'date',
'order' => 'DESC'
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
// Wyświetl treść posta
?>
<article>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<div class="entry-content">
<?php the_excerpt(); ?>
</div>
</article>
<?php
}
wp_reset_postdata();
}
Zapytanie według ID kategorii
$args = array(
'cat' => 5, // ID kategorii
'posts_per_page' => 5
);
$query = new WP_Query($args);
Wiele kategorii
// Posty w KTÓREJKOLWIEK z tych kategorii (relacja LUB)
$args = array(
'category__in' => array(5, 10, 15),
'posts_per_page' => 10
);
// Posty we WSZYSTKICH tych kategoriach (relacja I)
$args = array(
'category__and' => array(5, 10),
'posts_per_page' => 10
);
// Wykluczenie konkretnych kategorii
$args = array(
'category__not_in' => array(3, 7),
'posts_per_page' => 10
);
Uwzględnianie kategorii podrzędnych
// Pobierz posty z kategorii i wszystkich jej dzieci
$parent_category_id = 5;
$args = array(
'cat' => $parent_category_id,
'posts_per_page' => 20
);
// WP_Query automatycznie uwzględnia kategorie podrzędne przy użyciu 'cat'
Metoda 2: get_posts() (podejście proste)
W prostszych przypadkach get_posts() oferuje bardziej przejrzyste API.
Podstawowe użycie
$posts = get_posts(array(
'category' => 5,
'posts_per_page' => 10,
'orderby' => 'date',
'order' => 'DESC'
));
foreach ($posts as $post) {
setup_postdata($post);
?>
<article>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
</article>
<?php
}
wp_reset_postdata();
Z nazwą kategorii
$posts = get_posts(array(
'category_name' => 'technology',
'numberposts' => 5
));
Metoda 3: Shortcody dla edytorów treści
Stworzenie shortcodu pozwala edytorom treści wstawiać listy postów z kategorii w dowolnym miejscu.
function category_posts_shortcode($atts) {
$atts = shortcode_atts(array(
'category' => '',
'posts' => 5,
'orderby' => 'date',
'order' => 'DESC'
), $atts);
$args = array(
'category_name' => $atts['category'],
'posts_per_page' => intval($atts['posts']),
'orderby' => $atts['orderby'],
'order' => $atts['order']
);
$query = new WP_Query($args);
ob_start();
if ($query->have_posts()) {
echo '<div class="category-posts-list">';
while ($query->have_posts()) {
$query->the_post();
?>
<article class="category-post">
<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
<p><?php the_excerpt(); ?></p>
</article>
<?php
}
echo '</div>';
} else {
echo '<p>Nie znaleziono postów w tej kategorii.</p>';
}
wp_reset_postdata();
return ob_get_clean();
}
add_shortcode('category_posts', 'category_posts_shortcode');
Użycie: [category_posts category="news" posts="5"]
Metoda 4: Modyfikowanie głównego zapytania
Gdy chcesz zmienić, które posty pojawiają się na stronach archiwum kategorii, użyj akcji pre_get_posts.
function modify_category_queries($query) {
// Modyfikuj tylko archiwa kategorii w głównym zapytaniu
if ($query->is_category() && $query->is_main_query() && !is_admin()) {
// Pokaż 20 postów na stronę zamiast domyślnej wartości
$query->set('posts_per_page', 20);
// Wykluczenie postów z konkretnej kategorii na określonych stronach kategorii
$current_cat = get_queried_object();
if ($current_cat->slug === 'featured') {
$query->set('category__not_in', array(10)); // Wyklucz kategorię o ID 10
}
}
}
add_action('pre_get_posts', 'modify_category_queries');
Optymalizacja wydajności
1. Używaj transients dla kosztownych zapytań
function get_cached_category_posts($category_id, $count = 5) {
$cache_key = 'cat_posts_' . $category_id . '_' . $count;
$posts = get_transient($cache_key);
if (false === $posts) {
$args = array(
'cat' => $category_id,
'posts_per_page' => $count
);
$query = new WP_Query($args);
$posts = $query->posts;
// Cache na 1 godzinę
set_transient($cache_key, $posts, HOUR_IN_SECONDS);
}
return $posts;
}
2. Optymalizacja zapytań do bazy danych
// Pobieraj tylko pola, których potrzebujesz
$args = array(
'category_name' => 'news',
'posts_per_page' => 10,
'fields' => 'ids' // Pobieraj tylko ID postów dla lepszej wydajności
);
$query = new WP_Query($args);
3. Używaj object caching
Jeśli Twoja strona korzysta z object cache (Redis, Memcached), wyniki WP_Query są automatycznie cachowane, co poprawia wydajność przy powtarzających się zapytaniach.
Zaawansowane techniki
Niestandardowe szablony dla archiwów kategorii
Utwórz plik szablonu category-news.php dla konkretnego stylowania kategorii:
<?php
/* Template Name: Kategoria - Aktualności */
get_header(); ?>
<div class="category-archive">
<h1><?php single_cat_title(); ?></h1>
<?php if (have_posts()) : ?>
<div class="posts-grid">
<?php while (have_posts()) : the_post(); ?>
<?php get_template_part('content', 'category'); ?>
<?php endwhile; ?>
</div>
<?php the_posts_pagination(); ?>
<?php else : ?>
<p>Nie znaleziono postów w tej kategorii.</p>
<?php endif; ?>
</div>
<?php get_footer(); ?>
Ładowanie AJAX dla postów kategorii
Dla lepszego doświadczenia użytkownika zaimplementuj ładowanie AJAX:
jQuery(document).ready(function($) {
$('.load-more').on('click', function() {
var button = $(this);
var category = button.data('category');
var page = button.data('page');
$.ajax({
url: ajaxurl,
type: 'POST',
data: {
action: 'load_category_posts',
category: category,
page: page
},
success: function(response) {
$('.posts-container').append(response);
button.data('page', page + 1);
}
});
});
});
Częste błędy do uniknięcia
- Brak resetowania danych posta: zawsze wywołuj
wp_reset_postdata()po niestandardówych pętlach - Odpytywanie przy każdym ładowaniu strony: używaj cachowania dla kosztownych zapytań
- Brak sprawdzenia istnienia postów: zawsze weryfikuj
have_posts()przed pętlą - Nieprawidłowa modyfikacja głównego zapytania: używaj
pre_get_postszamiast tworzenia nowych zapytań na stronach archiwum - Ignorowanie paginacji: pamiętaj o obsłudze paginacji dla dużych archiwów kategorii
Podsumowanie
WordPress oferuje wiele sposobów pobierania postów z kategorii, z których każdy jest odpowiedni w różnych sytuacjach:
- WP_Query: najlepsza do złożonych, niestandardówych wyświetleń
- get_posts(): idealna do prostych list postów
- Shortcody: doskonałe dla elastyczności edytorów treści
- pre_get_posts: niezbędne do modyfikowania stron archiwum
Zrozumienie tych metod i wiedza, kiedy korzystać z każdej z nich, sprawi, że staniesz się bardziej efektywnym deweloperem WordPress. Pamiętaj, aby zawsze brać pod uwagę wydajność, szczególnie na stronach z dużą ilością treści.
W przypadku stron produkcyjnych wdróż strategie cachowania i testuj zapytania narzędziami takimi jak Query Monitor, aby zapewnić optymalną wydajność.


