सेटिंग्स एपीआई के क्या फायदे हैं?


13

मुझे यह कहते हुए प्रस्तावना दें कि मैं शायद ही कभी वर्डप्रेस के साथ काम करता हूं - वास्तव में, आखिरी बार जब मैंने वर्डप्रेस में एक साइट की थी तो 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 को हटाने) की बात है।

तो बस इस अतिरिक्त काम से मुझे क्या फायदा हो रहा है?


ऐसे मामलों के लिए उनका उपयोग न करें। मुझे लगता है कि वे PHP शुरुआती के लिए अभिप्रेत हैं, जिन्हें अपने प्लगइन / थीम के अंदर 3-4 विकल्पों की आवश्यकता होती है। यह "सुविधाओं" में से एक है जिसे कभी लागू नहीं किया जाना चाहिए ... यह मूल रूप से एक और एपीआई के लिए एक एपीआई है :)
onetrickpony

3
मैं जो कुछ भी लिखता हूं उसके लिए मैं सेटिंग्स एपीआई का उपयोग करता हूं, यह सब निर्भर करता है कि आप इसका उपयोग कैसे करते हैं, ध्यान दें कि आप बिना उपयोग किए भी एपीआई का उपयोग कर सकते हैं add_settings_sectionऔर add_settings_field, वे दो कार्य आपके कोड में कुछ भी से अधिक ब्लोट जोड़ते हैं, उन से बचें और आप ब्लोट से बचें।
t31os

1
मैं t3los के रूप में एक ही काम करता हूं: खुद को सेटिंग रजिस्टर करें, फिर मैं अपने सेटिंग्स पेज पर HTML में फॉर्मों में कोड करता हूं। यदि आप ऐसा करने के लिए वास्तव में आसान तरीका देखना चाहते हैं और बाद में कोड रखना चाहते हैं, तो Yoast के वर्डप्रेस एसईओ प्लगइन को देखें।
16::१gu पर क्रिसगुइटगर्गी

जवाबों:


8

मेरा दृष्टिकोण यह है कि सेटिंग्स एपीआई का मुख्य उद्देश्य और लाभ संरचना है

यह जटिल सेटिंग्स सेटअप रखने में मदद करता है:

  • अर्दली (पंजीकरण और वर्गों का तर्क);
  • सुरक्षित (गैर, सत्यापन कॉलबैक);
  • एक्स्टेंसिबल (दूसरे पेज में हुकिंग या हुक करने की अनुमति)।

इस तरह के किसी भी संरचनात्मक ओवरहेड के साथ यह अधिक जटिल उपयोग के मामलों में लाभ देता है और कम सरल लोगों को लाभ देता है।

तो आप कुछ भी कर सकते हैं सेटिंग्स एपीआई का उपयोग किए बिना करता है। सवाल यह है कि क्या आप इसे विश्वसनीय, सुरक्षित और एक्स्टेंसिबल तरीके से पूरा कर सकते हैं।


अंत में मुझे इस ट्यूटोरियल की मदद से अपना सेटिंग पेज काम करने लगा : alisothegeek.com/2011/01/wordpress-settings-api-tutorial-1 और स्विच स्टेटमेंट और हेल्पर फंक्शन्स की मदद से मुझे कहना होगा कि चीजें अब और व्यवस्थित हैं मेरे कोड में (जो मेरी दो परीक्षण सेटिंग्स से 15-20 कुल सेटिंग्स में जाने की योजना के बाद से अच्छा है)।
स्टेवेंडेसु

1
@steven_desu हां, रनिंग मजाक यह है कि सेटिंग्स एपीआई का उपयोग करने वाला हर कोई इसके लिए एक रूपरेखा लिखता है। :) युगल सहायक कार्य लगभग अपरिहार्य हैं। यह भी ध्यान दें कि सेटिंग्स एपीआई को अंतिम रूप नहीं दिया गया है और भविष्य में इसे सुधारने के लिए (अस्पष्ट) योजनाएं हैं (मुझे लगता है कि 3.3 योजनाओं के संदर्भ में इसका उल्लेख किया गया था)।
रार्स्ट

1
मुझे निश्चित रूप से उम्मीद है कि इसमें सुधार हुआ है। मैं ईमानदारी से सेटिंग्स एपीआई के लिए कोई लाभ नहीं देख रहा हूं, लेकिन अब मैं जो भी लाभ उठा रहा हूं, वह उस रूपरेखा का परिणाम है जो मैंने इसके लिए उधार लिया था। मुझे पसंद है कि सभी फ़ॉर्म तत्व अब गतिशील रूप से एक ही उपस्थिति के साथ उत्पन्न होते हैं ... लेकिन यह सेटिंग API नहीं है। मुझे पसंद है कि डिफ़ॉल्ट सेटिंग्स और रजिस्टरिंग सेटिंग्स को एक ही परिभाषा के द्वारा नियंत्रित किया जाता है ... लेकिन यह सेटिंग्स एपीआई नहीं है। मुझे पसंद है कि jQuery न केवल रूपों को सुंदर बनाता है, बल्कि उत्तरोत्तर बढ़ाया जाता है - लेकिन मुझे प्रगतिशील वृद्धि को मैन्युअल रूप से कोड करना था ...
स्टीवेन्डेसु

5

यदि आप कॉलबैक का ठीक से उपयोग करते हैं, तो सभी अनावश्यक कोड की कोई आवश्यकता नहीं है। यहां बताया गया है कि मैं सेटिंग्स एपीआई को किस तरह से लागू करता हूं, जो पूरी तरह से स्केलेबल है

लाभ (अन्य बातों के अलावा):

  • सेटिंग्स एपीआई अविश्वसनीय उपयोगकर्ता डेटा के स्वच्छता पर बल देता है।
  • सेटिंग्स एपीआई विकल्प विकल्प सरणी के रूप में पंजीकृत होने के लिए मजबूर करता है, जिसके परिणामस्वरूप प्रत्येक विकल्प के लिए डीबी प्रविष्टियों के बजाय एक एकल wp_options DB प्रविष्टि है।
  • सेटिंग्स एपीआई सेटिंग्स फॉर्म के सुरक्षा सख्त बनाने की सुविधा देता है
  • सेटिंग्स API ने कोर UI के अनुरूप UI को संगत करने की सुविधा दी है, जिसके परिणामस्वरूप UX बेहतर है

तो यह अनिवार्य रूप से सुरक्षा और सौंदर्य मानकों को मजबूर करता है जो मैं पहले से ही इसकी मदद के बिना कर रहा था? मैं आपके द्वारा लिंक किए गए ट्यूटोरियल के माध्यम से पढ़ूंगा, हालांकि। यदि यह सेटिंग्स एपीआई को मैन्युअल रूप से कोडिंग (या आसान) के रूप में आसान बनाता है, तो मैं इस उत्तर को स्वीकार
करूंगा

क्या आप जानते हैं कि आपने जिस सोर्स कोड को लागू किया है, वह फ़ंक्शंस को लागू करता है oenology_get_settings_by_tab()और oenology_get_default_optionsबिना पहले उन्हें परिभाषित किए? मुझे लगा कि कोड की 209 लाइनों (टिप्पणियों और रिक्त लाइनों को हटाने के बाद) पर यह काफी बुरा था, लेकिन एक बार उन कार्यों को परिभाषित करने के बाद यह और भी लंबा हो जाएगा ... चार विकल्पों के लिए?
स्टेवेंडेसु

वे कहीं और परिभाषित कर रहे हैं। oenology_get_settings_by_tab()वास्तव में आप क्या कर रहे हैं के लिए प्रासंगिक नहीं है। लेकिन आप है अपने फार्म क्षेत्र मार्कअप को परिभाषित करने के लिए कहीं , तुम बस के रूप में है सत्यापित करें / स्वच्छ उपयोगकर्ता इनपुट के किसी भी तरह है, इसलिए यदि आप इसे सही कर रहे हैं, आप सभी कि एक ही कोड के रूप में अच्छी तरह से करना होगा।
चिप बेनेट

0

इसे पोस्ट करने के लिए धन्यवाद, मैं ठीक यही बात सोच रहा था। बहुत सारे कार्य।

उन्हें कम करने के लिए आप अपने विकल्पों को सरण के रूप में संग्रहीत कर सकते हैं। Wordpress आपके लिए डेटा को क्रमबद्ध करता है। यह कोड (या फ़ंक्शंस पर) को बचाता है, लेकिन डेटा को बदतर बनाता है। उदाहरण के लिए, यदि आप अपनी तालिकाओं को छांटना, हाथ से संपादित करना, निर्यात करना आदि चाहते हैं, तो उनके पास ये क्रमबद्ध मूल्य होंगे। दूसरी ओर, आपका प्लगइन विकल्प तालिका में कम प्रविष्टियाँ जोड़ता है और उन्हें साफ करना आसान होता है।

तो यहाँ आपका कोड फिर से किया गया है। कुछ नोट:

  • मेरा उदाहरण सरल विकल्प (de_w, de_h) और एक सरणी विकल्प (de_width_height) दोनों प्रदर्शित करता है।
  • हमेशा उपयोगकर्ता इनपुट को साफ करें। मैंने पूर्णांक का उपयोग उदाहरण में किया क्योंकि वे साफ करना आसान है।
  • सेटिंग्स API का उपयोग करते समय आपको $ _POST, nonces, check_admin_referer (), update_option (), आदि की आवश्यकता नहीं होती है।
  • सेव अगले पेज लोड पर होता है, शटडाउन पर नहीं। तब WP आपके पेज पर रीडायरेक्ट करता है। इसलिए डिबग करने के लिए, कुछ आउटपुट प्रिंट करें और सत्यापन कार्यों में से एक में wp_die () कॉल करें।
  • प्रपत्र क्रिया हमेशा "options.php" होती है। इस तरह से सेटिंग्स एपीआई काम करता है। किसी और चीज का उपयोग न करें। यदि आप चाहें, तो आप admin_url ('options.php') का उपयोग कर सकते हैं।
  • WP आपके लिए सेव मैसेज प्रिंट करेगा।
  • यहां संवर्द्धन शामिल नहीं हैं: <label>पहुंच के लिए उपयोग करना। Add_settings_error (), settings_error () का उपयोग करना, जो संदेशों के साथ-साथ त्रुटियों को भी संभालते हैं। प्रायः प्रत्येक विकल्प के लिए अलग-अलग सत्यापन कार्य करना एकमात्र कारण है। आप नीचे देख सकते हैं validate_w () और validate_h () एक फ़ंक्शन हो सकता है। मैंने मैसेजिंग को अमूर्त करने की कोशिश में देखा, लेकिन मुझे याद करते हुए आपको वैसी कॉलबैक में पर्याप्त जानकारी नहीं मिली। जैसे आप किस क्षेत्र में काम कर रहे हैं।
  • सत्यापन कॉलबैक फ़ंक्शन को सेटिंग्स API से एक कच्चा $ _POST मूल्य मिलता है। मुझे पैरामीटर का नाम देना पसंद है, जैसे $ कच्चा। सरणी विकल्प के लिए, आपको एक सरणी मिलती है, जैसे जादू।
  • संपादित करें: $ यह इससे बेहतर और $ है।

कोड:

<?php
$foo= new de_Foo();
class de_Foo {
function __construct() {
    if (is_admin()) {
        add_action('admin_menu', array($this, 'admin_menu'));
        add_action('admin_init', array($this, 'admin_init'));
    } 
}
public function admin_menu() {
    add_options_page(
       'DE Menu Options',
       'DE Menu',
       'manage_options',
       'de-menu-options',
       array($this,'xoxptions')
    );
    // add_option('de-menu-options', $this->options);
}
public function admin_init() {
 register_setting(
      'de-menu-settings-group',
      'de_w',
      array($this, 'validate_w')
 );
 register_setting(
      'de-menu-settings-group',
      'de_h',
      array($this, 'validate_h')
 );
 register_setting(
      'de-menu-settings-group',
      'de_width_height',
      array($this, 'validate_width_height')
 );
 add_settings_section(
      'de-menu-settings-section-size',
      'Size',
      array($this, 'settings_section_size_render'),
      'de-menu-options'
 );
 add_settings_field(
      'de_w',
      'W',
      array($this, 'w_render'),
      'de-menu-options',
      'de-menu-settings-section-size'
 );
 add_settings_field(
      'de_h',
      'H',
      array($this, 'h_render'),
      'de-menu-options',
      'de-menu-settings-section-size'
 );
 add_settings_field(
      'de_width_height',
      'Width / Height',
      array($this, 'width_height_render'),
      'de-menu-options',
      'de-menu-settings-section-size'
 );
}
public function options() {
    if (!current_user_can('manage_options')) {
        wp_die( __('You do not have sufficient permissions to access this page.') );
    }
////////////////////////////
// no no no
////////////////////////////
//         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 admin_url('options.php'); ?>">
    <?php settings_fields('de-menu-settings-group'); ?>
    <?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 settings_section_size_render() {
    echo '<p>' . __('Main description of this section here.','de-menu-lang') . '</p>';
}
public function w_render() {
 $w= esc_attr( get_option('de_w') );
 echo "<p><input name='de_w' value='$w'></p>\n";
}
public function h_render() {
 $h= esc_attr( get_option('de_h') );
 echo "<p><input name='de_h' value='$h'></p>\n";
}
public function width_height_render() {
 $width_height= get_option('de_width_height', array());
 $width= esc_attr( @$width_height['width'] );
 $height= esc_attr( @$width_height['height'] );
 echo "<p>Width: <input name='de_width_height[width]' value='$width'></p>\n";
 echo "<p>Height: <input name='de_width_height[height]' value='$height'></p>\n";
}
function validate_w($raw) {
 return (int)$raw;
}
function validate_h($raw) {
 return (int)$raw;
}
function validate_width_height($raw) {
 is_array($raw) or $raw= array();
 $result= array();
 $result['width']= (int)@$raw['width'];
 $result['height']= (int)@$raw['height'];
 return $result;
}
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.