Saya perkenalkan ini dengan mengatakan bahwa saya hampir tidak pernah bekerja dengan WordPress - pada kenyataannya, terakhir kali saya melakukan situs di WordPress adalah kembali selama 2.2. Kemarin saya membuat segalanya berantakan dan mengajukan beberapa pertanyaan di sini mencoba untuk membuat plugin menu dasar berfungsi.
Saya sekarang memiliki plugin berfungsi penuh dan berperilaku tepat seperti yang saya harapkan, jadi saya memutuskan untuk membuat perubahan kecil di sana-sini untuk menambah fungsionalitas dan kompatibilitas - termasuk menggunakan Pengaturan API. Namun sesaat yang sangat singkat dalam membaca tutorial tentang API ini dan saya menjadi sangat bingung, maka kebingungan ini semakin dalam ketika saya membaca dan mencoba mengimplementasikan contoh-contoh - yang menjadi lebih sulit oleh fakta bahwa plugin saya diimplementasikan sebagai sebuah kelas .
Kecuali jika saya melakukan sesuatu yang salah, dari apa yang saya pahami menggunakan Pengaturan API membutuhkan pembuatan fungsi baru PER SETTING. Ini berarti 3-5 fungsi untuk plugin rata-rata, dan hingga ratusan untuk plugin yang lebih maju. Tampaknya konyol untuk menulis banyak fungsi ini (dan mengembangkan sistem penamaan agar tidak membingungkan mereka) ketika Anda bisa dengan mudah mengimpor semua $_POST
variabel yang berlaku ke dalam array dan melepaskan seluruh kekacauan.
Mungkin saya kuno, tetapi kecuali ada sesuatu yang bisa saya peroleh, saya tidak melihat alasan untuk melipatgandakan atau melipatgandakan berapa banyak kode yang saya tulis. Inilah cara saya mengelola opsi sebelum mencoba menambahkan API Pengaturan:
function __construct() {
/* constructor stuff */
$this->options = $this->db_options = get_option( 'de-menu-options' );
if( $this->options === false ){
$this->options = $this->defaults;
}
if (is_admin()) {
add_action('admin_menu', array(&$this, 'admin_menu'));
}
/* more stuff */
// When WordPress shuts down we store changes to options
add_action('shutdown', array(&$this, 'update'));
}
public function admin_menu() {
add_options_page('DE Menu Options', 'DE Menu', 'manage_options', 'de-menu-options', array(&$this, 'options'));
add_option('de-menu-options', $this->options);
}
public function options() {
if (!current_user_can('manage_options')) {
wp_die( __('You do not have sufficient permissions to access this page.') );
}
if ( !empty($_POST) && check_admin_referer('de-menu-options') ) {
// These options are saved to the database at shutdown
$this->options = array(
"columns" => $_POST["de-menu-columns"],
"maintenance" => $_POST["de-menu-maintenance"]
);
echo 'DE Menu options saved';
}
?>
<div class="wrap">
<h2>DE Menu Plugin</h2>
<form method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
<?php settings_fields('de-menu-options'); ?>
<input type="checkbox" name="de-menu-maintenance" />
<label for="de-menu-columns">Columns:</label>
<input type="text" name="de-menu-columns" value="<?php echo $this->options['columns']; ?>" />
<p class="submit">
<input type="submit" name="de-menu-submit" value="Update Options »" />
</p>
</form>
</div>
<?php
}
function update() {
// By storing all changes at the end we avoid multiple database calls
$diff = array_diff( $this->options, $this->db_options );
if( !empty( $diff ) ){
update_option('de-menu-options', $this->options);
}
}
Sekarang dengan pengaturan API saya memiliki sesuatu yang lebih seperti berikut ini:
function __construct() {
/* constructor stuff */
// Do I load options? Will they be loaded for me? Who knows?
if (is_admin()) {
add_action('admin_menu', array(&$this, 'admin_menu'));
add_action('admin_init', array(&$this, 'admin_init'));
}
/* more stuff */
// Settings API should update options for me... I think
}
public function admin_menu() {
add_options_page('DE Menu Options', 'DE Menu', 'manage_options', 'de-menu-options', array(&$this, 'options'));
add_option('de-menu-options', $this->options);
}
public function admin_init() {
register_setting('de-menu-options','de-menu-options',array(&$this,'validate'));
add_settings_section('de-menu-main-options', 'Main Settings', 'options_section', 'de-menu-options');
add_settings_field('de-menu-maintenance', 'Maintenance Mode', array(&$this,'options_maintenance'), 'de-menu-options', 'de-menu-main-options');
add_settings_field('de-menu-columns', 'Columns', array(&$this,'options_columns'), 'de-menu-options', 'de-menu-main-options');
}
public function options() {
if (!current_user_can('manage_options')) {
wp_die( __('You do not have sufficient permissions to access this page.') );
}
if ( !empty($_POST) && check_admin_referer('de-menu-options') ) {
// These options are saved to the database at shutdown
$this->options = array(
"columns" => $_POST["de-menu-columns"],
"maintenance" => $_POST["de-menu-maintenance"]
);
echo 'DE Menu options saved';
}
?>
<div class="wrap">
<h2>DE Menu Plugin</h2>
<form method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
<?php settings_fields('de-menu-options'); ?>
<?php do_settings_sections('de-menu-options'); ?>
<p class="submit">
<input type="submit" name="de-menu-submit" value="Update Options »" />
</p>
</form>
</div>
<?php
}
public function options_section() {
echo '<p>' . __('Main description of this section here.','de-menu-lang') . '</p>';
}
public function options_maintenance() {
echo "<input id='de-menu-maintenance' name='options[maintenance]' type='checkbox' />";
}
public function options_columns() {
echo "<input id='de-menu-columns' name='options[columns]' type='checkbox' value=".$this->options['columns']."/>";
}
function validate($options) {
return $options; // I guess?
}
Mungkin sangat jelas dari scrollbar bahwa kode sudah lebih lama hanya dengan dua opsi. Sangat bijaksana dari komentar bahwa saya tidak sepenuhnya mengerti apa yang saya lakukan. Lalu ada masalah memiliki 5 fungsi baru (dan menghapus hanya 1) untuk mencapai semua ini.
Jadi, apa keuntungan yang saya dapatkan dari semua pekerjaan ekstra ini?
add_settings_section
dan add_settings_field
, kedua fungsi menambahkan mengasapi kode Anda lebih dari apa pun, hindari itu dan Anda menghindari mengasapi ..