Add_settings_section () कॉलबैक में चर कैसे पास करें?


16

मैं जितना संभव हो उतना स्वचालित करने का प्रयास कर रहा हूं, सेटिंग्स एपीआई फ़ंक्शन एक प्लगइन में प्रत्येक सेटिंग के लिए कॉल करता है। विकल्प सरणी के माध्यम से लूपिंग, और आउटपुट add_settings_section()और add_settings_field()सरल पर्याप्त है:

add_settings_section():

$oenology_hooks_tabs = oenology_hooks_get_settings_page_tabs();
foreach ( $oenology_hooks_tabs as $tab ) {
    $tabname = $tab['name'];
    $tabtitle = $tab['title'];
    $tabsections = $tab['sections'];
    foreach ( $tabsections as $section ) {
        $sectionname = $section['name'];
        $sectiontitle = $section['title'];
        $sectiondescription = $section['description'];
        // Add settings section
        add_settings_section(
            'oenology_hooks_' . $sectionname . '_section',
            $sectiontitle,
            'oenology_hooks_' . $sectionname . '_text',
            'oenology_hooks_' . $tabname . '_tab'
        );
    }
}

और `add_settings_field ():

global $oenology_hooks;
$oenology_hooks = oenology_hooks_get_hooks();

foreach ( $oenology_hooks as $hook ) {
    $hookname = $hook['name'];
    $hooktitle = $hook['title'];
    $hooktab = $hook['tab'];
    $hooksection = $hook['section'];
    add_settings_field(
        'oenology_hooks_' . $hookname,
        $hooktitle,
        'oenology_hooks_setting_callback',
        'oenology_hooks_' . $hooktab . '_tab',
        'oenology_hooks_' . $hooksection . '_section',
        $hook
    );
}

साथ add_settings_field(), मैं आसानी से एक सामान्य कॉलबैक लिख सकते हैं पारित करके $hook, कॉलबैक करने के लिए चर समारोह कॉल में पांचवें पैरामीटर के रूप में:

function oenology_hooks_setting_callback( $hook ) {
    $oenology_hooks_options = get_option( 'plugin_oenology_hooks_settings' ); 
    $hookname = $hook['name'];
    $hooktitle = $hook['title'];
    $hookdescription = $hook['description'];
    $hooktype = $hook['type'];
    $hooktab = $hook['tab'];
    $hooksection = $hook['section'];
    $inputvalue = $hookname . '_hide';
    $inputname = 'plugin_oenology_hooks_settings[' . $inputvalue . ']';
    $textareaname = 'plugin_oenology_hooks_settings[' . $hookname . ']';
    $textareavalue = $oenology_hooks_options[$hookname];
    if ( 'Filter' == $hooktype ) {
        ?>
        <input type="checkbox" name="<?php echo $inputname; ?>" value="<?php echo $inputvalue;?>" <?php checked( true == $oenology_hooks_options[$inputvalue]  ); ?> />
        <span>Hide <?php echo $hooktitle; ?> content?</span><br />
        <?php
    }
    ?>
    <span class="description"><?php echo $hooktype; ?> Hook: <?php echo $hookdescription; ?></span><br />
    <textarea name="<?php echo $textareaname; ?>" cols="80" rows="3" ><?php 
        echo esc_textarea( $textareavalue ); 
    ?></textarea>
    <?php 
}

हालांकि, ऐसा प्रतीत होता है कि add_settings_section()एक अनुरूप $argsपैरामीटर नहीं है ; इस प्रकार, मैं $sectionचर को कॉलबैक में भेजने के लिए उसी विधि का उपयोग नहीं कर सकता ।

इस प्रकार, मेरा प्रश्न: क्या add_settings_section()कॉलबैक के लिए एक वैरिएबल को पास करने का कोई तरीका है , या किसी अन्य तरीके से कॉलबैक बनाने के लिए जो मैं कर रहा हूं उसके अनुरूप add_settings_field()?

संपादित करें:

@Bainternet ने इसे रद्द कर दिया! यहाँ मेरा काम कोड है:

/**
 * Callback for add_settings_section()
 * 
 * Generic callback to output the section text
 * for each Plugin settings section. 
 * 
 * @param   array   $section_passed Array passed from add_settings_section()
 */
function oenology_hooks_sections_callback( $section_passed ) {
    global $oenology_hooks_tabs;
    $oenology_hooks_tabs = oenology_hooks_get_settings_page_tabs();
    foreach ( $oenology_hooks_tabs as $tab ) {
        $tabname = $tab['name'];
        $tabsections = $tab['sections'];
        foreach ( $tabsections as $section ) {
            $sectionname = $section['name'];
            $sectiondescription = $section['description'];
            $section_callback_id = 'oenology_hooks_' . $sectionname . '_section';
            if ( $section_callback_id == $section_passed['id'] ) {
                ?>
                <p><?php echo $sectiondescription; ?></p>
                <?php
            }
        }
    }
}

1
बस एक विचार: आप extract( $args, EXTR_SKIP );शुरुआत में ऐसा क्यों नहीं करते oenology_hooks_setting_callback(), इसलिए आपको सरणी के हर हिस्से को एक नए में सहेजने की ज़रूरत नहीं है $var? ये तो $'name_inside_the_arrayपूर्व के साथ , avaible हो जाएगा । '$ शीर्षक , $ टैब`, इत्यादि
kaiser

... क्योंकि मैं वास्तव में PHP के साथ स्मार्ट नहीं हूँ? :) मैं कोशिश करूँगा कि; धन्यवाद!
चिप बेनेट

हो सकता है कि आप इस जिस्ट पर एक नज़र डालना चाहते हैं , जो फ़िल्टर और हुक, पार्स तर्कों को जोड़ने और क्वेरी स्ट्रिंग इनपुट से निपटने के तरीके पर कुछ "शायद सबसे अच्छा अभ्यास" उदाहरण दिखाता है। यह थोड़ा पुराना है और जब भी मुझे समय मिलेगा, मैं इसकी पुनरावृत्ति करूंगा, लेकिन यह देखने लायक है। :)
खीर

यह वास्तव में सिर्फ एक प्लगइन है जो हुक के लिए यूआई जोड़ता है जिसे मैंने ओनोलॉजी में जोड़ा है। मैं इस बात से बहुत सहज हूं कि मैंने वास्तव में हुक को थीम में कैसे जोड़ा है। अब, मैं उपयोगकर्ताओं को समाप्त करने के लिए उन्हें उजागर करने के लिए एक सुविधाजनक तरीका प्रदान करने का प्रयास कर रहा हूं।
चिप बेनेट

मैंने आपको गलत नहीं समझा। मैं आपको यह दिखाना चाहता था कि यह आपके लिए (जब भी) कुछ मदद कर सकता है। मैं इस कोड को कुछ विडंबना के रूप में देखता हूं - बस एक नज़र डालें कि यह कैसे और किस तरह से प्रत्येक के लिए हर चीज को Wordpress तरीके से प्राप्त करने के लिए कितना प्रयास है ...
kaiser

जवाबों:


18

यदि आप do_settings_sections को देखते हैं तो विशेष रूप से लाइन 1164 जहां कॉलबैक फ़ंक्शन निष्पादित किया जा रहा है:

call_user_func($section['callback'], $section);

आप देख सकते हैं कि कॉलबैक फ़ंक्शन में $ अनुभाग सरणी को पास किया जा रहा है, जिससे आप कॉलबैक की पहचान कर सकते हैं $section['id']

इस के बाद से उम्मीद है।

अपडेट करें

यहाँ एक उदाहरण है, यदि आपके add_settings_section ने सभी वर्गों के लिए कॉलबैक का नाम रखा था, oenology_hooks_section_callbackतो आप इसे इस तरह पहचान सकते हैं:

function oenology_hooks_section_callback($section_passed){
    if ($section_passed['id'] == 'whatever_section_id'){
        //do stuff
    }
    if ($section_passed['id'] == 'whatever_section_id_number2'){
        //do other stuff
    }
 }

और सामान के साथ मेरा मतलब है कि आप उस अनुभाग कॉलबैक के साथ जो करना चाहते हैं।


हम्म ... जो आशाजनक लग रहा है। मैं कैसे निर्धारित $section['id']करूं?
चिप बेनेट

@Chip बेनेट idपहली दलील होगी जो आप पास करते हैंadd_settings_section()
Rarst

@Chip बेनेट I ने बेहतर तरीके से कोशिश करने और समझाने के लिए एक उदाहरण जोड़ा।
बेनटर्नट

@ बेनेटेट: बहुत बढ़िया! मेरे पास एक विकल्प स्क्रिप्ट है और चिप बेनेट के पास एक ही समस्या है। अब यह एक आकर्षण की तरह काम करता है। धन्यवाद।
आह तरण

ठीक है, इसलिए यह अंत में सप्ताहांत पर क्लिक किया; मुझे अपने दिमाग में आने वाले कोड की कोशिश करने दें, और मैं वापस रिपोर्ट करूंगा।
चिप बेनेट

4

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं अपने दो सेंट फेंक दूंगा, अगर किसी और के साथ आता है; ऐसा करने का एक सरल तरीका आपको add_settings_section()फ़ंक्शन का स्वयं संशोधन करना होगा, जो केवल इसके अंत में एक कॉलबैक आर्ग पैरामीटर जोड़ देगा।

यह इस तरह दिखेगा (या ऐसा कुछ)

function my_add_settings_section($id, $title, $callback, $page, $callbackargs) {

global $wp_settings_sections;

if ( !isset($wp_settings_sections) ) 
{
    $wp_settings_sections = array();
}

if ( !isset($wp_settings_sections[$page]) )
{
    $wp_settings_sections[$page] = array();
}

if ( !isset($wp_settings_sections[$page][$id]) )
{
    $wp_settings_sections[$page][$id] = array();
}

$wp_settings_sections[$page][$id] = array( 'id' => $id, 'title' => $title, 'callback' => $callback, 'callbackargs' => $callbackargs, 'page' => 'page' );
}

अब आप मूल वर्डप्रेस फ़ंक्शन के बजाय बस इसका उपयोग करेंगे और 'callbackargs'सामान्य तरीके से सरणी कॉल के माध्यम से अपने कॉलबैक आर्गन्स तक पहुंच प्राप्त करेंगे। इस तरह

function oenology_hooks_sections_callback( $section_passed ) {
   // Our callback arguments  
   $section_passed['callbackargs']
}

जिसे हम किसी अन्य फ़ंक्शन में पास करने के लिए उपयोग कर सकते हैं:

 function oenology_hooks_sections_callback( $section_passed ) {
   // Our callback arguments  
   $args = $section_passed['callbackargs'];
   some_other_function( $args );
}

या कॉलबैक आर्ग्स स्वयं एक सरणी हो सकती है जिसका हम उपयोग करते हैं:

function oenology_hooks_sections_callback( $section_passed ) {
   // Our callback arguments  
   if ( $section_passed['callbackargs']['stuff'] !== 'things' ) 
   {
       echo 'stuff is not things!";
   }
}

यह सब संभव है, क्योंकि सभी वैश्विक add_settings_section()सरणी में एक नया सरणी सदस्य जोड़ते हैं $wp_settings_sections, जो कि नया सरणी सदस्य एक ऐसा सरणी हो सकता है जिसमें विभिन्न नामों वाली कोई भी कुंजी हो, जिसका उपयोग किसी भी फ़ंक्शन द्वारा किया जा सकता है, जो जानते थे कि वे वहां थे। जब do_settings_sectionsकॉल call_user_func_arrayयह एक गुजरता $sectionsपरमाटर रूप Bainternet बताया गया है, इस का मतलब है कि पूरे सरणी हम करने के लिए जोड़ा $wp_settings_sectionsमें my_add_settings_section()हमारे कॉलबैक में पारित हो जाता है, जिसका अर्थ है कि हम इस तरह के रूप में हम यह करने के लिए जोड़ हर नई सरणी सदस्य की पहुंच है callbackargsहमारे समारोह की अनुमति के लिए एक पूर्ण करने के लिए भाग गया कॉलबैक।

भले ही मुझे यकीन है कि यह स्पष्ट हो सकता है मैंने सोचा था कि मैं इसे किसी ऐसे व्यक्ति के मामले में समझाऊंगा जो भ्रमित दिखता है।


1

आप हमेशा एक अधिक सामान्य दृष्टिकोण का उपयोग कर सकते हैं, विशेष फ़ंक्शन कार्यान्वयन की तलाश नहीं कर सकते हैं (मतलब, अगर जाँच किए बिना कि add_settings_section कुछ भी गुजरता है)। यह सामान्य दृष्टिकोण PHP बंद का उपयोग करता है।

इसका उपयोग कैसे करें: हर जगह, जहाँ आप एक फ़ंक्शन नाम से गुजरते हैं, इसके बजाय एक अनाम फ़ंक्शन पास करते हैं, इसमें उपयोग के साथ ।

उदाहरण:

के बजाय

foreach ( $ar as $name => value ) {
    add_settings_section(
        $section,
        'something',
        'something-else',
        'callback_name'
    );
}

function callback_name() {
    do_something();
}

आप उपयोग कर सकते हैं:

foreach ( $ar as $name => value ) {
    add_settings_section(
        $section,
        'something',
        'something-else',
        function () use ( $name, $value ) {
            callback_name( $name, $value )
        }
    );
}

function callback_name( $name, $value ) {
    do_something( $name, $value );
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.