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