Как передавать аргументы из add_settings_field() в callback-функцию?
У меня есть такая функция:
add_settings_field( 'contact_phone', 'Контактный телефон', 'settings_callback', 'general');
Она работает. Вызывает settings_callback. Отлично. Проблема в том, что я не хочу определять отдельную callback-функцию для каждой настройки, если всё, что я делаю - это вывожу немного HTML.
function settings_callback()
{
echo '<input id="contact_phone" type="text" class="regular-text" name="contact_phone" />';
}
Зачем мне каждый раз делать это? ID, класс и имя должны быть параметрами.
Неужели нет способа передать параметры в функцию settings_callback? Я начал изучать ядро, дошёл сюда: http://core.trac.wordpress.org/browser/tags/3.1.3/wp-admin/includes/template.php
...и наткнулся на этот глобальный $wp_settings_fields. Где он определяется?

Посмотрите на объявление функции:
function add_settings_field(
$id,
$title,
$callback,
$page,
$section = 'default',
$args = array()
) { }
Последний параметр принимает ваши аргументы и передает их в функцию обратного вызова.
Пример из моего плагина Public Contact Data
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
);
}
Функция print_input_field()
получает эти аргументы в качестве первого параметра:
/**
* Поля ввода в 'wp-admin/options-general.php'
*
* @see add_contact_fields()
* @param array $args Аргументы, переданные 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>";
}
Нет необходимости трогать глобальную переменную.
