Comment passer des arguments de add_settings_field () à la fonction de rappel?


16

J'ai une fonction comme celle-ci:

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

Ça marche. Il appelle settings_callback. Cool. Le problème que j'ai avec ceci est: je ne veux pas avoir à définir une fonction de rappel pour chaque paramètre que j'ajoute, si tout ce que je fais, c'est faire écho un peu de choses.

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

Pourquoi diable devrais-je avoir à faire ça? L'identifiant, la classe et le nom doivent tous être des paramètres.

N'y a-t-il aucun moyen de passer des paramètres à la fonction settings_callback? J'ai commencé à regarder le noyau, je suis arrivé ici: http://core.trac.wordpress.org/browser/tags/3.1.3/wp-admin/includes/template.php

..et a rencontré ce global $ wp_settings_fields. Où est-ce défini?

Réponses:


24

Regardez la déclaration de la fonction:

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

Le dernier paramètre prend vos arguments et les transmet à la fonction de rappel.

Exemple de mon plugin Données de contact public

    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 fonction print_input_field()obtient ces arguments comme premier paramètre:

/**
 * 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>";
}

Pas besoin de toucher une variable globale.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.