¿Cómo pasar la variable a la retrollamada add_settings_section ()?

13

Estoy intentando automatizar, en la medida de lo posible, las funciones de la API de configuración para cada configuración en un complemento. Recorrer la matriz de opciones y generar 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 variable $hook a la devolución de llamada, como el quinto parámetro en la llamada de 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 parámetro $args análogo; por lo tanto, no puedo usar el mismo método para pasar la variable $section a la devolución de llamada.

Por lo tanto, mi pregunta: ¿hay alguna forma de pasar una variable a la devolución de llamada add_settings_section() , o alguna otra forma de crear una devolución de llamada análoga a la que estoy haciendo para 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
            }
        }
    }
}
    
pregunta Chip Bennett 03.06.2011 - 17:27

3 respuestas

17

si observa el do_settings_sections funciona más específicamente la línea 1164 donde se está ejecutando la función de devolución de llamada:

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

puede ver que la matriz $ section se está pasando a la función de devolución de llamada, por lo que puede identificar la devolución de llamada mediante el $section['id']

espero que esta marca desde entonces.

Actualizar

Aquí hay un ejemplo, si su devolución de llamada add_settings_section para todas las secciones se llamaba oenology_hooks_section_callback , entonces puede identificarlo de esta manera:

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

y con cosas que quiero decir, haz lo que quieras hacer con la devolución de llamada de esa sección.

    
respondido por el Bainternet 03.06.2011 - 18:20
4

Sé que esta es una pregunta antigua, pero lanzaré mis dos centavos, en caso de que alguien más venga; una forma más sencilla de hacerlo sería escribir su propia modificación de la función add_settings_section() , 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í)

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

Ahora simplemente usará esto en lugar de la función nativa de wordpress y accederá a sus argumentos de devolución de llamada a través de la clave de matriz 'callbackargs' de una manera habitual, como esta

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

Que podríamos usar para pasar a alguna otra función:

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

O los argumentos de devolución de llamada podrían ser una matriz que usamos:

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

Todo esto es posible porque todo lo que add_settings_section() hace es agregar un nuevo miembro de la matriz a la variable global $wp_settings_sections , ese nuevo miembro de la matriz podría ser una matriz que contenga cualquier número de claves con nombres diferentes, que podrían usarse, Por cualquier función que supiera que estaban allí. Cuando do_settings_sections llama al call_user_func_array pasa un parámetro $sections como Bainternet señaló, esto significa que toda la matriz que agregamos a $wp_settings_sections en my_add_settings_section() se transfiere a nuestra devolución de llamada, lo que significa que tenemos acceso a cada nueva matriz. miembro que le agregamos, como callbackargs , lo que permite que nuestra función tenga una devolución de llamada completa.

Aunque estoy seguro de que esto podría ser obvio, pensé que solo lo explicaría en caso de que alguien que se confunda lo vea.

    
respondido por el Cikica 28.10.2012 - 23:34
0

También puede usar 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 se pasa un nombre de función, en lugar de pasar una función anónima, con uso en él.

Ejemplo:

en lugar de

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

function callback_name() {
    do_something();
}

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

Lea otras preguntas en las etiquetas