Skip to content

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:

php
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:

php
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 RoutePenjelasan
1 request vs 6Semua post type dalam 1 URL
Data lebih ringanHanya kirim property yang dibutuhkan
Custom search logicBisa handle relasi antar post type
PHP auto → JSONReturn 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.

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:

  1. Main query — cari semua post type berdasarkan keyword
  2. Relationship query — dari program ID yang ditemukan, cari professor/event yang memiliki related_programs LIKE ID tersebut
php
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.