Como passar a variável para o callback add_settings_section ()?

13

Eu estou tentando automatizar, tanto quanto possível, as chamadas de função da API de configurações para cada configuração em um plug-in. Fazendo um loop pela matriz de opções e a saída de add_settings_section() e add_settings_field() é bem simples:

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

Com add_settings_field() , posso escrever facilmente um retorno de chamada genérico, passando a variável $hook para o retorno de chamada, como o quinto parâmetro na chamada de função:

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 
}

No entanto, parece que add_settings_section() não possui um parâmetro $args análogo; portanto, não posso usar o mesmo método para passar a variável $section para o retorno de chamada.

Assim, minha pergunta: existe alguma maneira de passar uma variável para o retorno de chamada add_settings_section() , ou alguma outra maneira de criar um retorno de chamada análogo ao que estou fazendo para add_settings_field() ?

EDITAR:

@Bainternet acertou em cheio! Aqui está o meu código de trabalho:

/**
 * 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
            }
        }
    }
}
    
por Chip Bennett 03.06.2011 / 17:27

3 respostas

17

se você olhar para as do_settings_sections funcionar mais especificamente na linha 1164 onde a função callback está sendo executada:

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

você pode ver que a matriz $ section está sendo passada para a função de retorno de chamada, para que você possa identificar o retorno de chamada pelo $section['id']

espero que isso faça desde.

Atualizar

aqui é um exemplo, se o seu retorno de chamada de add_settings_section para todas as seções foi chamado de oenology_hooks_section_callback , então você pode identificá-lo assim:

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 por coisas quero dizer o que você quer fazer com essa chamada de retorno.

    
por Bainternet 03.06.2011 / 18:20
4

Eu sei que esta é uma pergunta antiga, mas vou jogar meus dois centavos, apenas no caso de alguém aparecer; uma maneira mais simples de fazer isso seria gravar sua própria modificação da função add_settings_section() , que adicionaria apenas um parâmetro args de retorno de chamada no final dela.

Isto ficaria assim (ou algo parecido)

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

Agora, você simplesmente usaria essa função em vez da função nativa do wordpress e acessaria seus argumentos de retorno de chamada por meio da chave da matriz 'callbackargs' da maneira usual, como esta

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

Que poderíamos usar para passar para outra função:

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

Ou os argumentos de retorno de chamada podem ser um array que usamos:

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

Isso tudo é possível porque todos os add_settings_section() adicionam um novo membro da matriz à variável global $wp_settings_sections , esse novo membro da matriz poderia ser um próprio array contendo qualquer número de chaves com nomes diferentes, que poderiam ser usados, por qualquer função que soubesse que eles estavam lá. Quando do_settings_sections chama o call_user_func_array , ele passa um $sections paramater como a Bainternet observou, isso significa que toda a matriz que adicionamos a $wp_settings_sections in my_add_settings_section() é passada para nosso retorno de chamada, o que significa que temos acesso a cada nova matriz membro que adicionamos a ele, como o callbackargs , permitindo que nossa função tenha um retorno de chamada completo.

Mesmo que eu tenha certeza de que isso poderia ser óbvio, eu pensei em apenas explicá-lo no caso de alguém ficar confuso.

    
por Cikica 28.10.2012 / 23:34
0

Você também pode sempre usar uma abordagem mais geral, não procurando a implementação da função específica (ou seja, sem verificar se add_settings_section transmite implicitamente qualquer coisa). Essa abordagem geral usa o encerramento do PHP.

Como usar: em todo lugar, onde você passa um nome de função, em vez de passar uma função anônima, com use nele.

Exemplo:

em vez de

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

function callback_name() {
    do_something();
}

você pode usar:

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 );
}
    
por Olga Farber 02.02.2017 / 14:54