¿Cómo pasar argumentos de add_settings_field () a la función de devolución de llamada?

16

Tengo una función como esta:

add_settings_field( 'contact_phone', 'Contact Phone', 'settings_callback', 'general');

Eso funciona. Llama a settings_callback. Frio. El problema que tengo con esto es: no quiero tener que definir una función de devolución de llamada para cada configuración que agrego, si todo lo que estoy haciendo es hacer eco de un poco de cosas.

function settings_callback()
{
    echo '<input id="contact_phone" type="text" class="regular-text" name="contact_phone" />';
}

¿Por qué demonios debería hacer eso? La identificación, la clase y el nombre deben ser params.

¿No hay forma de pasar parámetros a la función settings_callback? Empecé a mirar el núcleo, llegué aquí: http://core.trac.wordpress.org/browser/tags/3.1.3/wp-admin/includes/template.php

..y se topó con este $ wp_settings_fields global. ¿Dónde se define esto?

Calvin Froedge
fuente

Respuestas:

24

Mira la declaración de la función:

function add_settings_field(
    $id,
    $title,
    $callback,
    $page,
    $section = 'default',
    $args    = array()
) { }

El último parámetro toma sus argumentos y los pasa a la función de devolución de llamada.

Ejemplo de mi complemento Datos de contacto público

    foreach ( $this->fields as $type => $desc )
    {
        $handle   = $this->option_name . "_$type";
        $args     = array (
            'label_for' => $handle,
            'type'      => $type
        );
        $callback = array ( $this, 'print_input_field' );

        add_settings_field(
            $handle,
            $desc,
            $callback,
            'general',
            'default',
            $args
        );
    }

La función print_input_field()obtiene estos argumentos como primer parámetro:

/**
 * Input fields in 'wp-admin/options-general.php'
 *
 * @see    add_contact_fields()
 * @param  array $args Arguments send by add_contact_fields()
 * @return void
 */
public function print_input_field( array $args )
{
    $type   = $args['type'];
    $id     = $args['label_for'];
    $data   = get_option( $this->option_name, array() );
    $value  = $data[ $type ];

    'email' == $type and '' == $value and $value = $this->admin_mail;
    $value  = esc_attr( $value );
    $name   = $this->option_name . '[' . $type . ']';
    $desc   = $this->get_shortcode_help( $type );

    print "<input type='$type' value='$value' name='$name' id='$id'
        class='regular-text code' /> <span class='description'>$desc</span>";
}

No es necesario tocar una variable global.

fuxia
fuente