Skip to content

Reduce Duplicate Code — Membuat Fungsi pageBanner()

Tujuan

Menghilangkan duplikasi kode page banner yang tersebar di banyak template file, dengan cara membuat satu fungsi reusable di functions.php.

⚠️ Catatan: Di lesson ini kita akan melihat PHP warning "Undefined array key". Ini sengaja — akan diperbaiki di lesson berikutnya menggunakan isset().


Masalah: Page Banner Terduplikasi

Kode page banner (background image, title, subtitle) ada di:

  • single-professor.php
  • single-event.php
  • single-program.php
  • single.php
  • page.php
  • archive-event.php
  • archive-program.php
  • index.php
  • dll.

Jika ingin mengubah HTML banner → harus edit semua file satu per satu ❌


Langkah 1: Buat Fungsi pageBanner di functions.php

Pindahkan kode page banner ke dalam fungsi di functions.php:

php
function pageBanner($args = NULL) {

  // PHP logic: fallback/default values
  if (!isset($args['title'])) {
    $args['title'] = get_the_title();
  }

  if (!isset($args['subtitle'])) {
    $args['subtitle'] = get_field('page_banner_subtitle');
  }

  if (!isset($args['photo'])) {
    if (get_field('page_banner_background_image') AND !is_archive() AND !is_home()) {
      $args['photo'] = get_field('page_banner_background_image')['sizes']['pageBanner'];
    } else {
      $args['photo'] = get_theme_file_uri('/images/ocean.jpg');
    }
  }

  ?>
  <div class="page-banner">
    <div class="page-banner__bg-image" style="background-image: url(<?php echo $args['photo']; ?>);">
    </div>
    <div class="page-banner__content container container--narrow">
      <h1 class="page-banner__title"><?php echo $args['title']; ?></h1>
      <div class="page-banner__intro">
        <p><?php echo $args['subtitle']; ?></p>
      </div>
    </div>
  </div>
  <?php
}

Penjelasan Parameter

ParameterJika disediakanJika TIDAK disediakan (fallback)
titleGunakan nilai argumenget_the_title() — judul post/page dari database
subtitleGunakan nilai argumenget_field('page_banner_subtitle') — ACF subtitle field
photoGunakan URL argumenCek ACF image → jika ada pakai itu, jika tidak pakai ocean.jpg

Fallback Photo: 3 Level

1. Argumen 'photo' disediakan? → Gunakan itu
   ↓ (tidak)
2. ACF background image ada? (dan bukan archive/home) → Gunakan itu
   ↓ (tidak)
3. Fallback → ocean.jpg

Langkah 2: Parameter $args = NULL

$args = NULL membuat parameter opsional. Tanpa ini, memanggil pageBanner() tanpa argumen akan error:

php
// ❌ Fatal error jika args required
function pageBanner($args) { ... }
pageBanner(); // Error!

// ✅ OK karena args optional
function pageBanner($args = NULL) { ... }
pageBanner(); // Tidak error, args = NULL

Langkah 3: Cara Memanggil Fungsi

Tanpa argumen (gunakan semua fallback):

php
<?php pageBanner(); ?>

Dengan argumen kustom:

php
<?php
  pageBanner(array(
    'title' => 'All Events',
    'subtitle' => 'See what is going on in our world.',
    'photo' => 'https://example.com/custom-image.jpg'
  ));
?>

Sebagian argumen (sisanya fallback):

php
<?php
  pageBanner(array(
    'title' => 'Past Events',
    'subtitle' => 'A recap of our past events.'
  ));
?>

Fix: Undefined Array Key Warning (PHP Modern)

Di PHP versi baru, mengakses array key yang tidak ada menghasilkan warning. Gunakan isset():

php
// ❌ PHP Warning: Undefined array key "title"
if (!$args['title']) { ... }

// ✅ Aman — cek dulu apakah key ada
if (!isset($args['title'])) { ... }

Terapkan isset() untuk ketiga property: title, subtitle, photo.


Fix: Archive Page Bug

Pada halaman archive (misal All Events), jika event pertama memiliki background image, fungsi bisa salah mengambil gambar event itu sebagai banner archive. Tambahkan kondisi:

php
if (!isset($args['photo'])) {
  if (get_field('page_banner_background_image') AND !is_archive() AND !is_home()) {
    $args['photo'] = get_field('page_banner_background_image')['sizes']['pageBanner'];
  } else {
    $args['photo'] = get_theme_file_uri('/images/ocean.jpg');
  }
}

!is_archive() dan !is_home() → memastikan hanya ambil ACF image dari post/page individual, bukan dari halaman listing/archive.