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

10

Tengo una función como esta:

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

Eso funciona. Se llama settings_callback. Guay. 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 tener que hacer eso? El ID, la clase y el nombre deben ser todos parámetros.

¿No hay manera de pasar parámetros a la función settings_callback? Comencé a buscar el núcleo, llegué aquí: enlace

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

    
pregunta Calvin Froedge 28.06.2011 - 06:39

1 respuesta

15

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.

    
respondido por el fuxia 10.05.2012 - 07:45

Lea otras preguntas en las etiquetas