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.
| Situasi | Pendekatan |
|---|---|
| Home page — perlu event + blog | Custom Query (WordPress tidak otomatis query ini) |
Archive /events — sudah query events | Modifikasi 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
| Bagian | Penjelasan |
|---|---|
add_action('pre_get_posts', ...) | Hook yang dipanggil sebelum WordPress mengirim query ke database |
$query parameter | Referensi 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())| Kondisi | Mengapa 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
| Parameter | Nilai | Aksi |
|---|---|---|
meta_key | 'event_date' | Basis pengurutan |
orderby | 'meta_value_num' | Urutkan berdasarkan angka dari meta key |
order | 'ASC' | Ascending — event terdekat duluan |
meta_query | Array filter | Hanya 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), gunakannew WP_Query().