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.phpsingle-event.phpsingle-program.phpsingle.phppage.phparchive-event.phparchive-program.phpindex.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:
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
| Parameter | Jika disediakan | Jika TIDAK disediakan (fallback) |
|---|---|---|
title | Gunakan nilai argumen | get_the_title() — judul post/page dari database |
subtitle | Gunakan nilai argumen | get_field('page_banner_subtitle') — ACF subtitle field |
photo | Gunakan URL argumen | Cek 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.jpgLangkah 2: Parameter $args = NULL
$args = NULL membuat parameter opsional. Tanpa ini, memanggil pageBanner() tanpa argumen akan error:
// ❌ Fatal error jika args required
function pageBanner($args) { ... }
pageBanner(); // Error!
// ✅ OK karena args optional
function pageBanner($args = NULL) { ... }
pageBanner(); // Tidak error, args = NULLLangkah 3: Cara Memanggil Fungsi
Tanpa argumen (gunakan semua fallback):
<?php pageBanner(); ?>Dengan argumen kustom:
<?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
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 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:
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.