Wordpress Settings API Admin Menus Capabilities Sanitization Form Handling
Selesai membaca dokumentasi ini?
Kembali ke rujukan utama WordPress untuk melanjutkan topik lainnya.
Kembali ke rujukan utama WordPress untuk melanjutkan topik lainnya.
Settings API adalah kumpulan fungsi WordPress untuk mendaftarkan, menampilkan, dan memproses pengaturan di admin dashboard dengan cara yang konsisten. Di praktik plugin/theme work, API ini biasanya dipakai untuk halaman settings yang menyimpan opsi ke wp_options, lengkap dengan section, field, capability check, nonce, dan sanitization callback.
Kalau kamu sedang membangun halaman admin yang isinya form pengaturan, Settings API memberi struktur yang lebih aman dan lebih gampang dirawat dibanding menulis alur submit manual dari nol.
Pakai Settings API kalau kebutuhanmu cocok dengan pola pengaturan situs, misalnya:
Settings API biasanya pilihan yang sehat kalau kamu butuh:
options.php tanpa custom processing berlebihanJangan dipaksakan kalau kebutuhanmu sebenarnya berbeda:
Prinsip praktisnya: Settings API bagus untuk site-level configuration. Kalau objeknya bukan setting global, sering kali ada API WordPress lain yang lebih pas.
Di admin WordPress, tiga hal ini sering terlihat seperti satu blok, padahal perannya beda:
options.php, lalu sanitize dan redirectUrutan umumnya begini:
settings_fields() dan do_settings_sections()options.phpAdmin menu dibuat dengan hook seperti admin_menu atau network_admin_menu, lalu halaman ditambahkan dengan fungsi seperti add_menu_page() atau add_submenu_page().
add_menu_page()Dipakai untuk membuat menu level atas di sidebar admin.
Contoh:
add_action('admin_menu', function () {
add_menu_page(
'Plugin Settings',
'Plugin Settings',
'manage_options',
'myplugin-settings',
'myplugin_render_settings_page',
'dashicons-admin-generic'
);
});Parameter pentingnya:
add_submenu_page()Dipakai kalau halaman settings menjadi turunan menu yang sudah ada.
Contoh:
add_action('admin_menu', function () {
add_submenu_page(
'options-general.php',
'Plugin Settings',
'Plugin Settings',
'manage_options',
'myplugin-settings',
'myplugin_render_settings_page'
);
});Capability di menu bukan sekadar kosmetik. Itu membatasi siapa yang bisa membuka halaman sejak dari navigasi.
Kalau menu bisa terlihat oleh user yang salah, kamu berisiko:
Tetap lakukan capability check di callback page dan saat save. Jangan percaya hanya pada visibility menu.
Settings API punya tiga lapisan utama:
register_setting()Mendaftarkan option name, group, dan aturan sanitization.
Contoh:
add_action('admin_init', function () {
register_setting('myplugin_settings_group', 'myplugin_api_key', [
'type' => 'string',
'sanitize_callback' => 'sanitize_text_field',
'default' => '',
'show_in_rest' => false
Yang penting di sini:
Kalau nilai yang disimpan kompleks, sanitize_callback sering perlu custom logic, bukan sekadar helper bawaan.
add_settings_section()Membagi form menjadi blok logis.
Contoh:
add_settings_section(
'myplugin_main_section',
'Pengaturan Utama',
function () {
echo '<p>Atur konfigurasi dasar plugin di sini.</p>';
},
'myplugin-settings'
);Section membantu pembaca karena form admin WordPress cepat jadi padat. Section membuat halaman lebih mudah dipindai.
add_settings_field()Mendaftarkan field individual yang ditampilkan di dalam section.
Contoh:
add_settings_field(
'myplugin_api_key_field',
'API Key',
'myplugin_render_api_key_field',
'myplugin-settings',
'myplugin_main_section'
);Callback field biasanya bertugas menampilkan input, checkbox, select, atau textarea. Nilai saat ini dibaca dari option yang tersimpan.
Di callback render halaman, pola dasarnya seperti ini:
function myplugin_render_settings_page() {
if (!current_user_can('manage_options')) {
wp_die(__('You do not have sufficient permissions to access this page.'));
}
?>
<div class="wrap">
Tiga fungsi penting di dalam form:
settings_fields()do_settings_sections()submit_button()settings_fields() menghasilkan hidden fields yang berisi nonce dan group yang dibutuhkan options.php.
options.phpSaat form disubmit ke options.php, WordPress menangani proses save dengan pola standar.
settings_fields() memastikan nonce dan group ikut terkirimoptions.phpKalau kamu memakai Settings API, action="options.php" bukan detail kecil. Itu jalur resmi yang dipakai WordPress untuk memproses option group yang sudah diregister.
Kalau kamu mengganti ke endpoint custom tanpa alasan yang jelas, kamu harus mengurus sendiri:
Itu bisa saja valid, tapi kamu keluar dari pola standar Settings API.
Sanitization adalah lapisan penting sebelum data ditulis ke database. Di WordPress admin, asumsi yang aman adalah: input dari form tetap harus dianggap tidak tepercaya.
Ini jebakan yang sering terjadi:
Keduanya beda fungsi.
Contoh aturan umum:
sanitize_text_field()sanitize_textarea_field()esc_url_raw()sanitize_email() lalu validasi hasilnyafunction myplugin_sanitize_settings($input) {
$output = [];
$output['api_key'] = isset($input['api_key'])
? sanitize_text_field($input['api_key'])
: '';
$output['endpoint'] =
Lalu dipakai di register_setting():
register_setting('myplugin_settings_group', 'myplugin_settings', [
'type' => 'array',
'sanitize_callback' => 'myplugin_sanitize_settings',
]);Sanitization tidak menggantikan authorization. Walaupun data sudah dibersihkan, user yang tidak berhak tetap tidak boleh menyimpan setting sensitif.
Gunakan capability seperti:
manage_options untuk menu admin yang benar-benar sensitifKalau fitur itu untuk editor atau role tertentu, jangan langsung pakai manage_options hanya karena paling gampang.
Settings API secara default bekerja bersama nonce dari settings_fields(). Itu penting untuk mencegah CSRF.
settings_fields()Kalau kamu keluar dari options.php, pastikan alur pengamanan minimal setara: nonce, capability, sanitization, dan logging/error handling bila perlu.
Kalau semua field disimpan ke satu option blob tanpa skema yang jelas, halaman settings jadi sulit dirawat. Lebih baik bentuk datanya jelas sejak awal.
Menu yang tersembunyi bukan berarti aman. Tetap cek capability di callback render dan di jalur save.
Escaping bukan untuk menyimpan data. Kalau data masuk ke database dalam bentuk yang sudah di-escape, kamu bisa bikin bug saat output berikutnya.
Beberapa field butuh format tertentu. Kalau kamu pakai sanitization yang salah, data valid bisa ikut rusak.
Contoh:
Callback render field sebaiknya hanya menampilkan UI. Kalau logika save, validasi, atau transform terlalu banyak disebar di callback field, page jadi sulit dipahami.
Group, page slug, dan option name harus konsisten supaya settings_fields() dan do_settings_sections() tidak meleset.
Admin UI tetap butuh escaping saat render:
esc_html() untuk teksesc_attr() untuk value inputesc_url() untuk URLAdmin bukan alasan untuk mengendurkan escaping.
Halaman admin WordPress adalah area bersama. Hindari:
.button tanpa scopeKalau kamu membangun settings page yang rapi, susun layer-nya seperti ini:
Kalau dipisahkan begini, tiap bagian punya tanggung jawab yang jelas.
Pakai Settings API kalau kamu membangun pengaturan global plugin/theme dan ingin alur save yang mengikuti pola WordPress.
Ingat urutan intinya:
settings_fields() dan do_settings_sections()options.phpKalau yang kamu bangun bukan settings global, pertimbangkan API lain yang lebih sesuai. Settings API itu kuat, tapi paling bagus saat dipakai pada masalah yang memang cocok dengan modelnya.