public static function save_fields($options, $data = null)
{
if (is_null($data)) {
$data = $_POST;
}
if (empty($data)) {
return false;
}
// Options to update will be stored here and saved later.
$update_options = array();
// Loop options and get values to save.
foreach ($options as $option) {
if (!isset($option['id']) || !isset($option['type'])) {
continue;
}
// Get posted value.
if (strstr($option['id'], '[')) {
parse_str($option['id'], $option_name_array);
$option_name = current(array_keys($option_name_array));
$setting_name = key($option_name_array[$option_name]);
$raw_value = isset($data[$option_name][$setting_name]) ? wp_unslash($data[$option_name][$setting_name]) : null;
} else {
$option_name = $option['id'];
$setting_name = '';
$raw_value = isset($data[$option['id']]) ? wp_unslash($data[$option['id']]) : null;
}
// Format the value based on option type.
switch ($option['type']) {
case 'checkbox':
$value = '1' === $raw_value || 'yes' === $raw_value ? 'yes' : 'no';
break;
case 'textarea':
$value = wp_kses_post(trim($raw_value));
break;
case 'multiselect':
case 'multi_select_countries':
$value = array_filter(array_map('wc_clean', (array) $raw_value));
break;
case 'image_width':
$value = array();
if (isset($raw_value['width'])) {
$value['width'] = wc_clean($raw_value['width']);
$value['height'] = wc_clean($raw_value['height']);
$value['crop'] = isset($raw_value['crop']) ? 1 : 0;
} else {
$value['width'] = $option['default']['width'];
$value['height'] = $option['default']['height'];
$value['crop'] = $option['default']['crop'];
}
break;
case 'select':
$allowed_values = empty($option['options']) ? array() : array_keys($option['options']);
if (empty($option['default']) && empty($allowed_values)) {
$value = null;
break;
}
$default = empty($option['default']) ? $allowed_values[0] : $option['default'];
$value = in_array($raw_value, $allowed_values) ? $raw_value : $default;
break;
default:
$value = wc_clean($raw_value);
break;
}
/**
* Fire an action when a certain 'type' of field is being saved.
* @deprecated 2.4.0 - doesn't allow manipulation of values!
*/
if (has_action('woocommerce_update_option_' . sanitize_title($option['type']))) {
wc_deprecated_function('The woocommerce_update_option_X action', '2.4.0', 'woocommerce_admin_settings_sanitize_option filter');
do_action('woocommerce_update_option_' . sanitize_title($option['type']), $option);
continue;
}
/**
* Sanitize the value of an option.
* @since 2.4.0
*/
$value = apply_filters('woocommerce_admin_settings_sanitize_option', $value, $option, $raw_value);
/**
* Sanitize the value of an option by option name.
* @since 2.4.0
*/
$value = apply_filters("woocommerce_admin_settings_sanitize_option_{$option_name}", $value, $option, $raw_value);
if (is_null($value)) {
continue;
}
// Check if option is an array and handle that differently to single values.
if ($option_name && $setting_name) {
if (!isset($update_options[$option_name])) {
$update_options[$option_name] = get_option($option_name, array());
}
if (!is_array($update_options[$option_name])) {
$update_options[$option_name] = array();
}
$update_options[$option_name][$setting_name] = $value;
} else {
$update_options[$option_name] = $value;
}
/**
* Fire an action before saved.
* @deprecated 2.4.0 - doesn't allow manipulation of values!
*/
do_action('woocommerce_update_option', $option);
}
// Save all options in our array.
foreach ($update_options as $name => $value) {
update_option($name, $value);
}
return true;
}