Cum să transmiți argumente din add_settings_field() către funcția de callback?

28 iun. 2011, 07:39:14
Vizualizări: 18K
Voturi: 21

Am o funcție ca aceasta:

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

Funcționează. Aceasta apelează settings_callback. Perfect. Problema pe care o am este: nu vreau să fiu nevoit să definesc o funcție de callback pentru fiecare setare pe care o adaug, dacă tot ce fac este să afișez un pic de conținut.

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

De ce ar trebui să fac asta? Id-ul, clasa și numele ar trebui să fie parametri.

Nu există vreo modalitate de a transmite parametri către funcția settings_callback? Am început să cercetez codul sursă, am ajuns aici: http://core.trac.wordpress.org/browser/tags/3.1.3/wp-admin/includes/template.php

...și am dat peste acest global $wp_settings_fields. Unde este definit acesta?

0
Toate răspunsurile la întrebare 1
0
29

Uită-te la declarația funcției:

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

Ultimul parametru preia argumentele tale și le transmite funcției de callback.

Exemplu din plugin-ul meu Date de Contact Publice

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

Funcția print_input_field() primește aceste argumente ca prim parametru:

/**
 * Câmpuri de introducere în 'wp-admin/options-general.php'
 *
 * @see    add_contact_fields()
 * @param  array $args Argumente trimise de 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>";
}

Nu este nevoie să modifici o variabilă globală.

10 mai 2012 08:45:19