webentwicklung-frage-antwort-db.com.de

Wie übergebe ich eine Variable an den Rückruf von add_settings_section ()?

Ich versuche, die Einstellungen-API-Funktion für jede Einstellung in einem Plugin so weit wie möglich zu automatisieren. Das Options-Array durchlaufen und add_settings_section() und add_settings_field() auszugeben ist einfach genug:

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'
        );
    }
}

Und `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
    );
}

Mit add_settings_field() kann ich problemlos einen generischen Rückruf schreiben, indem ich die Variable $hook als fünften Parameter im Funktionsaufruf an den Rückruf übergebe:

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 
}

Es scheint jedoch, dass add_settings_section() keinen analogen $args-Parameter hat. Daher kann ich nicht dieselbe Methode verwenden, um die Variable $section an den Rückruf zu übergeben.

Also, meine Frage: gibt es eine Möglichkeit, eine Variable an die add_settings_section() Rückruf zu übergeben, oder eine andere Möglichkeit, einen Rückruf zu erstellen, analog zu dem, was ich für add_settings_field() mache?

BEARBEITEN:

@Bainternet hat es geschafft! Hier ist mein Arbeitscode:

/**
 * 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
            }
        }
    }
}
15
Chip Bennett

wenn Sie sich die Funktion do_settings_sections genauer ansehen, die Zeile 1164, in der die Rückruffunktion ausgeführt wird:

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

sie können sehen, dass das Array $ section an die Rückruffunktion übergeben wird, sodass Sie den Rückruf anhand des Codes $section['id'] identifizieren können.

hoffe das macht da.

Aktualisieren

hier ein Beispiel: Wenn Ihr Rückruf für add_settings_section für alle Abschnitte den Namen oenology_hooks_section_callback hat, können Sie ihn folgendermaßen identifizieren:

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
    }
 }

und mit "do stuff" meine ich, mach was du willst mit diesem Abschnitt Rückruf.

17
Bainternet

Sie können auch immer einen allgemeineren Ansatz verwenden und nicht nach der bestimmten Funktionsimplementierung suchen (dh ohne zu prüfen, ob add_settings_section implizit etwas übergibt). Dieser allgemeine Ansatz verwendet PHP Closure.

Verwendung: Übergeben Sie an jeder Stelle, an der Sie einen Funktionsnamen übergeben, stattdessen eine anonyme Funktion mit use .

Beispiel:

anstatt

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

function callback_name() {
    do_something();
}

sie können verwenden:

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 );
}
0
Olga Farber