Ikhtisar Chapter 14: Customizing REST API
Apa yang Dipelajari?
Menyesuaikan WordPress REST API — menambah field baru, membuat custom URL (route), mengirim data terorganisir per post type, dan membangun search yang aware terhadap relasi antar konten.
Poin Utama
1. Menambah Field Baru ke REST API
Gunakan register_rest_field() untuk menyisipkan property tambahan di JSON response:
register_rest_field('post', 'authorName', array(
'get_callback' => function() { return get_the_author(); }
));Apapun yang bisa diakses PHP (ACF values, cropped images, dll.) bisa dijadikan field REST API.
2. Membuat Custom Route (URL Sendiri)
Alih-alih menggunakan URL bawaan WordPress (/wp/v2/posts), buat URL sendiri:
register_rest_route('university/v1', 'search', array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'university_search_results'
));Hasilnya: /wp-json/university/v1/search?term=biology
| Keuntungan Custom Route | Penjelasan |
|---|---|
| 1 request vs 6 | Semua post type dalam 1 URL |
| Data lebih ringan | Hanya kirim property yang dibutuhkan |
| Custom search logic | Bisa handle relasi antar post type |
| PHP auto → JSON | Return array PHP, WordPress konversi otomatis |
3. Organisasi JSON per Post Type
Callback function membangun sub-arrays terpisah (generalInfo, professors, programs, events, campuses) — setiap post type bisa punya property berbeda sesuai kebutuhan tampilan.
4. Three-Column Layout di Search
JavaScript menerima 1 JSON response terstruktur, lalu merender layout 3 kolom:
- Kolom 1: General Info (posts + pages)
- Kolom 2: Programs + Professors (dengan foto)
- Kolom 3: Campuses + Events (dengan tanggal circle)
Setiap section punya "no result" message sendiri dan link ke halaman arsip.
5. Search yang Aware Relasi (Relationship-Aware)
Masalah: search "biology" tidak menampilkan professor yang mengajar Biology karena relasi ada di ACF field, bukan di title/content.
Solusi — 2 tahap query:
- Main query — cari semua post type berdasarkan keyword
- Relationship query — dari program ID yang ditemukan, cari professor/event yang memiliki
related_programsLIKE ID tersebut
foreach ($results['programs'] as $item) {
array_push($programsMetaQuery, array(
'key' => 'related_programs', 'compare' => 'LIKE', 'value' => '"' . $item['id'] . '"'
));
}Gunakan array_unique() + array_values() untuk menghapus duplikat.
6. Menghindari False Positive
Pindahkan konten program dari default editor ke ACF WYSIWYG field (main_body_content), lalu hapus 'editor' dari CPT supports. WordPress search ('s') tidak menelusuri ACF field — sehingga keyword di body content tidak memicu relasi palsu.
7. Sanitasi & Keamanan
Selalu gunakan sanitize_text_field($data['term']) saat menerima input dari URL parameter — mencegah serangan injection.
8. Bonus: jQuery-Free dengan Axios
$.getJSON() bisa diganti axios.get() + async/await untuk bundle JS lebih kecil tanpa jQuery.
Satu Kalimat
Custom REST API route memungkinkan satu request JSON mengembalikan data terorganisir dari semua post type, termasuk relasi antar konten yang tidak bisa ditangani search bawaan WordPress.