Estou tentando automatizar, tanto quanto possível, a função da API de configurações para cada configuração em um plug-in. Dar laços na matriz de opções e gerar add_settings_section()
e add_settings_field()
é bastante 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()
, eu posso escrever facilmente um retorno de chamada genérico, passando a $hook
variável 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 $args
parâmetro análogo ; portanto, não posso usar o mesmo método para passar a $section
variável para o retorno de chamada.
Portanto, minha pergunta: existe alguma maneira de passar uma variável para o add_settings_section()
retorno de chamada ou alguma outra maneira de criar um retorno de chamada análogo ao que estou fazendo 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
}
}
}
}
fonte
extract( $args, EXTR_SKIP );
no começooenology_hooks_setting_callback()
para não salvar todas as partes da matriz em uma nova$var
? Estes estarão disponíveis com$'name_inside_the_array
, por ex. '$ title,
$ tab`, etc.Respostas:
se você observar a função do_settings_sections mais especificamente a linha 1164 onde a função de retorno de chamada está sendo executada:
você pode ver que a matriz da seção $ está sendo passada para a função de retorno de chamada, para poder identificar o retorno de chamada pelo
$section['id']
espero que isso faça desde então.
Atualizar
Aqui está um exemplo, se seu retorno de chamada add_settings_section para todas as seções foi nomeado
oenology_hooks_section_callback
, você pode identificá-lo assim:e por coisas, quero dizer, faça o que você quiser fazer com o retorno de chamada dessa seção.
fonte
$section['id']
?id
será o primeiro argumento que você passa paraadd_settings_section()
Sei que essa é uma pergunta antiga, mas vou jogar meus dois centavos, para o caso de alguém aparecer; uma maneira mais simples de fazer isso seria escrever sua própria modificação da
add_settings_section()
função, que adicionaria apenas um parâmetro args de retorno de chamada no final dela.Isso seria assim (ou algo parecido)
Agora você simplesmente usaria isso em vez da função nativa de wordpress e acessaria seus argumentos de retorno de chamada através da
'callbackargs'
chave de matriz da maneira usual, como esteQue poderíamos usar para passar para outra função:
Ou os argumentos de retorno de chamada podem ser eles mesmos uma matriz que usamos:
Isso tudo é possível porque tudo o que
add_settings_section()
faz é adicionar um novo membro da matriz à$wp_settings_sections
variável global, esse novo membro da matriz poderia ser uma matriz em si contendo qualquer número de chaves com nomes diferentes, que poderiam ser usados por qualquer função que soubesse que eles estavam lá. Quandodo_settings_sections
chama ocall_user_func_array
que passa um$sections
paramater como Bainternet observado, isto significa que toda a matriz que foram adicionadas para$wp_settings_sections
dentromy_add_settings_section()
é passado para o nosso retorno de chamada, o que significa que têm acesso a cada novo membro da matriz que adicionar a ele, como ocallbackargs
permitir que a nossa função de ter um completo retorno de chamada emplumado.Embora eu tenha certeza de que isso possa ser óbvio, pensei em explicar o caso de alguém que se confunda aparecer.
fonte
Você também pode sempre usar uma abordagem mais geral, sem procurar a implementação da função específica (ou seja, sem verificar se add_settings_section passa algo implicitamente). Essa abordagem geral usa o fechamento do PHP.
Como usá-lo: em todos os lugares, onde você passa o nome de uma função, em vez de passar uma função anônima, com o uso .
Exemplo:
ao invés de
você pode usar:
fonte