Skip to content

Manipulating Default URL Based Queries

Konsep Utama: Custom Query vs Default Query

Tidak semua halaman butuh custom query. Kadang lebih baik memodifikasi default query yang sudah dibuat WordPress berdasarkan URL.

SituasiPendekatan
Home page — perlu event + blogCustom Query (WordPress tidak otomatis query ini)
Archive /events — sudah query eventsModifikasi Default Query (tinggal tweak sedikit)

Keuntungan Memodifikasi Default Query

  • Lebih sedikit kode
  • Pagination otomatis berfungsi tanpa konfigurasi tambahan
  • Tidak perlu mengubah template file (archive-event.php)

Langkah 1: Update Tanggal di archive-event.php

Salin kode tanggal dinamis dari front-page.php ke archive-event.php (ganti tanggal hardcoded):

php
<?php $eventDate = new DateTime(get_field('event_date')); ?>
<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>

Langkah 2: Hook ke pre_get_posts

Buka functions.php dan tambahkan di bagian bawah:

php
function university_adjust_queries($query) {
  if (!is_admin() AND is_post_type_archive('event') AND $query->is_main_query()) {
    $today = date('Ymd');
    $query->set('meta_key', 'event_date');
    $query->set('orderby', 'meta_value_num');
    $query->set('order', 'ASC');
    $query->set('meta_query', array(
      array(
        'key' => 'event_date',
        'compare' => '>=',
        'value' => $today,
        'type' => 'numeric'
      )
    ));
  }
}

add_action('pre_get_posts', 'university_adjust_queries');

Penjelasan Detail

Hook pre_get_posts

BagianPenjelasan
add_action('pre_get_posts', ...)Hook yang dipanggil sebelum WordPress mengirim query ke database
$query parameterReferensi ke objek WordPress Query — bisa kita modifikasi
$query->set('param', 'value')Method untuk mengubah parameter query

3 Kondisi Keamanan (IF Statement)

php
if (!is_admin() AND is_post_type_archive('event') AND $query->is_main_query())
KondisiMengapa Diperlukan
!is_admin()Jangan modifikasi query di halaman admin (backend)
is_post_type_archive('event')Hanya berlaku di archive events, bukan blog atau halaman lain
$query->is_main_query()Hanya modifikasi query utama, bukan custom query (agar tidak mengganggu sidebar/widget lain)

⚠️ Sangat penting untuk memasang ketiga kondisi ini! Tanpa kondisi, semua query di seluruh website akan terpengaruh — termasuk admin panel dan halaman blog.

Parameter yang Di-set

ParameterNilaiAksi
meta_key'event_date'Basis pengurutan
orderby'meta_value_num'Urutkan berdasarkan angka dari meta key
order'ASC'Ascending — event terdekat duluan
meta_queryArray filterHanya tampilkan event ≥ hari ini

Perbandingan: Custom Query vs pre_get_posts

┌─────────────────────────────────────────────────────────┐
│                    CUSTOM QUERY                          │
│  (front-page.php — events di home page)                 │
│                                                          │
│  $homepageEvents = new WP_Query(array(                  │
│    'posts_per_page' => 2,                               │
│    'post_type' => 'event',                              │
│    'meta_key' => 'event_date',                          │
│    ...                                                   │
│  ));                                                     │
│                                                          │
│  ✓ Dipakai saat WordPress TIDAK otomatis query          │
│  ✗ Pagination perlu konfigurasi manual                  │
└─────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────┐
│                 pre_get_posts                             │
│  (functions.php — events archive)                        │
│                                                          │
│  $query->set('meta_key', 'event_date');                 │
│  $query->set('orderby', 'meta_value_num');              │
│  ...                                                     │
│                                                          │
│  ✓ Dipakai saat WordPress SUDAH query tapi perlu tweak  │
│  ✓ Pagination otomatis berfungsi                        │
│  ✓ Tidak perlu ubah template file                       │
└─────────────────────────────────────────────────────────┘

💡 Aturan Praktis: Jika WordPress sudah membuat query berdasarkan URL (archive, category, tag, dll), gunakan pre_get_posts. Jika butuh query yang sama sekali baru (events di home page), gunakan new WP_Query().