Domanda

Sto tentando di automatizzare, per quanto possibile, le impostazioni chiamate di funzione API per ogni impostazione in un plugin. Looping attraverso l'array opzioni, e l'output di add_settings_section() e add_settings_field() è abbastanza semplice:

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

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

Con add_settings_field(), posso facilmente scrivere una richiamata generica, facendo passare la variabile $hook al callback, come il quinto parametro nella chiamata di funzione:

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 
}

Tuttavia, sembra che add_settings_section() non ha un parametro $args analogo; pertanto, non è possibile utilizzare lo stesso metodo per passare la variabile $section al callback.

Quindi, la mia domanda:? Non v'è alcun modo per passare una variabile al callback add_settings_section(), o qualche altro modo per creare un analogo richiamo a quello che sto facendo per add_settings_field()

EDIT:

@Bainternet inchiodato! Ecco il mio codice di lavoro:

/**
 * 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
            }
        }
    }
}
È stato utile?

Soluzione

se si guarda al do_settings_sections funzione più specificamente la linea 1164 in cui viene eseguita la funzione di callback:

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

si può vedere che l'array $ sezione viene passato alla funzione di callback, in modo da poter identificare la richiamata dal $section['id']

speriamo che questo trucco da allora.

Aggiorna

ecco un esempio, se il callback add_settings_section per tutte le sezioni è stato nominato oenology_hooks_section_callback allora è possibile identificare in questo modo:

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

e roba faccio media quello che vuoi fare con quella richiamata sezione.

Altri suggerimenti

So che questo è una vecchia questione, ma mi butto i miei due centesimi in, nel caso in cui qualcun altro arriva; un modo più semplice per farlo sarebbe scrivo si modifica proprio della funzione add_settings_section(), che sarebbe solo aggiungere un parametro args richiamata alla fine di esso.

Questo sarebbe simile a questa (o qualcosa di simile)

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

Ora si sarebbe semplicemente utilizzare questo anziché la funzione nativa wordpress ed accedi ai tuoi args richiamata attraverso la chiave dell'array 'callbackargs' in modo consueto, come questo

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

che potremmo usare per passare a qualche altra funzione:

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

o l'args callback potrebbe essere un array stessi che usiamo:

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

Questo è possibile perché tutti add_settings_section() non è aggiungere un nuovo membro di matrice alla variabile globale $wp_settings_sections, quel nuovo membro di matrice può essere una matrice stessa contenente qualsiasi numero di chiavi con nomi diversi, che potrebbero essere usate, da qualsiasi funzione che sapevano che erano lì. Quando do_settings_sections chiama il call_user_func_array passa un paramater $sections come notato Bainternet, ciò significa che l'intera matrice abbiamo aggiunto a $wp_settings_sections in my_add_settings_section() viene passato nella nostra richiamata, cioè abbiamo accesso ad ogni nuovo membro di matrice si aggiunge ad esso come il callbackargs permettendo la nostra funzione di avere un callback pieno titolo.

Anche se sono sicuro che questo potrebbe essere ovvio ho pensato che avevo appena spiego nel caso in cui qualcuno che si confonde sguardi in.

Si può anche utilizzare sempre un approccio più generale, senza guardare per la particolare implementazione della funzione (cioè, senza controllare se add_settings_section passa nulla implicitamente). Questo approccio generale utilizza chiusura PHP.

Come si usa:. In ogni luogo, in cui si passa un nome di funzione, invece di passare una funzione anonima, con utilizzo in esso

Esempio:

anziché

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

function callback_name() {
    do_something();
}

è possibile utilizzare:

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 );
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a wordpress.stackexchange
scroll top