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?
sumber
add_settings_section
danadd_settings_field
, kedua fungsi menambahkan mengasapi kode Anda lebih dari apa pun, hindari itu dan Anda menghindari mengasapi ..Jawaban:
Pandangan saya adalah bahwa tujuan utama dan manfaat Pengaturan API adalah struktur .
Ini membantu untuk menjaga pengaturan pengaturan yang kompleks:
Seperti halnya overhead struktural seperti itu, manfaat kasus penggunaan lebih kompleks dan manfaat yang kurang sederhana.
Jadi Anda dapat mengimplementasikan apa pun yang dilakukan Pengaturan API tanpa menggunakannya. Pertanyaannya adalah apakah Anda dapat melakukannya dengan cara yang dapat diandalkan, aman, dan dapat diperluas.
sumber
Jika Anda menggunakan panggilan balik dengan benar, tidak perlu untuk semua kode yang berlebihan. Inilah cara saya menerapkan API Pengaturan, dengan cara yang sepenuhnya dapat diskalakan .
Keuntungan (antara lain):
sumber
oenology_get_settings_by_tab()
danoenology_get_default_options
tanpa terlebih dahulu mendefinisikannya? Saya pikir itu cukup buruk pada 209 baris kode (setelah menghapus komentar dan baris kosong), tetapi begitu fungsi-fungsi itu didefinisikan akan lebih lama lagi ... Untuk empat opsi?oenology_get_settings_by_tab()
benar-benar relevan dengan apa yang Anda lakukan. Tetapi Anda harus mendefinisikan markup formulir-bidang Anda di suatu tempat , sama seperti Anda harus memvalidasi / membersihkan input pengguna entah bagaimana , jadi jika Anda melakukannya dengan benar, Anda akan memiliki semua kode yang sama juga.Terima kasih telah memposting ini, saya ingin tahu hal yang persis sama. Banyak sekali fungsi.
Untuk menguranginya, Anda dapat menyimpan opsi sebagai array. Wordpress membuat serial data untuk Anda. Ini menghemat kode (atau fungsi tetap), tetapi membuat data lebih buruk. Misalnya, jika Anda ingin mengurutkan, mengedit tangan, mengekspor, dll, tabel Anda, mereka akan memiliki nilai-nilai serial ini. Di sisi lain, plugin Anda menambahkan lebih sedikit entri ke tabel opsi dan lebih mudah dibersihkan.
Jadi, inilah kode Anda yang dilakukan ulang. Beberapa catatan:
<label>
untuk aksesibilitas. Menggunakan add_settings_error (), settings_error (), yang menangani pesan dan juga kesalahan. Itu sering menjadi satu-satunya alasan untuk memiliki fungsi validasi yang terpisah untuk setiap opsi. Anda dapat melihat di bawah ini validate_w () dan validate_h () bisa menjadi satu fungsi. Saya melihat mencoba abstrak keluar pesan, tetapi Anda tidak mendapatkan info yang cukup dalam panggilan balik validasi seingat saya. Seperti bidang apa yang sedang Anda kerjakan.Kode:
sumber