static function update($show_warning_in_admin = false) { // Получаем полностью все настройки + дефолтные на 100% $settings = get_option(\Korobochkin\CurrencyConverter\Models\Settings\General::$option_name, array()); $settings = wp_parse_args($settings, \Korobochkin\CurrencyConverter\Models\Settings\General::get_defaults()); $providers_obj = \Korobochkin\CurrencyConverter\Models\DataProviders::getInstance(); $providers = $providers_obj->get_providers(); if (array_key_exists($settings['data_provider_name'], $providers)) { $api = new \Korobochkin\CurrencyConverter\API\API($providers[$settings['data_provider_name']]); self::$newRates = $api->get_rates(); if (!is_wp_error(self::$newRates)) { update_option(\Korobochkin\CurrencyConverter\Plugin::NAME . '_rates', self::$newRates); $settings['rates_available'] = true; $settings['cached_rates_by_data_provider_name'] = $settings['data_provider_name']; $result = update_option(\Korobochkin\CurrencyConverter\Models\Settings\General::$option_name, $settings); return true; } } return false; }
public static function render() { $options = get_option(\Korobochkin\CurrencyConverter\Models\Settings\General::$option_name, array()); $options = wp_parse_args($options, \Korobochkin\CurrencyConverter\Models\Settings\General::get_defaults()); $providersObj = \Korobochkin\CurrencyConverter\Models\DataProviders::getInstance(); $providers = $providersObj->get_providers(); ?> <select id="<?php echo Plugin::NAME; ?> __[data_provider_name]" name="<?php echo Plugin::NAME; ?> [data_provider_name]"> <?php foreach ($providers as $provider) { printf('<option value="%1$s" %2$s %3$s>%4$s</option>', esc_attr($provider['abbreviated_name']), selected($provider['abbreviated_name'], $options['data_provider_name'], false), disabled($provider['active'], false, false), esc_html($provider['name'])); } ?> </select> <?php }
/** * Санитайзинг срабатывает каждый раз, когда вызывается update_option(), * а не только когда сохранются настройки, поэтому надо чистить входные значения, * иначе при update_option() мы затираем настройки (при сохранении приходит лишь 1 значение, * а при update_option() могут прийти все значения. * * Способом, которым мы тут фильтруем, невозможно выкинуть старые настройки — они всегда остаются в опции, * если когда-либо в нее попали. * * @param mixed $values New options. * * @return array New options merged with old (current) options. */ public static function sanitize($values) { /** * Идея фикс. * 1) Получаем опции из БД (какие есть). * 2) Мерджим их с дефолтными (тем самым дополняя к бдшным те, что появились в новой версии плагина и т п). * 3) Мерджим отфильтрованные опции с теми, что получили в пункте 2). * * Проблема: если мы не выполняем сохранение настроек, то при обновлении структуры опций есть шанс опять иметь в БД не все дефолтные настройки. */ // Получаем настройки из бд и добавляем к ним дефолтные $current_options = get_option(\Korobochkin\CurrencyConverter\Models\Settings\General::$option_name, array()); $current_options = wp_parse_args($current_options, \Korobochkin\CurrencyConverter\Models\Settings\General::get_defaults()); if (isset($values['data_provider_name'])) { $providers = \Korobochkin\CurrencyConverter\Models\DataProviders::getInstance()->get_providers(); if (!array_key_exists($values['data_provider_name'], $providers)) { $values['data_provider_name'] = $current_options['data_provider_name']; //$filtered_values['data_provider_name'] = sanitize_text_field( $values['data_provider_name'] ); } } // Соединяем дефолотные + текущие с теми, что были введены сейчас $values = wp_parse_args($values, $current_options); return $values; }