Wordpress REST API Custom Endpoints Nonces Permission Callbacks Auth Flow
Selesai membaca dokumentasi ini?
Kembali ke rujukan utama WordPress untuk melanjutkan topik lainnya.
Kembali ke rujukan utama WordPress untuk melanjutkan topik lainnya.
WordPress REST API adalah lapisan HTTP JSON yang dipakai untuk membaca atau memodifikasi data WordPress tanpa harus melalui render halaman HTML. Di theme atau plugin work, REST API biasanya dipakai saat kamu butuh komunikasi yang lebih eksplisit antara browser, aplikasi lain, atau kode custom yang tidak cocok dijalankan lewat template biasa.
REST API WordPress bukan sekadar “endpoint JSON”. Di dalamnya ada alur penting: route harus diregister, request harus lolos permission check, callback baru boleh jalan, lalu respons dikembalikan dalam format yang konsisten.
Pakai REST API kalau kebutuhanmu cocok dengan pola request/response yang jelas, misalnya:
REST API biasanya kurang cocok kalau:
Prinsip praktisnya: pakai REST API kalau ada nilai nyata dari struktur request yang formal, output JSON, dan kontrol akses yang jelas.
Route REST API didaftarkan lewat register_rest_route() di hook rest_api_init.
Contoh dasar:
add_action('rest_api_init', function () {
register_rest_route('myplugin/v1', '/books/(?P<id>\d+)', [
'methods' => 'GET',
'callback' => 'myplugin_get_book',
'permission_callback' => '__return_true',
]);
});rest_api_init.register_rest_route().myplugin/v1/books/(?P<id>\d+)Contoh namespace yang sehat biasanya punya versi, karena kamu hampir pasti akan melakukan perubahan skema respons di masa depan.
WordPress mendukung parameter dinamis lewat regex capture group, misalnya:
register_rest_route('myplugin/v1', '/books/(?P<id>\d+)', [
'methods' => 'GET',
'callback' => 'myplugin_get_book',
]);(?P<id>\d+) menangkap angka sebagai id. Ini berguna untuk resource detail seperti post, book, event, atau order.
permission_callback adalah gerbang utama sebelum callback dijalankan. Ini bukan dekorasi. Ini lapisan kontrol akses yang menentukan apakah request berhak melanjutkan.
Tanpa permission check yang benar, endpoint bisa kebuka ke publik atau memberi akses yang terlalu luas. Karena REST API sering dipakai dari browser, bahaya paling umum justru bukan SQL injection saja, melainkan endpoint terbuka tanpa otorisasi yang tepat.
Kalau endpoint memang boleh diakses semua orang:
'permission_callback' => '__return_true'Pakai ini hanya kalau datanya memang publik.
Kalau user harus login:
'permission_callback' => function () {
return is_user_logged_in();
}Kalau akses harus mengikuti capability:
'permission_callback' => function () {
return current_user_can('edit_posts');
}Kalau akses tergantung objek tertentu:
'permission_callback' => function ($request) {
$post_id = (int) $request['id'];
return current_user_can('edit_post', $post_id);
}Ini lebih sehat karena izin diperiksa terhadap resource yang benar, bukan hanya status login.
is_user_logged_in() cukup untuk semua kasus.__return_true.Nonce di WordPress dipakai sebagai token keamanan untuk request yang datang dari browser yang sudah punya sesi login. Di REST API, nonce sering dipakai untuk membuktikan bahwa request datang dari context WordPress yang valid, terutama dari admin atau frontend yang memakai cookie auth.
WordPress REST biasanya memakai header:
X-WP-Nonce: <nonce>Nonce ini biasanya dibuat dari PHP lalu dikirim ke JavaScript, misalnya lewat wp_localize_script() atau wp_add_inline_script().
Nonce dibutuhkan kalau request:
Nonce bukan pengganti capability check. Ini penting: nonce memverifikasi request context, capability memverifikasi hak akses.
Jangan memperlakukan nonce sebagai secret jangka panjang. Nonce:
WordPress REST API mendukung beberapa pola autentikasi, dan pilihan yang tepat tergantung siapa yang memanggil endpoint.
Ini umum dipakai di dalam situs WordPress itu sendiri, terutama dari admin atau frontend yang sudah login.
Alurnya:
X-WP-NonceIni pola paling umum untuk request AJAX atau interaksi UI di situs yang sama.
Dipakai saat aplikasi eksternal perlu akses ke site WordPress dengan identitas yang jelas. Cocok untuk integrasi server-to-server atau tooling yang tidak berjalan di browser user.
Catatan penting:
Beberapa setup memakai OAuth atau plugin auth khusus. Ini biasanya dipakai kalau integrasi butuh token exchange atau akses terdelegasi.
Basic auth kadang dipakai saat development atau environment tertentu, tetapi bukan pilihan utama untuk produksi kecuali ada lapisan keamanan tambahan yang jelas.
Urutannya biasanya seperti ini:
permission_callback dievaluasiWP_REST_Response, array, atau WP_Error sesuai konteks.add_action('rest_api_init', function () {
register_rest_route('myplugin/v1', '/books/(?P<id>\d+)', [
'methods' => 'GET',
'callback' =>
WP_Error dengan status yang jelaspermission_callbackDi banyak versi WordPress, endpoint tanpa permission_callback yang jelas akan memicu warning atau perilaku yang tidak diinginkan. Lebih penting lagi, kamu jadi berisiko meluncurkan endpoint tanpa kontrol akses yang eksplisit.
Nonce hanya melindungi konteks request, bukan hak akses penuh. Kalau user tidak boleh melakukan aksi itu, tetap harus dicek capability-nya.
is_user_logged_in() cukupLogin bukan berarti user berhak melakukan semua aksi. Pakai capability yang sesuai resource.
methodsEndpoint yang seharusnya hanya GET bisa kebuka untuk POST, PUT, atau DELETE kalau metode tidak dibatasi dengan benar.
Jangan langsung percaya pada nilai dari URL, query string, atau body. Validasi dan sanitasi tetap wajib.
Kalau satu endpoint mengembalikan array mentah, endpoint lain mengembalikan HTML, dan yang lain lagi campur-campur, konsumsi API jadi sulit. Jaga struktur respons tetap konsisten.
Callback yang besar biasanya sulit dirawat. Pisahkan validasi, query, transformasi data, dan otorisasi ke bagian yang jelas.
Request dari browser mungkin punya cookie dan nonce. Request dari luar site biasanya tidak. Auth flow harus disesuaikan dengan siapa client-nya.
Data yang sensitif atau user-specific tidak selalu aman kalau diperlakukan seperti response publik yang bisa di-cache sembarangan.
vendor/v1rest_ensure_response() untuk normalisasi responsrest_api_init dan register_rest_route().permission_callback harus menjadi gerbang akses utama.