Skip to content

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

NilaiUrutkan 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

NilaiArah
'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'
  ));
?>
ParameterNilaiPenjelasan
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)
    ...
  )
)
ParameterNilaiPenjelasan
key'event_date'Custom field yang mau difilter
compare'>='Operator perbandingan: lebih besar atau sama dengan
value$todayNilai 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

OperatorArti
'='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.