Intereting Posts
Автоматический переход на резервную базу данных при сбое 'Примечание: ошибка неопределенного индекса на странице плагинов WordPress 3.5: вернитесь к старому медиа-загрузчику? Относительное время на сообщениях Сообщения, которые имеют боковые панели с конкретными категориями с виджетами Добавление атрибутов страницы Metabox и шаблонов страниц в сообщение «Редактировать страницу»? Класс или оболочка функций для кода плагина Ограничить фильтр upgraderader_post_install до одного плагина Заказ пользователей определенной роли по фамилии Что использовать, set_transient, set_option или файловая система? изображения вложений приложения … если нет вложений -> получить вложения родительской страницы? включить SFTP через SSH-ключи в wordpress Как получить полный пул, включая все родительские страницы Невозможно связать категории с настраиваемым типом сообщения, используя стандартную функцию Домашняя ссылка на главной странице моего wordpress не показывает мои сообщения в блоге

Единый обратный вызов с несколькими полями настройки

В любом случае вы можете использовать один обратный вызов с несколькими полями настроек? Может быть, есть способ передать поле настройки, используемое через обратный вызов?

Solutions Collecting From Web of "Единый обратный вызов с несколькими полями настройки"

add_settings_field() принимает шесть аргументов, последний – массив аргументов:

 add_settings_field($id, $title, $callback, $page, $section, $args); 

Здесь вы можете добавить пользовательские значения, чтобы вы могли повторно использовать один обратный вызов.

Простой пример:

 add_settings_field( 'foo', 'Foo', 'wpse_settingsfield_callback', 'my_page', 'my_section', array ( 'context' => 'foo' ) // custom arguments ); add_settings_field( 'bar', 'Bar', 'wpse_settingsfield_callback', 'my_page', 'my_section', array ( 'context' => 'bar' ) // custom arguments ); function wpse_settingsfield_callback( $args ) { if ( 'foo' === $args[ 'context' ] ) print 'Hello Foo!'; elseif ( 'bar' === $args[ 'context' ] ) print 'Hello Bar!'; else print 'Unknown context!'; } 

Другой вариант – это отдельный класс для рендеринга полей. Давайте возьмем очень простой и неполный класс:

 class Checkbox_Settingsfield_View { protected $attributes, $label; public function set_attributes( Array $attributes ) { $this->attributes = $attributes; } public function render() { printf( '<label for="%1$s"><input type="checkbox"%2$s /></label>', $this->attributes[ 'id' ], $this->array_to_attrs( $this->attributes ) ); } protected function array_to_attrs( array $attrs, $xml = TRUE ) { $str = ''; foreach ( $attrs as $key => $value ) { if ( TRUE === $value ) ( $xml and $value = "='$key'" ) or $value = ''; $str .= " $key='" . esc_attr( $value) . "'"; } return $str; } } 

Теперь вы создали объекты …

 $foo_view = new Checkbox_Settingsfield_View; $foo_view->set_attributes( array ( 'name' => 'foo', 'style' => 'border:10px solid red' ) ); $bar_view = new Checkbox_Settingsfield_View; $bar_view->set_attributes( array ( 'name' => 'bar', 'style' => 'border:5px solid blue' ) ); 

… и передать метод render() качестве аргумента обратного вызова:

 add_settings_field( 'foo', 'Foo', array ( $foo_view, 'render' ), 'my_page', 'my_section' ); add_settings_field( 'bar', 'Bar', array ( $bar_view, 'render' ), 'my_page', 'my_section' );