Estoy intentando automatizar, en la medida de lo posible, la función API de configuración requiere cada configuración en un complemento. Bucle a través de la matriz de opciones, y la salida add_settings_section()
y add_settings_field()
es bastante simple:
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'
);
}
}
Y `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()
, puedo escribir fácilmente una devolución de llamada genérica, pasando la $hook
variable a la devolución de llamada, como el quinto parámetro en la llamada a la función:
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
}
Sin embargo, parece que add_settings_section()
no tiene un $args
parámetro análogo ; por lo tanto, no puedo usar el mismo método para pasar la $section
variable a la devolución de llamada.
Por lo tanto, mi pregunta: ¿hay alguna forma de pasar una variable a la add_settings_section()
devolución de llamada, o alguna otra forma de crear una devolución de llamada análoga a lo que estoy haciendo add_settings_field()
?
EDITAR:
@Bainternet lo clavó! Aquí está mi código de trabajo:
/**
* 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
}
}
}
}
fuente
extract( $args, EXTR_SKIP );
al principiooenology_hooks_setting_callback()
, para que no tenga que guardar cada parte de la matriz en una nueva$var
? Estos estarán disponibles con$'name_inside_the_array
, por ej. '$ title,
$ tab`, etc.Respuestas:
si observa la función do_settings_sections más específicamente la línea 1164 donde se ejecuta la función de devolución de llamada:
puede ver que la matriz $ section se pasa a la función de devolución de llamada, por lo que puede identificar la devolución de llamada mediante
$section['id']
Espero que esto haga desde entonces.
Actualizar
Aquí hay un ejemplo, si su devolución de llamada add_settings_section para todas las secciones fue nombrada
oenology_hooks_section_callback
, puede identificarla así:y por hacer cosas quiero decir hacer lo que quieras hacer con esa devolución de llamada de la sección.
fuente
$section['id']
?id
será el primer argumento al que pasesadd_settings_section()
Sé que esta es una vieja pregunta, pero arrojaré mis dos centavos, en caso de que alguien más venga; una manera más simple de hacerlo sería escribir su propia modificación de la
add_settings_section()
función, que solo agregaría un parámetro de devolución de llamada al final de la misma.Esto se vería así (o algo así)
Ahora simplemente usaría esto en lugar de la función nativa de wordpress y accedería a sus argumentos de devolución de llamada a través de la
'callbackargs'
clave de matriz de la manera habitual, como estaQue podríamos usar para pasar a alguna otra función:
O los argumentos de devolución de llamada podrían ser una matriz que usamos:
Todo esto es posible porque todo lo que
add_settings_section()
hace es agregar un nuevo miembro de la matriz a la$wp_settings_sections
variable global, ese nuevo miembro de la matriz podría ser una matriz que contenga cualquier número de teclas con diferentes nombres, que podrían ser utilizados por cualquier función que supiera que estaban allí. Cuandodo_settings_sections
llama a lacall_user_func_array
que pasa un$sections
parámetro de como se ha señalado Bainternet, esto significa que toda la matriz añadimos a$wp_settings_sections
enmy_add_settings_section()
traspasó nuestra devolución de llamada, lo que significa que tenemos acceso a cada nuevo miembro de la matriz se añade al mismo, como elcallbackargs
permitir que nuestra función para tener una plena devolución de llamada de hecho.Aunque estoy seguro de que esto podría ser obvio, pensé que solo lo explicaría en caso de que alguien que se confunde mire.
fuente
También puede usar siempre un enfoque más general, sin buscar la implementación de la función en particular (es decir, sin verificar si add_settings_section pasa algo implícitamente). Este enfoque general utiliza el cierre de PHP.
Cómo usarlo: en cada lugar, donde pasa un nombre de función, en lugar de pasar una función anónima, con uso en él.
Ejemplo:
en lugar de
puedes usar:
fuente