Settings Page & Settings API
Gambaran Umum
Video ini membahas cara menambahkan halaman pengaturan (settings page) ke plugin WordPress dan menggunakan WordPress Settings API untuk menyimpan data ke database secara aman.
Bagian 1: Menambahkan Settings Page
Mendaftarkan Menu di Admin
Di dalam constructor class plugin, tambahkan action untuk admin_menu:
php
class WordCountAndTimePlugin {
function __construct() {
add_action('admin_menu', array($this, 'adminPage'));
add_filter('the_content', array($this, 'ifWrap'));
}add_options_page() — 5 Argumen
php
function adminPage() {
add_options_page(
'Word Count Settings', // 1. Page title (judul di tab browser)
'Word Count', // 2. Menu text (teks di sidebar admin)
'manage_options', // 3. Capability (siapa yang bisa akses)
'word-count-settings-page', // 4. Slug (URL unik halaman)
array($this, 'ourHTML') // 5. Callback function (output HTML)
);
}Membuat HTML Halaman Settings
php
function ourHTML() { ?>
<div class="wrap">
<h1>Word Count Settings</h1>
<form action="options.php" method="POST">
<?php
settings_fields('wordcountplugin');
do_settings_sections('word-count-settings-page');
submit_button();
?>
</form>
</div>
<?php }Penting: Action form harus
options.php— ini adalah file bawaan WordPress yang menangani penyimpanan settings.
Bagian 2: WordPress Settings API
Mendaftarkan Settings di admin_init
php
function __construct() {
add_action('admin_menu', array($this, 'adminPage'));
add_action('admin_init', array($this, 'settings'));
add_filter('the_content', array($this, 'ifWrap'));
}3 Fungsi Utama Settings API
1. register_setting() — Mendaftarkan option ke database
php
function settings() {
// Mendaftarkan setting untuk lokasi tampilan
register_setting(
'wordcountplugin', // 1. Group name (harus sama di settings_fields)
'wcp_location', // 2. Option name (nama di database)
array(
'sanitize_callback' => array($this, 'sanitizeLocation'),
'default' => '0'
)
);
// Mendaftarkan setting untuk headline
register_setting(
'wordcountplugin',
'wcp_headline',
array(
'sanitize_callback' => 'sanitize_text_field',
'default' => 'Post Statistics'
)
);
// Setting untuk word count (checkbox)
register_setting('wordcountplugin', 'wcp_wordcount', array('sanitize_callback' => 'sanitize_text_field', 'default' => '1'));
// Setting untuk character count (checkbox)
register_setting('wordcountplugin', 'wcp_charcount', array('sanitize_callback' => 'sanitize_text_field', 'default' => '1'));
// Setting untuk read time (checkbox)
register_setting('wordcountplugin', 'wcp_readtime', array('sanitize_callback' => 'sanitize_text_field', 'default' => '1'));2. add_settings_section() — Membuat section grup
php
add_settings_section(
'wcp_first_section', // 1. Section name/ID
null, // 2. Title (null = tanpa judul)
null, // 3. Content callback (null = tanpa keterangan)
'word-count-settings-page' // 4. Page slug (harus sama dengan add_options_page)
);3. add_settings_field() — Menambahkan field ke section
php
// Dropdown field
add_settings_field(
'wcp_location', // 1. Option name
'Display Location', // 2. Label text
array($this, 'locationHTML'), // 3. HTML callback
'word-count-settings-page', // 4. Page slug
'wcp_first_section' // 5. Section name
);
// Text input field
add_settings_field('wcp_headline', 'Headline Text', array($this, 'headlineHTML'), 'word-count-settings-page', 'wcp_first_section');
// Checkbox fields
add_settings_field('wcp_wordcount', 'Word Count', array($this, 'checkboxHTML'), 'word-count-settings-page', 'wcp_first_section', array('theName' => 'wcp_wordcount'));
add_settings_field('wcp_charcount', 'Character Count', array($this, 'checkboxHTML'), 'word-count-settings-page', 'wcp_first_section', array('theName' => 'wcp_charcount'));
add_settings_field('wcp_readtime', 'Read Time', array($this, 'checkboxHTML'), 'word-count-settings-page', 'wcp_first_section', array('theName' => 'wcp_readtime'));
}Argumen ke-6 pada
add_settings_field()— array yang dikirim ke callback function. Ini memungkinkan kita menggunakan satu function untuk beberapa checkbox.
Bagian 3: HTML Callbacks untuk Setiap Field
Dropdown dengan selected()
php
function locationHTML() { ?>
<select name="wcp_location">
<option value="0" <?php selected(get_option('wcp_location'), '0') ?>>Beginning of post</option>
<option value="1" <?php selected(get_option('wcp_location'), '1') ?>>End of post</option>
</select>
<?php }
selected()— Helper WordPress yang otomatis menambahkanselected="selected"pada option yang cocok.
Text Input
php
function headlineHTML() { ?>
<input type="text" name="wcp_headline" value="<?php echo esc_attr(get_option('wcp_headline')) ?>">
<?php }Checkbox Reusable
php
function checkboxHTML($args) { ?>
<input type="checkbox" name="<?php echo $args['theName'] ?>" value="1" <?php checked(get_option($args['theName']), '1') ?>>
<?php }
checked()— Helper WordPress yang otomatis menambahkanchecked="checked"jika value cocok.
Bagian 4: Custom Validation / Sanitize Callback
php
function sanitizeLocation($input) {
if ($input != '0' AND $input != '1') {
add_settings_error('wcp_location', 'wcp_location_error', 'Display location must be either beginning or end.');
return get_option('wcp_location'); // Kembalikan nilai lama
}
return $input; // Nilai valid, simpan
}Penjelasan:
add_settings_error()— Menampilkan pesan error di halaman settings- Arg 1: Nama setting
- Arg 2: Error code
- Arg 3: Pesan error
- Jika validasi gagal, kembalikan nilai lama dengan
get_option() - Jika valid, kembalikan
$inputuntuk disimpan
Fungsi-Fungsi WordPress Penting
| Fungsi | Kegunaan |
|---|---|
register_setting() | Mendaftarkan option di database |
add_settings_section() | Membuat grup section |
add_settings_field() | Menambahkan field ke section |
settings_fields() | Output hidden fields (nonce, action) |
do_settings_sections() | Render semua sections & fields |
submit_button() | Output tombol submit standar WordPress |
get_option() | Ambil nilai dari database (auto-loaded, tanpa performa hit) |
selected() | Helper untuk <select> dropdown |
checked() | Helper untuk checkbox |
esc_attr() | Sanitasi output untuk atribut HTML |
add_settings_error() | Tampilkan pesan error |