'', 'widget_uid' => '', 'chat_enabled' => false); } public static function get() { $value = get_option('nakogda_settings', array()); $result = self::defaults(); if (!is_array($value)) { return $result; } foreach (array('organization_uid', 'widget_uid') as $key) { $uid = Embed_Parser::uid($value[$key] ?? ''); $result[$key] = is_wp_error($uid) ? '' : $uid; } $chat = self::boolean($value['chat_enabled'] ?? false); $result['chat_enabled'] = is_wp_error($chat) ? false : $chat; return $result; } public static function sanitize($input) { $previous = self::get(); if (!current_user_can('manage_options') || !is_array($input) || array_diff(array_keys($input), array_keys(self::defaults()))) { return self::reject($previous); } if (in_array(null, $input, true)) { return self::reject($previous); } $organization = Embed_Parser::uid($input['organization_uid'] ?? $previous['organization_uid']); $widget = Embed_Parser::uid($input['widget_uid'] ?? ($organization === $previous['organization_uid'] ? $previous['widget_uid'] : '')); $chat = self::boolean($input['chat_enabled'] ?? false); if (is_wp_error($organization) || is_wp_error($widget) || is_wp_error($chat)) { return self::reject($previous); } if ($organization !== $previous['organization_uid'] && $widget === $previous['widget_uid']) { $widget = ''; } return array('organization_uid' => $organization, 'widget_uid' => $widget, 'chat_enabled' => $chat); } public static function import() { if (!current_user_can('manage_options') || !isset($_POST['_nakogda_nonce']) || !is_string($_POST['_nakogda_nonce']) || !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['_nakogda_nonce'])), 'nakogda_import') ) { return new \WP_Error('nakogda_forbidden', __('Импорт отклонён. Проверьте права доступа и обновите страницу.', 'nakogda')); } // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Парсер проверяет исходный код подключения целиком и возвращает только проверенные UID. $result = Embed_Parser::parse(wp_unslash($_POST['nakogda_embed'] ?? null)); if (is_wp_error($result)) { return $result; } return array_merge(self::defaults(), $result); } public static function register() { register_setting('nakogda', 'nakogda_settings', array('type' => 'array', 'sanitize_callback' => array(self::class, 'sanitize'), 'default' => self::defaults(), 'show_in_rest' => false)); } public static function menu() { add_options_page(__('НаКогда — онлайн-запись и чат', 'nakogda'), __('НаКогда', 'nakogda'), 'manage_options', 'nakogda', array(self::class, 'page')); } public static function page() { if (!current_user_can('manage_options')) { wp_die(esc_html(__('Недостаточно прав для изменения настроек НаКогда.', 'nakogda'))); } $settings = self::get(); // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Признак отправки формы только выбирает обработчик, который проверяет nonce и права. if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['nakogda_import'])) { // Импорт показывает только нормализованные поля; сохранение требует отдельной формы. $result = self::import(); if (is_wp_error($result)) { add_settings_error('nakogda_settings', 'nakogda_import_error', $result->get_error_message()); } else { $settings = $result; add_settings_error('nakogda_settings', 'nakogda_import_preview', __('Код или ссылка распознаны. Проверьте UID и сохраните настройки, чтобы подключить НаКогда. Пока ничего не сохранено.', 'nakogda'), 'success'); } } ?>

·

[nakogda_booking] [nakogda_booking widget="UID"]