register_setting() WP 2.7.0

Реєструє нову опцію та callback функцію для обробки значення опції за її збереження в БД.

Ця функція також може використовуватися для реєстрації нової опції, яка буде додана на базову сторінку налаштувань WordPress (Загальні, Медіафайли, Читання…) та REST API. Опція додається до існуючої секції за допомогою функції add_settings_section() і додати опцію туди.

Функцію потрібно викликати на хуку:

  • admin_init – для використання через інтерфейс адмінки.
  • rest_api_init – для використання у REST API. Для цього потрібно вказати параметр show_in_rest=true. Див. приклади нижче.

При першому додаванні опції БД очищення спрацьовує два рази.

Наприклад, наступна функція поверне рядок з двома знаками оклику:

function append_exclamation( $input ){ return $input .'!'; }

В цьому випадку, швидше за все, опції ще не існує в таблиці wp_options, тому функція add_option() , щоб додати нову опцію. Так виходить тому що хук sanitize_optionвикликається до виклику функції add_option() і спрацьовує вдруге вже всередині add_option().

Помилка: ERROR: options page not found – пояснення та вирішення проблеми:

Така помилка виникає, коли фільтр whitelist_optionsнічого не знає про вашу нову опцію.

register_settings() додає дані до глобальної змінної $new_allowed_options . Потім ця змінна об’єднується зі змінною $whitelist_options в option_update_filter() , яка в свою чергу додає нові дані $new_allowed_options , де $option_group – використовується як індекс нових даних. Коли ви отримуєте помилку “ERROR: options page not found”, це означає, що не вдалося знайти опції по ключу.

ЗАМІТКА: До версії 5.5 опція $new_allowed_options називалася $new_whitelist_options .

Плутанина виходить, тому що перший аргумент $options_group використовується як ключ, а реальне порівняння у файлі options.php відбувається з параметром $options_page , який дорівнює $hook_suffix , що отримується з результату роботи функції add_submenu_page() .

Просте вирішення цієї проблеми, вказувати однакові назви для параметрів $option_group та $option_name .

Інша причина цієї помилки – коли неправильно вказано параметр $page при виклику функції:

add_settings_section( $id, $title, $callback, $page )

або

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

Примітка: $page повинен дорівнювати $menu_slug з функції:

add_theme_page( $page_title, $menu_title, $capability, $menu_slug, $function );

Використовується у зв’язку з іншими функціями API налаштувань :

Хуки з функції

Повертає

null. Нічого не вертає.

Використання

register_setting($option_group, $option_name, $args);
$option_group
(рядок) (обов’язковий)
Назва групи, до якої належатиме опція. Ця назва повинна збігатися з назвою групи у функції
settings_fields() .
$option_name
(рядок) (обов’язковий)
Назва опції, яка зберігатиметься у БД.
$args
(масив/рядок)

Дані опції, що реєструється (з версії 4.7).

До версії 4.7. Тут вказувалася коллбек функція: sanitize_callback , тобто. потрібно було вказувати рядок – назву функції, а тепер цей рядок вказується в однойменному елементі масиву. Попередній варіант підтримується, тобто. є обернена сумісність.

Якщо опцію не планується використовувати в REST API, можна вказати лише два елементи масиву sanitize_callbackі default.

$defaults = array(
	'sanitize_callback' => null,
	'default' => null,
	'type' => 'string',
	'group' => $option_group,
	'description' => '',
	'show_in_rest' => false,
);
  • sanitize_callback (рядок/масив)
    Назва функції зворотного виклику, яка оброблятиме значення опції перед збереженням.

    Важливо! Функція отримає один параметр – значення опції. Значення, яке вказана функція поверне, буде записано в опцію.

  • default (різне)
    Значення за промовчанням під час виклику get_option() .

    Впливає як на Options API (наприклад, get_option()), і REST API.

  • type (рядок) (REST API)
    Тип даних з якими опція асоційована. Можливі значення ‘string’, ‘boolean’, ‘integer’, ‘number’, ‘array’, ‘object’.

    Використовується тільки в API REST для визначення схеми та застосування відповідного очищення (sanitization).

    Має сенс тільки якщо show_in_rest=true. Тому show_in_rest=falseякщо параметр не встановлено, параметр можна не вказувати.

    Не впливає на роботу сторінок адмінки або те, як налаштування обробляється в API опцій. (Тобто, наприклад, можна встановити type=booleanі у формі при збереженні цієї опції передати рядок – через адмін-панель вказаний рядок збережеться у БД. Але в REST API при такому варіанті буде помилка.

  • description (рядок) (REST API)
    Опис даних, які зберігатимуться у цій опції.

    Використовується тільки в API REST, тому має сенс тільки якщо show_in_rest=true.

  • show_in_rest (логічний масив) (REST API)
    Чи потрібно додавати дані цієї опції в REST API.

    При реєстрації складних налаштувань цей аргумент може бути масивом, в якому можна використовувати ключ schema.

За замовчуванням: array()

Приклади

1

#1 Приклад показує, як потрібно підключати функцію через хук admin_init :

add_action( 'admin_init', 'register_my_setting');
function register_my_setting() {
	register_setting( 'my_options_group', 'my_option_name', 'intval');
}
0

#2 Інші приклади

Ще приклади дивіться в описі API опцій .

0

#3 Реєстрація опції (текстове поле), також і для REST API

Якщо реєстрація робиться і для сайту і для REST API, виклик функції потрібно повісити на обидва хуки admin_init . Якщо використовувати тільки хук admin_init, то в REST опція працювати не буде.

У цьому випадку опцію можна буде бачити при зверненнях до ендпоінту wp-json/wp/v2/settings.

add_action( 'admin_init', 'register_my_setting');
add_action( 'rest_api_init', 'register_my_setting');

function register_my_setting() {

	$ args = array (
		'sanitize_callback' => 'sanitize_text_field',
		'default' => '',
		'type' => 'string',
		'show_in_rest' => true,
	);

	register_setting( 'my_options_group', 'my_option_name', $args);
}
0

#4 Реєстрація опції тільки для REST API

add_action( 'rest_api_init', 'register_block_core_site_logo_setting', 10);

/**
 * Register a core site setting for a site logo
 */
function register_block_core_site_logo_setting() {

	register_setting( 'general', 'site_logo', [
		'show_in_rest' => array(
			'name' => 'site_logo',
		),
		'type' => 'integer',
		'description' => __( 'Site logo.' ),
	]);
}
0

#5 Опція типу масив у REST API

Якщо ви хочете зберегти масив у налаштуваннях, а також показати цей масив у кінцевій точці wp-json/wp/v2/settings, то потрібно вказати схему масиву в параметрі show_in_rest.

add_action( 'admin_init', 'wpdocs_foo_register_settings');
add_action( 'rest_api_init', 'wpdocs_foo_register_settings');

function wpdocs_foo_register_settings() {

	register_setting('general_setting', 'id');
	register_setting('general_setting', 'order');
	register_setting(
		'general_setting',
		'slider-data',
		array(
			'show_in_rest' => array(
				'name' => 'images_slide',
				'schema' => array(
					'type' => 'array',
					'items' => array(
						'id' => 'string',
						'order' => 'string',
					),
				),
			),
			'type' => 'array',
			'sanitize_callback' => array( $this, 'wpdocs_admin_post_save_data' ),
		)
	);
}
0

#6 Приклад для типів object та array:

register_setting(
	'dp_example_settings_group',
	'dp_example_array_settings',
	array(
		'type' => 'object',
		'default' => array(
			'A',
			'B',
			'C',
		),
		'show_in_rest' => array(
			'schema' => array(
				'type' => 'object',
				'items' => array(
					'type' => 'string',
				),
			),
		),
	)
);

register_setting(
	'dp_example_settings_group',
	'dp_example_object_settings',
	array(
		'type' => 'object',
		'default' => array(
			'some_str' => 'A',
			'some_int' => 3,
		),
		'show_in_rest' => array(
			'schema' => array(
				'type' => 'object',
				'properties' => array(
					'some_str' => array(
						'type' => 'string',
					),
					'some_int' => array(
						'type' => 'integer',
					),
				),
			),
		),
	)
);
-1

#7 Обробка, коли sanitize спрацьовує двічі

Як згадувалося в замітці вище sanitize може спрацювати двічі, коли опція вперше додається до БД. Тому, якщо є які-небудь критичні за продуктивністю моменти або інші моменти, які потрібно врахувати в цьому випадку, їх потрібно окремо обробити в sanitize функції.

add_action( 'admin_init', 'on_admin_init');

/*
 * Add custom options to whitelist, натиснувши valiated settings to be saved by form.
 */
function on_admin_init(): void
{
	register_setting( PLUGIN_SLUG, PLUGIN_SLUG, [ 'sanitize_callback' => 'my_sanitize_settings' ] );
}

/*
 * Sanitize the form input.
 */
function my_sanitize_settings( $input = NULL ):  
{
	// Detect multiple sanitizing passes.
	// Accomodates bug: https://core.trac.wordpress.org/ticket/21989
	static $pass_count = 0; $pass_count++;

	if ($pass_count <= 1) {
		// Handle any single-time / performane sensitive actions.

	}

	// Insert regular santizing code here.
}

Функція спрацьовує двічі тільки при першому збереженні налаштування та додаванні її до таблиці бази даних. Наступні оновлення налаштування виконують функцію sanitize_callback лише один раз. Так що якщо ви не виконуєте якусь дуже-дуже-дуже важку операцію з очищення, немає необхідності турбуватися про це.

нотатки

  • Global. Масив. $new_allowed_options
  • Global. Масив. $wp_registered_settings

список змін

З версії 2.7.0Введено.
З версії 3.0.0The misc option group був deprecated.
З версії 3.5.0Privacy option group був розбитий.
З версії 4.7.0$args може бути пройдено до набору flags on setting, similar to register_meta() .
З версії 5.5.0$new_whitelist_options був renamed to $new_allowed_options . Please consider writing more inclusive code.

Код register_setting() WP 6.0.2

function register_setting( $option_group, $option_name, $args = array() ) {
	Global $new_allowed_options, $wp_registered_settings;

	/*
	 * В 5.5.0, the $new_whitelist_options global variable був renamed to $new_allowed_options.
	 * Please consider writing more inclusive code.
	 */
	$GLOBALS['new_whitelist_options'] = &$new_allowed_options;

	$defaults = array(
		'type' => 'string',
		'group' => $option_group,
		'description' => '',
		'sanitize_callback' => null,
		'show_in_rest' => false,
	);

	// Back-compat: old sanitize callback is added.
	if ( is_callable( $args ) ) {
		$ args = array (
			'sanitize_callback' => $args,
		);
	}

	/**
	 * Filters the registration arguments коли registering a setting.
	 *
	 * @ Since 4.7.0
	 *
	 * @param array $args Array of setting registration arguments.
	 * @param array $defaults Array of default arguments.
	 * @param string $option_group Setting group.
	 * @param string $option_name Setting name.
	 */
	$args = apply_filters( 'register_setting_args', $args, $defaults, $option_group, $option_name );

	$ args = wp_parse_args ($ args, $ defaults);

	// Require an item schema when registering settings with array typ.
	if ( false !== $args['show_in_rest'] && 'array' === $args['type'] && ( ! is_array( $args['show_in_rest'] ) || ! isset( $args['show_in_rest) ']['schema']['items'] ) ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'When registering 'array' setting to show in the REST API, ви повинні визначати schema for each array item in 'show_in_rest.schema.items'.' ), '5.4.0.
	}

	if ( ! is_array( $wp_registered_settings ) ) {
		$wp_registered_settings = array();
	}

	if ( 'misc' === $option_group ) {
		_deprecated_argument(
			__FUNCTION__,
			'3.0.0',
			sprintf(
				/* translators: %s: misc */
				__( 'The "%s" options group has been removed. Use another settings group.' ),
				'misc'
			)
		);
		$option_group = 'general';
	}

	if ( 'privacy' === $option_group ) {
		_deprecated_argument(
			__FUNCTION__,
			'3.5.0',
			sprintf(
				/* translators: %s: privacy */
				__( 'The "%s" options group has been removed. Use another settings group.' ),
				'privacy'
			)
		);
		$option_group = 'reading';
	}

	$new_allowed_options[ $option_group ][] = $option_name;

	if ( ! empty( $args['sanitize_callback'] ) ) {
		add_filter( "sanitize_option_{$option_name}", $args['sanitize_callback'] );
	}
	if ( array_key_exists( 'default', $args ) ) {
		add_filter( "default_option_{$option_name}", 'filter_default_option', 10, 3);
	}

	/**
	 * Fires immediately before the setting is registered but after its filters are in place.
	 *
	 * @ Since 5.5.0
	 *
	 * @param string $option_group Setting group.
	 * @param string $option_name Setting name.
	 * @param array $args Array of setting registration arguments.
	 */
	do_action( 'register_setting', $option_group, $option_name, $args);

	$wp_registered_settings[ $option_name ] = $args;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *