Paginasi menentukan bagaimana artikel dibagi ke beberapa halaman. Pada Plus UI WP, homepage menampilkan carousel, pinned post, latest posts, dan sidebar sehingga query harus dijaga agar tidak menghasilkan duplikasi atau layout terlalu berat.
Jumlah artikel per halaman
Buka Settings → Reading → Blog pages show at most. Nilai 6–10 biasanya nyaman untuk layout grid.
Pagination WordPress
Gunakan fungsi native agar URL pagination, accessibility, dan integrasi plugin tetap benar.
the_posts_pagination(array(
'mid_size' => 1,
'prev_text' => __('Sebelumnya', 'plus-ui-wp'),
'next_text' => __('Berikutnya', 'plus-ui-wp'),
));
Pinned Post
Pinned Post adalah artikel yang ditampilkan lebih menonjol di homepage. Pada Plus UI WP, artikel ini dipilih melalui Customizer sehingga tidak harus sama dengan WordPress Sticky Post.
Mengambil pinned post
$pinned_id = (int) get_theme_mod('pui_pinned_post', 0);
if ($pinned_id) {
$pinned = new WP_Query(array(
'p' => $pinned_id,
'post_type' => 'post',
));
}
Mencegah duplikasi
Jika pinned post juga masuk Latest Posts, tambahkan ID ke post__not_in.
$latest = new WP_Query(array(
'posts_per_page' => 6,
'post__not_in' => array($pinned_id),
'ignore_sticky_posts' => true,
));
Popular Posts
WordPress Core tidak menyimpan view count artikel. Theme dapat menggunakan pendekatan sederhana seperti komentar terbaru/populer atau plugin analytics/view counter.
Berdasarkan jumlah komentar
$popular = new WP_Query(array(
'posts_per_page' => 5,
'orderby' => 'comment_count',
'order' => 'DESC',
));
Sticky Post WordPress
Sticky Post adalah fitur WordPress Core. Anda dapat menggunakannya untuk arsip/blog standar, tetapi homepage Plus UI memiliki pinned area sendiri sehingga keduanya tidak harus disatukan.
Offset dan pagination
offset pada WP_Query dapat membuat pagination tidak akurat. Untuk mengeluarkan artikel tertentu, lebih baik gunakan post__not_in.Query kategori
$docs = new WP_Query(array(
'category_name' => 'dokumentasi',
'posts_per_page' => 6,
'paged' => max(1, get_query_var('paged')),
));
Infinite scroll?
Infinite scroll dapat terlihat modern tetapi menambah kompleksitas aksesibilitas, history URL, dan analytics. Pagination biasa lebih stabil untuk dokumentasi. Jika memakai load more, tetap sediakan URL halaman yang dapat diakses crawler dan keyboard.
Menjaga layout stabil
- Semua thumbnail pada kartu sebaiknya memiliki aspect ratio konsisten.
- Excerpt dibatasi panjangnya.
- Judul panjang harus dapat membungkus tanpa keluar card.
- Grid tidak boleh memakai fixed width yang melebihi container.
- Gunakan CSS grid/flex yang responsif.
Rekomendasi homepage
| Bagian | Jumlah |
|---|---|
| Carousel | 4–6 artikel |
| Pinned | 1 artikel |
| Latest | 6–9 artikel per halaman |
| Popular | 5 artikel |
Pagination pada arsip kategori
Category, tag, author, dan search dapat memakai pagination yang sama. Jangan membuat query baru tanpa memindahkan nilai paged, karena halaman kedua akan terus menampilkan konten halaman pertama.
$paged = max(1, get_query_var('paged'));
$query = new WP_Query(array(
'posts_per_page' => 9,
'paged' => $paged,
));
Canonical dan halaman 2+
Jangan canonical-kan semua halaman pagination ke halaman pertama secara paksa. Mesin pencari perlu memahami halaman lanjutan sebagai URL berbeda yang menampung artikel berbeda. Plugin SEO modern biasanya menangani bagian ini.
Previous/Next pada artikel
Navigasi artikel tunggal berbeda dari pagination arsip. Untuk blog kronologis, Anda dapat menambahkan previous/next post link di bawah konten tanpa memengaruhi daftar halaman.
the_post_navigation(array(
'prev_text' => '← %title',
'next_text' => '%title →',
));
Carousel dan duplikasi
Carousel biasanya mengambil artikel terbaru atau kategori tertentu. Jika artikel yang sama juga muncul sebagai pinned dan latest, halaman dapat terlihat repetitif. Simpan daftar ID yang sudah dipakai lalu exclude dari query berikutnya bila desain mengharuskannya.
Query performa
Untuk widget kecil yang hanya membutuhkan ID, gunakan fields => ids. Untuk query yang tidak membutuhkan pagination, no_found_rows => true dapat mengurangi pekerjaan database.
$ids = get_posts(array(
'posts_per_page' => 5,
'fields' => 'ids',
'no_found_rows' => true,
));
Popular Posts dan cache
Jika popular posts dihitung dari view counter, cache hasil ranking beberapa menit/jam agar homepage tidak melakukan query agregasi berat pada setiap request.
Mobile pagination
Pada layar kecil, tombol halaman sebaiknya tidak menampilkan terlalu banyak nomor. Gunakan prev/next dan beberapa nomor di sekitar halaman aktif.
Empty state
Arsip tanpa artikel harus tetap memiliki pesan yang jelas dan link kembali, bukan area kosong.
if (!$query->have_posts()) {
echo '<p>Belum ada artikel pada bagian ini.</p>';
}
Troubleshooting pagination
Halaman 2 menghasilkan 404
Simpan ulang Settings → Permalinks untuk flush rewrite rules, lalu periksa apakah custom query menggunakan paged.
Konten halaman 1 muncul lagi
Query kemungkinan tidak menerima nilai paged atau menggunakan offset yang salah.
Artikel pinned selalu muncul di setiap halaman
Exclude ID pinned dari query latest atau tampilkan pinned hanya ketika paged sama dengan 1.
