Skip to content

Past Events Page (Custom Query Pagination)

Tujuan

Membuat halaman khusus Past Events yang menampilkan event-event yang sudah lewat, lengkap dengan pagination yang berfungsi.


Langkah 1: Buat Page di WordPress Admin

  1. PagesAdd New
  2. Title: Past Events
  3. Biarkan konten kosong
  4. Klik Publish

Slug otomatis: past-events


Langkah 2: Buat Template File

Buat file baru di folder tema: page-past-events.php

WordPress otomatis akan menggunakan file page-{slug}.php untuk halaman dengan slug tersebut.

Nama FileCocok Untuk
page.phpSemua halaman (default)
page-past-events.phpKhusus halaman dengan slug past-events
page-about-us.phpKhusus halaman dengan slug about-us

💡 Ini bagian dari WordPress Template Hierarchy: page-{slug}.php memiliki prioritas lebih tinggi dari page.php.


Langkah 3: Kode Template + Custom Query

Salin isi archive-event.php sebagai template awal, lalu modifikasi:

File: page-past-events.php

php
<?php get_header(); ?>

<div class="page-banner">
  <div class="page-banner__content container container--narrow">
    <h1 class="page-banner__title">Past Events</h1>
    <div class="page-banner__intro">
      <p>A recap of our past events.</p>
    </div>
  </div>
</div>

<div class="container container--narrow page-section">

  <?php
    $today = date('Ymd');
    $pastEvents = new WP_Query(array(
      'paged' => get_query_var('paged', 1),
      'post_type' => 'event',
      'meta_key' => 'event_date',
      'orderby' => 'meta_value_num',
      'order' => 'ASC',
      'meta_query' => array(
        array(
          'key' => 'event_date',
          'compare' => '<',
          'value' => $today,
          'type' => 'numeric'
        )
      )
    ));

    while ($pastEvents->have_posts()) {
      $pastEvents->the_post();
      $eventDate = new DateTime(get_field('event_date')); ?>

      <div class="event-summary">
        <a class="event-summary__date t-center" href="<?php the_permalink(); ?>">
          <span class="event-summary__month"><?php echo $eventDate->format('M'); ?></span>
          <span class="event-summary__day"><?php echo $eventDate->format('d'); ?></span>
        </a>
        <div class="event-summary__content">
          <h5 class="event-summary__title headline headline--tiny">
            <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
          </h5>
          <p><?php echo wp_trim_words(get_the_content(), 18); ?></p>
        </div>
      </div>

    <?php } ?>

    <?php
      echo paginate_links(array(
        'total' => $pastEvents->max_num_pages
      ));
    ?>

</div>

<?php get_footer(); ?>

Perbedaan dari Upcoming Events Query

ParameterUpcoming EventsPast Events
compare'>=' (≥ hari ini)'<' (< hari ini)
posts_per_page2 (di home page)Default 10 (WordPress default)
pagedTidak perluWajib untuk pagination

Pagination dengan Custom Query

Masalah

Pagination di WordPress hanya otomatis berfungsi dengan default URL-based query. Untuk custom query (new WP_Query), perlu konfigurasi manual.

3 Hal yang Harus Dikonfigurasi

1. Parameter paged di Query

php
'paged' => get_query_var('paged', 1)
BagianPenjelasan
get_query_var('paged', 1)Ambil nomor halaman dari URL (contoh: /past-events/page/2 → return 2)
, 1Fallback ke halaman 1 jika tidak ada nomor di URL

2. Loop Menggunakan Custom Query Object

php
while ($pastEvents->have_posts()) {
  $pastEvents->the_post();
  // ...
}

Pastikan loop pakai $pastEvents->have_posts() dan $pastEvents->the_post(), bukan have_posts() / the_post() global.

php
echo paginate_links(array(
  'total' => $pastEvents->max_num_pages
));
ParameterPenjelasan
'total'Jumlah total halaman hasil
$pastEvents->max_num_pagesProperty dari WP_Query object yang menghitung total halaman

Alur Pagination Custom Query

URL: /past-events/page/2


get_query_var('paged', 1) → returns 2


WP_Query parameter 'paged' => 2
(skip 10 posts pertama, ambil 10 berikutnya)


paginate_links() menampilkan link navigasi
(butuh 'total' => max_num_pages dari query object)

Di archive-event.php, tambahkan link ke Past Events di bagian bawah:

php
<?php echo paginate_links(); ?>

<hr class="section-break">
<p>Looking for a recap of past events? <a href="<?php echo site_url('/past-events'); ?>">Check out our past events archive</a>.</p>
FungsiPenjelasan
site_url('/past-events')Generate URL absolut berdasarkan domain website

💡 Gunakan site_url() daripada hardcode URL — lebih aman jika WordPress dipasang di subdirectory.


Langkah 5: Update Header Navigation

Di header.php, update kondisi untuk events link agar menyala kuning di halaman Past Events juga:

php
<li <?php if (get_post_type() == 'event' OR is_page('past-events')) echo 'class="current-menu-item"'; ?>>
  <a href="<?php echo get_post_type_archive_link('event'); ?>">Events</a>
</li>
KondisiKapan True
get_post_type() == 'event'Di archive events atau single event
is_page('past-events')Di halaman Past Events

Ringkasan File Baru & Perubahan

FileAksi
page-past-events.phpBARU — template untuk halaman past events
archive-event.phpTambah link ke past events di bawah
header.phpTambah kondisi is_page('past-events') untuk navigasi