Ordering (Sorting) Custom Queries
Tujuan
Mengatur urutan post yang ditampilkan oleh custom query — khususnya mengurutkan events berdasarkan event date (bukan published date), dan menyembunyikan events yang sudah lewat.
1. Parameter Order & OrderBy
Di front-page.php, tambahkan parameter orderby dan order ke custom query:
php
<?php
$homepageEvents = new WP_Query(array(
'posts_per_page' => -1, // -1 = ambil semua posts (sementara untuk eksperimen)
'post_type' => 'event',
'orderby' => 'title',
'order' => 'ASC'
));
?>Opsi orderby
| Nilai | Urutkan Berdasarkan |
|---|---|
'post_date' | Tanggal publish (default WordPress) |
'title' | Judul post (abjad) |
'rand' | Acak setiap reload |
'meta_value' | Nilai custom field (untuk huruf/teks) |
'meta_value_num' | Nilai custom field (untuk angka — termasuk tanggal) |
Opsi order
| Nilai | Arah |
|---|---|
'DESC' | Descending / menurun (default) |
'ASC' | Ascending / menaik |
2. Mengurutkan Berdasarkan Custom Field (Event Date)
Untuk mengurutkan berdasarkan custom field, gunakan meta_value_num + meta_key:
php
<?php
$homepageEvents = new WP_Query(array(
'posts_per_page' => -1,
'post_type' => 'event',
'meta_key' => 'event_date',
'orderby' => 'meta_value_num',
'order' => 'ASC'
));
?>| Parameter | Nilai | Penjelasan |
|---|---|---|
meta_key | 'event_date' | Nama custom field yang dijadikan basis sorting |
orderby | 'meta_value_num' | Urutkan berdasarkan nilai numerik dari meta key. Pakai meta_value_num (bukan meta_value) karena tanggal adalah angka |
order | 'ASC' | Ascending — event terdekat di atas |
3. Menyembunyikan Events yang Sudah Lewat (Meta Query)
Gunakan meta_query untuk memfilter post berdasarkan nilai custom field:
php
<?php
$today = date('Ymd');
$homepageEvents = new WP_Query(array(
'posts_per_page' => 2,
'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'
)
)
));
?>Penjelasan meta_query
meta_query menerima array dari array (bisa berisi beberapa kondisi filter):
meta_query => array( ← array luar: container untuk semua kondisi
array( ← array dalam: satu kondisi filter
'key' => '...',
'compare' => '...',
'value' => '...',
'type' => '...'
),
array( ← kondisi filter kedua (opsional)
...
)
)| Parameter | Nilai | Penjelasan |
|---|---|---|
key | 'event_date' | Custom field yang mau difilter |
compare | '>=' | Operator perbandingan: lebih besar atau sama dengan |
value | $today | Nilai pembanding — tanggal hari ini dalam format Ymd |
type | 'numeric' | Tipe data yang dibandingkan (angka) |
Variabel $today
php
$today = date('Ymd'); // Contoh output: "20170628"PHP function date('Ymd') menghasilkan tanggal hari ini dalam format yang sama dengan format return ACF date picker (Ymd).
Operator Compare yang Tersedia
| Operator | Arti |
|---|---|
'=' | Sama dengan |
'!=' | Tidak sama dengan |
'>' | Lebih besar dari |
'>=' | Lebih besar/sama dengan |
'<' | Lebih kecil dari |
'<=' | Lebih kecil/sama dengan |
'BETWEEN' | Di antara dua nilai |
'LIKE' | Mengandung teks |
Kode Final Home Page Events
php
<?php
$today = date('Ymd');
$homepageEvents = new WP_Query(array(
'posts_per_page' => 2,
'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 ($homepageEvents->have_posts()) {
$homepageEvents->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 if (has_excerpt()) {
echo get_the_excerpt();
} else {
echo wp_trim_words(get_the_content(), 18);
} ?>
</p>
</div>
</div>
<?php } ?>Hasil: Hanya menampilkan 2 event terdekat yang belum lewat, diurutkan dari yang paling dekat.