मुझे यह कहते हुए प्रस्तावना दें कि मैं शायद ही कभी वर्डप्रेस के साथ काम करता हूं - वास्तव में, आखिरी बार जब मैंने वर्डप्रेस में एक साइट की थी तो 2.2 के दौरान वापस आ गया था। कल मैंने सब कुछ काफी गड़बड़ कर दिया और यहां कई सवाल पूछे जिससे एक मूल मेनू प्लगइन काम कर रहा था।
मेरे पास अब प्लगइन पूरी तरह कार्यात्मक है और जैसा कि मैं उम्मीद करता हूं, ठीक उसी तरह का व्यवहार करना है, इसलिए मैंने सेटिंग्स एपीआई का उपयोग करते हुए कार्यक्षमता और संगतता को जोड़ने के लिए यहां और वहां मामूली बदलाव करने का फैसला किया। हालाँकि इस एपीआई पर ट्यूटोरियल पढ़ने में एक बहुत ही कम समय और मैं काफी उलझन में हो गया, फिर यह भ्रम केवल इतना गहरा हो गया कि मैंने पढ़ा और उदाहरणों को लागू करने की कोशिश की - जिसे इस तथ्य से और भी कठिन बना दिया गया कि मेरे प्लगइन को एक वर्ग के रूप में लागू किया गया है ।
जब तक मैं कुछ गलत नहीं कर रहा हूँ, जो मैं सेटिंग्स एपीआई का उपयोग करने के लिए समझता हूं से एक नया फ़ंक्शन प्रति सेटिंग बनाने की आवश्यकता है। इसका मतलब है औसत प्लगइन के लिए 3-5 कार्य, और अधिक उन्नत प्लगइन्स के लिए सैकड़ों तक। यह बहुत सारे कार्यों को लिखने के लिए (और उन्हें भ्रमित करने से बचाने के लिए एक नामकरण प्रणाली विकसित करना) जब आप आसानी से सभी लागू $_POST
चर को एक सरणी में आयात कर सकते हैं और पूरी गड़बड़ी से गुजर सकते हैं, तो यह अजीब लगता है ।
शायद मैं पुराने जमाने का हूं, लेकिन जब तक इससे कुछ हासिल नहीं होता तब तक मैं ट्रिपल या चौगुनी करने की वजह नहीं देखता कि मैं कितना कोड लिख रहा हूं। सेटिंग्स API जोड़ने का प्रयास करने से पहले मैंने यहां कैसे विकल्प प्रबंधित किए हैं:
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);
}
}
अब सेटिंग्स API के साथ मेरे पास कुछ और चीजें हैं जैसे कि निम्नलिखित:
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?
}
यह शायद स्क्रॉलबार से स्पष्ट रूप से स्पष्ट है कि कोड पहले से ही सिर्फ दो विकल्पों के साथ लंबा है। यह टिप्पणी की तरह स्पष्ट है कि मैं पूरी तरह से समझ नहीं पा रहा हूं कि मैं क्या कर रहा हूं। फिर इस सब को पूरा करने के लिए 5 नए कार्यों (और केवल 1 को हटाने) की बात है।
तो बस इस अतिरिक्त काम से मुझे क्या फायदा हो रहा है?
add_settings_section
और add_settings_field
, वे दो कार्य आपके कोड में कुछ भी से अधिक ब्लोट जोड़ते हैं, उन से बचें और आप ब्लोट से बचें।