register_setting()
Реєструє нову опцію та 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 Приклад показує, як потрібно підключати функцію через хук admin_init :
add_action( 'admin_init', 'register_my_setting'); function register_my_setting() { register_setting( 'my_options_group', 'my_option_name', 'intval'); }
#2 Інші приклади
Ще приклади дивіться в описі API опцій .
#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); }
#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.' ), ]); }
#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' ), ) ); }
#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', ), ), ), ), ) );
#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.0 | The misc option group був deprecated. |
З версії 3.5.0 | Privacy 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. |