WordPress ile neredeyse hiç çalışmadığımı söyleyerek önceden haber vereyim - aslında, WordPress'te son kez bir site yaptığımda 2.2 sırasında geri döndüm. Dün her şeyden bir karışıklık yaptım ve burada temel bir menü eklentisi çalışmaya çalışırken birkaç soru sordum.
Şimdi eklentiyi tamamen işlevsel ve beklediğim gibi davranıyorum, bu yüzden burada ve orada işlevsellik ve uyumluluk eklemeye karar verdim - Ayarlar API'sını kullanmak da dahil. Ancak bu API ile ilgili dersleri okumak için çok kısa bir süre ve oldukça karışık hale geldim, o zaman bu karışıklık sadece okuduğumda derinleşti ve örnekleri uygulamaya çalıştım - bu da eklentimin bir sınıf olarak uygulanmasıyla daha da zorlaştı .
Yanlış bir şey yapmadıkça, Ayarlar API'sini kullanmayı anladığım kadarıyla SETTING başına yeni bir işlev oluşturulmasını gerektirir. Bu, ortalama eklenti için 3-5 işlev ve daha gelişmiş eklentiler için yüzlerce işlev anlamına gelir. Uygulanabilir tüm $_POST
değişkenleri bir diziye kolayca aktarabildiğinizde ve tüm karmaşadan vazgeçebildiğinizde, bu birçok işlevi yazmak (ve kafa karıştırmaktan kaçınmak için bir adlandırma sistemi geliştirmek) gülünç görünüyor .
Belki de eski modayım, ama kazanacak bir şey olmadıkça, ne kadar kod yazdığımı üçe katlamak ya da dört katlamak için bir neden görmüyorum. Ayarlar API'sını eklemeye çalışmadan önce seçenekleri şu şekilde yönettim:
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);
}
}
Şimdi ayarlar API'si ile aşağıdakine benzer bir şeyim var:
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?
}
Kaydırma çubuklarından, kodun zaten iki seçenekle daha uzun olduğu muhtemelen acı verici bir şekilde açıktır. Ne yaptığımı tam olarak anlamadığım yorumlardan anlaşılıyor. Sonra, tüm bunları gerçekleştirmek için 5 yeni fonksiyona sahip olmak (ve sadece 1'i kaldırmak) var.
Peki tüm bu ekstra işlerden ne gibi bir avantaj elde ediyorum?
add_settings_section
ve add_settings_field
bu iki fonksiyonun kodunuza her şeyden daha fazla bloat eklediğini, bunlardan kaçındığını ve şişmeyi önlediğinizi unutmayın.