सरणियों उदाहरण के साथ सेटिंग्स एपीआई


32

मैं एक नए संदर्भ के साथ आरंभ करने के लिए प्राथमिक संदर्भ के रूप में Wrox वर्डप्रेस प्लगइन विकास पुस्तक का उपयोग कर रहा हूं और मैं समझता हूं कि सभी सेटिंग्स को 1 सरणी के रूप में सहेजा जा सकता है, लेकिन पुस्तक इस और सभी सामानों का एक उदाहरण नहीं देती है। वेब पर खोजना एक उदाहरण से दूसरे उदाहरण में इतना अलग लगता है। Konstantin द्वारा एक पोस्ट की दूसरी छमाही मुझे करीब हो जाती है, लेकिन मैं वास्तव में कई क्षेत्रों के साथ एक और अधिक पूर्ण उदाहरण देखना चाहता हूं।

जवाबों:


32

संक्षिप्त उत्तर: आपके nameविशेषता मान स्कीमा का उपयोग करना चाहिए option_name[array_key]। तो, जब आप…

<input name="option_name[key1]">
<input name="option_name[key2]">

... आपको अपने सत्यापन फ़ंक्शन में विकल्प मान के रूप में एक सरणी मिलती है:

array (
    'key1' => 'some value',
    'key2' => 'some other value'
)

PHP आपके लिए ऐसा करता है, यह एक WordPress सुविधा नहीं है। :)

सेटिंग्स एपीआई के साथ उस काम को कैसे करें?

मान लीजिए, हम यह विकल्प पृष्ठ चाहते हैं, और सभी मानों को एक विकल्प में संग्रहीत किया जाना चाहिए और एक फ़ंक्शन में मान्य होना चाहिए।

यहाँ छवि विवरण दर्ज करें

विकल्प पृष्ठ

हमें हुक admin_menuऔर दो कार्यों की आवश्यकता है: पृष्ठ को पंजीकृत करने के लिए, आउटपुट प्रस्तुत करने के लिए एक।

add_action( 'admin_menu', 't5_sae_add_options_page' );

function t5_sae_add_options_page()
{
    add_options_page(
        'T5 Settings API Example', // $page_title,
        'T5 SAE',                  // $menu_title,
        'manage_options',          // $capability,
        't5_sae_slug',             // $menu_slug
        't5_sae_render_page'       // Callback
    );
}

function t5_sae_render_page()
{
    ?>
    <div class="wrap">
        <h2><?php print $GLOBALS['title']; ?></h2>
        <form action="options.php" method="POST">
            <?php 
            settings_fields( 'plugin:t5_sae_option_group' );
            do_settings_sections( 't5_sae_slug' ); 
            submit_button(); 
            ?>
        </form>
    </div>
    <?php
}

फॉर्म actionहोना चाहिए options.php, या सत्यापन नहीं कहा जाएगा। PHP के स्रोत को देखें wp-admin/options-permalink.php- एक छिपा हुआ जाल है do_settings_sections('permalink');- लेकिन यह काम नहीं कर सकता क्योंकि फॉर्म actionगलत है।

अब, हमारे कस्टम पेज पर वापस जाएँ। हम इसे वर्डप्रेस से बेहतर बनाते हैं।

रजिस्टर सेटिंग्स, वर्गों और क्षेत्रों

admin_init जब हमें इसकी आवश्यकता होती है तब हम हुक करते हैं और पंजीकरण फ़ंक्शन को कॉल करते हैं।

if ( ! empty ( $GLOBALS['pagenow'] )
    and ( 'options-general.php' === $GLOBALS['pagenow']
        or 'options.php' === $GLOBALS['pagenow']
    )
)
{
    add_action( 'admin_init', 't5_sae_register_settings' );
}

यहाँ महत्वपूर्ण हिस्सा है: $GLOBALS['pagenow']या तो होना चाहिए options-general.php(आउटपुट के लिए) या options.php(सत्यापन के लिए)। प्रत्येक अनुरोध पर निम्नलिखित सभी कोड को कॉल न करें। अधिकांश ट्यूटोरियल और लगभग सभी प्लगइन्स को यह गलत लगता है।

ठीक है, चलो पागलों की तरह पंजीकरण करें:

  1. हम अपने पृष्ठ के लिए विकल्प मान प्राप्त करते हैं और कुछ चूक के खिलाफ उन्हें पार्स करते हैं। सुंदर बुनियादी।

  2. हम नाम के साथ एक सेटिंग समूह पंजीकृत करते हैं plugin:t5_sae_option_group। मुझे उपसर्ग नाम पसंद हैं, वे इस तरह को समझना और समझना आसान हैं।

  3. फिर हम दो खंडों को पंजीकृत करते हैं, 1 और 2।

  4. और हम तीन खंडों को जोड़ते हैं, पहले खंड के लिए दो, दूसरे के लिए एक। हम प्रत्येक क्षेत्र के लिए कॉलबैक फ़ंक्शंस के लिए विकल्प का नाम और बचा हुआ मान पास करते हैं। आउटपुट हैंडलर को डेटा नहीं बदलना चाहिए, बस कुछ HTML जोड़ें।

function t5_sae_register_settings()
{
    $option_name   = 'plugin:t5_sae_option_name';

    // Fetch existing options.
    $option_values = get_option( $option_name );

    $default_values = array (
        'number' => 500,
        'color'  => 'blue',
        'long'   => ''
    );

    // Parse option values into predefined keys, throw the rest away.
    $data = shortcode_atts( $default_values, $option_values );

    register_setting(
        'plugin:t5_sae_option_group', // group, used for settings_fields()
        $option_name,  // option name, used as key in database
        't5_sae_validate_option'      // validation callback
    );

    /* No argument has any relation to the prvious register_setting(). */
    add_settings_section(
        'section_1', // ID
        'Some text fields', // Title
        't5_sae_render_section_1', // print output
        't5_sae_slug' // menu slug, see t5_sae_add_options_page()
    );

    add_settings_field(
        'section_1_field_1',
        'A Number',
        't5_sae_render_section_1_field_1',
        't5_sae_slug',  // menu slug, see t5_sae_add_options_page()
        'section_1',
        array (
            'label_for'   => 'label1', // makes the field name clickable,
            'name'        => 'number', // value for 'name' attribute
            'value'       => esc_attr( $data['number'] ),
            'option_name' => $option_name
        )
    );
    add_settings_field(
        'section_1_field_2',
        'Select',
        't5_sae_render_section_1_field_2',
        't5_sae_slug',  // menu slug, see t5_sae_add_options_page()
        'section_1',
        array (
            'label_for'   => 'label2', // makes the field name clickable,
            'name'        => 'color', // value for 'name' attribute
            'value'       => esc_attr( $data['color'] ),
            'options'     => array (
                'blue'  => 'Blue',
                'red'   => 'Red',
                'black' => 'Black'
            ),
            'option_name' => $option_name
        )
    );

    add_settings_section(
        'section_2', // ID
        'Textarea', // Title
        't5_sae_render_section_2', // print output
        't5_sae_slug' // menu slug, see t5_sae_add_options_page()
    );

    add_settings_field(
        'section_2_field_1',
        'Notes',
        't5_sae_render_section_2_field_1',
        't5_sae_slug',  // menu slug, see t5_sae_add_options_page()
        'section_2',
        array (
            'label_for'   => 'label3', // makes the field name clickable,
            'name'        => 'long', // value for 'name' attribute
            'value'       => esc_textarea( $data['long'] ),
            'option_name' => $option_name
        )
    );
}

जब हम do_settings_sections( 't5_sae_slug' );अपने पृष्ठ में कॉल करेंगे तो उन सभी खंडों और क्षेत्रों के लिए कॉलबैक हैंडलर स्वचालित रूप से कहलाएंगे । हमने पहले ही ऐसा कर लिया था, इसलिए हमें बस…

खेतों को प्रिंट करें

ध्यान दें कि nameविशेषताओं का निर्माण कैसे किया जाता है: पारित option_nameपहला भाग है, वर्ग कोष्ठक में सरणी कुंजी निम्न प्रकार है []

function t5_sae_render_section_1()
{
    print '<p>Pick a number between 1 and 1000, and choose a color.</p>';
}
function t5_sae_render_section_1_field_1( $args )
{
    /* Creates this markup:
    /* <input name="plugin:t5_sae_option_name[number]"
     */
    printf(
        '<input name="%1$s[%2$s]" id="%3$s" value="%4$s" class="regular-text">',
        $args['option_name'],
        $args['name'],
        $args['label_for'],
        $args['value']
    );
    // t5_sae_debug_var( func_get_args(), __FUNCTION__ );
}
function t5_sae_render_section_1_field_2( $args )
{
    printf(
        '<select name="%1$s[%2$s]" id="%3$s">',
        $args['option_name'],
        $args['name'],
        $args['label_for']
    );

    foreach ( $args['options'] as $val => $title )
        printf(
            '<option value="%1$s" %2$s>%3$s</option>',
            $val,
            selected( $val, $args['value'], FALSE ),
            $title
        );

    print '</select>';

    // t5_sae_debug_var( func_get_args(), __FUNCTION__ );
}
function t5_sae_render_section_2()
{
    print '<p>Makes some notes.</p>';
}

function t5_sae_render_section_2_field_1( $args )
{
    printf(
        '<textarea name="%1$s[%2$s]" id="%3$s" rows="10" cols="30" class="code">%4$s</textarea>',
        $args['option_name'],
        $args['name'],
        $args['label_for'],
        $args['value']
    );
}

ओह, मैंने एक समारोह पेश किया t5_sae_debug_var()। यह रहा:

function t5_sae_debug_var( $var, $before = '' )
{
    $export = esc_html( var_export( $var, TRUE ) );
    print "<pre>$before = $export</pre>";
}

यह देखने के लिए उपयोगी है कि क्या हमें वह मिला है जिसकी हमें उम्मीद थी।

अब, यह बहुत अच्छी तरह से काम करता है, हमें बस एक चीज की आवश्यकता है:

विकल्प सरणी को मान्य करें

क्योंकि हमने ब्रैकेट नोटेशन का उपयोग किया है, इसलिए हमारा मान एक सरणी है। हमें बस प्रत्येक तत्व के माध्यम से चलना है और इसे मान्य करना है।

function t5_sae_validate_option( $values )
{
    $default_values = array (
        'number' => 500,
        'color'  => 'blue',
        'long'   => ''
    );

    if ( ! is_array( $values ) ) // some bogus data
        return $default_values;

    $out = array ();

    foreach ( $default_values as $key => $value )
    {
        if ( empty ( $values[ $key ] ) )
        {
            $out[ $key ] = $value;
        }
        else
        {
            if ( 'number' === $key )
            {
                if ( 0 > $values[ $key ] )
                    add_settings_error(
                        'plugin:t5_sae_option_group',
                        'number-too-low',
                        'Number must be between 1 and 1000.'
                    );
                elseif ( 1000 < $values[ $key ] )
                    add_settings_error(
                        'plugin:t5_sae_option_group',
                        'number-too-high',
                        'Number must be between 1 and 1000.'
                    );
                else
                    $out[ $key ] = $values[ $key ];
            }
            elseif ( 'long' === $key )
            {
                $out[ $key ] = trim( $values[ $key ] );
            }
            else
            {
                $out[ $key ] = $values[ $key ];
            }
        }
    }

    return $out;
}

यह बल्कि बदसूरत है; मैं उत्पादन में ऐसे कोड का उपयोग नहीं करूंगा। लेकिन यह वह करता है जो इसे करना चाहिए: यह मान्य मानों को लौटाता है। वर्डप्रेस सरणी को क्रमबद्ध करेगा, डेटाबेस में हमारे विकल्प के नाम के तहत संग्रहीत करेगा और जब हम कॉल करते हैं, तो इसे अनधिकृत रूप से वापस कर देंगे get_option()


यह सब काम करता है, लेकिन यह अनावश्यक जटिल है, हम 1998 ( <tr valign="top">), और कई अतिरेक से मार्कअप प्राप्त करते हैं ।

जब आपको एपीआई सेटिंग्स का उपयोग करना हो। admin_url( 'admin-post.php' )प्रपत्र कार्रवाई (इसके स्रोत को देखें) के रूप में एक वैकल्पिक उपयोग के रूप में और अपने स्वयं के साथ पूर्ण सेटिंग्स पृष्ठ बनाएं, शायद अधिक सुरुचिपूर्ण कोड।

दरअसल, आपको यह करना होगा कि जब आप नेटवर्क प्लगइन लिखते हैं, क्योंकि सेटिंग्स एपीआई वहां काम नहीं करता है।

कुछ किनारे मामले और अधूरे भाग भी हैं जिनका मैंने यहां उल्लेख नहीं किया है - जब आपको उनकी आवश्यकता होगी तो आप उन्हें ढूंढ लेंगे। :)


वाह धन्यवाद। यह बहुत मददगार है। अन्य किसी भी पोस्ट को मैंने नेटवर्क प्लगइन्स के बारे में कुछ भी नहीं पढ़ा, जो एक महत्वपूर्ण नोट है जिसे मैं भविष्य के लिए ध्यान में रखूंगा।
ब्योर्न

बस इसके लिए एक परिशिष्ट। यदि आप चेकबॉक्स प्रदर्शित करने / स्टोर करने का प्रयास कर रहे हैं तो मैंने कॉलबैक कोड को बदल दिया है: '<इनपुट प्रकार = "चेकबॉक्स" आईडी = "% 3 $ s" नाम = "% 1 $ s [% 2 $ s] मूल्य =" '। जाँच% 4 $ s "(' ऑन ', $ args [' मूल्य '], गलत)।' /> '
joesk

उत्तर की समीक्षा करते हुए मैं प्लगइन के उपयोग से हैरान हूं : t5_sae_option_group जिसमें एक एकल कॉलोन शामिल है। मैंने थकावट से देखा और इस वाक्य-विन्यास का स्पष्टीकरण नहीं पाया। क्या आप PHP के प्रलेखन में इसके स्पष्टीकरण की ओर संकेत कर सकते हैं? धन्यवाद

@ user50909: वे साधारण स्ट्रिंग आइडेंटिफ़ायर जैसे दिखते हैं। PHP सिंटैक्स एक कारक नहीं होना चाहिए।
s_ha_dum

1
@ दान का प्रयास करें basename( $_SERVER['REQUEST_URI'] )
FUXIA
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.