WC_Admin_Settings::save_fields() │ public static │ WC 1.0
Save admin fields.
Loops through the woocommerce options array and outputs each field.
Method of the class: WC_Admin_Settings{}
Return
true|false
.
Usage
$result = WC_Admin_Settings::save_fields( $options, $data );
- $options(array) (required)
- Options array to output.
- $data(array)
- Data to use for saving.
Default: $_POST
WC_Admin_Settings::save_fields() WC Admin Settings::save fields code
WC 9.5.1
public static function save_fields( $options, $data = null ) {
if ( is_null( $data ) ) {
$data = $_POST; // WPCS: input var okay, CSRF ok.
}
if ( empty( $data ) ) {
return false;
}
// Options to update will be stored here and saved later.
$update_options = array();
$autoload_options = array();
// Loop options and get values to save.
foreach ( $options as $option ) {
if ( ! isset( $option['id'] ) || ! isset( $option['type'] ) || ( isset( $option['is_option'] ) && false === $option['is_option'] ) ) {
continue;
}
$option_name = $option['field_name'] ?? $option['id'];
// Get posted value.
if ( strstr( $option_name, '[' ) ) {
parse_str( $option_name, $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 {
$setting_name = '';
$raw_value = isset( $data[ $option_name ] ) ? wp_unslash( $data[ $option_name ] ) : 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_map( 'strval', 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, true ) ? $raw_value : $default;
break;
case 'relative_date_selector':
$value = wc_parse_relative_date_option( $raw_value );
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;
}
$autoload_options[ $option_name ] = isset( $option['autoload'] ) ? (bool) $option['autoload'] : true;
/**
* 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, $autoload_options[ $name ] ? 'yes' : 'no' );
}
return true;
}