Skip to content

Displaying Relationships (Front-End)

Tujuan

Menampilkan relasi antara post di frontend:

  1. Di halaman single event → tampilkan related programs
  2. Di halaman single program → tampilkan upcoming events yang berhubungan

Konsep

ACF Relationship field mengembalikan array of post objects. Kita bisa loop array ini dengan foreach.

Kode di single-event.php

Tambahkan kode berikut setelah div generic-content:

php
<?php
  $relatedPrograms = get_field('related_programs');

  if ($relatedPrograms) {
    echo '<hr class="section-break">';
    echo '<h2 class="headline headline--medium">Related Program(s)</h2>';
    echo '<ul class="link-list min-list">';

    foreach ($relatedPrograms as $program) { ?>
      <li><a href="<?php echo get_the_permalink($program); ?>"><?php echo get_the_title($program); ?></a></li>
    <?php }

    echo '</ul>';
  }
?>

Penjelasan Detail

BarisPenjelasan
get_field('related_programs')Ambil array of post objects dari ACF relationship field
if ($relatedPrograms)Hanya jalankan kode jika field tidak kosong (cegah error jika belum ada relasi)
foreach ($relatedPrograms as $program)Loop setiap item di array
get_the_title($program)Ambil judul dari post object (bukan the_title() karena kita tidak dalam WP Loop)
get_the_permalink($program)Ambil permalink dari post object

Perbedaan the_title() vs get_the_title()

FungsiKapan DipakaiCara Pakai
the_title()Dalam WordPress Loop (while have_posts)Otomatis echo
get_the_title($post)Di luar loop, perlu pass post object/IDPerlu echo manual

⚠️ Selalu wrap kode relationship dalam if statement! Jika field kosong dan kamu coba foreach pada variabel kosong, PHP akan error.


Tantangan

Di single program, tidak ada custom field yang menunjuk ke events. Relasi hanya disimpan di sisi event (event → program). Solusi: gunakan custom query dengan meta_query untuk mencari events yang merujuk ke program ini.

Kode di single-program.php

Tambahkan setelah div generic-content:

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'
      ),
      array(
        'key' => 'related_programs',
        'compare' => 'LIKE',
        'value' => '"' . get_the_ID() . '"'
      )
    )
  ));

  if ($homepageEvents->have_posts()) {
    echo '<hr class="section-break">';
    echo '<h2 class="headline headline--medium">Upcoming ' . get_the_title() . ' Events</h2>';

    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 echo wp_trim_words(get_the_content(), 18); ?></p>
        </div>
      </div>

    <?php }
  }

  wp_reset_postdata();
?>

Penjelasan Meta Query Tambahan

php
array(
  'key' => 'related_programs',
  'compare' => 'LIKE',
  'value' => '"' . get_the_ID() . '"'
)
BagianPenjelasan
keyCustom field related_programs yang disimpan di event posts
compareLIKE — cari string yang mengandung value
valueID program saat ini, dibungkus dengan tanda kutip

Mengapa Perlu Tanda Kutip di Value?

WordPress menyimpan array relationship sebagai serialized string di database:

a:1:{i:0;s:2:"42";}

Jika program ID = 12 dan kita cari tanpa kutip:

  • 12 → cocok dengan 12, 120, 1200 (false positive!)

Jika kita cari "12" (dengan kutip):

  • "12" → hanya cocok dengan "12" persis ✅
php
// ❌ Salah — bisa match false positives
'value' => get_the_ID()

// ✅ Benar — hanya match ID yang tepat
'value' => '"' . get_the_ID() . '"'

Wrap dalam IF Statement

php
if ($homepageEvents->have_posts()) {
  // Tampilkan heading & events
}

Ini mencegah heading "Upcoming Events" muncul di halaman program yang tidak punya event terkait.


Alur Relasi 2 Arah

┌─────────────────────┐         ┌──────────────────────┐
│   EVENT POST         │         │   PROGRAM POST       │
│   (Science of Cats)  │         │   (Biology)          │
│                      │         │                      │
│ Custom Field:        │         │ Tidak ada field      │
│ related_programs:    │────────▶│ ke events            │
│   [Biology]          │         │                      │
│                      │         │ Solusi: Custom Query  │
│                      │◀────────│ meta_query LIKE      │
│                      │         │ di related_programs   │
└─────────────────────┘         └──────────────────────┘
ArahMetodeLokasi Kode
Event → Programget_field('related_programs') + foreachsingle-event.php
Program → EventWP_Query + meta_query LIKEsingle-program.php