LLMS_Admin_Settings::save_fields( array $settings )

Save admin fields.


Description Description

Loops through a LifterLMS settings field options array and saves the values via update_option().


Top ↑

Parameters Parameters

$settings

(array) (Required) Opens array to output


Top ↑

Return Return

(boolean)


Top ↑

Source Source

File: includes/admin/class.llms.admin.settings.php

		// phpcs:disable WordPress.Security.NonceVerification.Missing -- nonce is checked in self::save().
		if ( empty( $_POST ) ) {
			return false;
		}

		// Options to update will be stored here.
		$update_options = array();

		// Loop options and get values to save.
		foreach ( $settings as $field ) {

			if ( ! isset( $field['id'] ) ) {
				continue;
			}

			$type = isset( $field['type'] ) ? sanitize_title( $field['type'] ) : '';

			// Remove secure options from the database.
			if ( isset( $field['secure_option'] ) && llms_get_secure_option( $field['secure_option'] ) ) {
				delete_option( $field['id'] );
				continue;
			}

			// Get the option name.
			$option_value = null;

			// Determines if the option value is an array.
			$is_array_option = false !== strpos( $field['id'], '[' );

			switch ( $type ) {

				case 'checkbox':
					if ( $is_array_option ) {
						$option_value = self::get_array_field_posted_value( $field['id'] ) ? 'yes' : 'no';
					} elseif ( isset( $_POST[ $field['id'] ] ) ) {
						$option_value = 'yes';
					} else {
						$option_value = 'no';
					}
					break;

				case 'textarea':
				case 'wpeditor':
					if ( isset( $_POST[ $field['id'] ] ) ) {
						$option_value = wp_kses_post( trim( llms_filter_input( INPUT_POST, $field['id'], FILTER_DEFAULT ) ) );
					} else {
						$option_value = '';
					}
					break;

				case 'password':
				case 'text':
				case 'email':
				case 'number':
				case 'select':
				case 'single_select_page':
				case 'single_select_membership':
				case 'radio':
				case 'hidden':
				case 'image':
					if ( $is_array_option ) {
						$option_value = self::get_array_field_posted_value( $field['id'] );
					} elseif ( isset( $_POST[ $field['id'] ] ) ) {
						$option_value = llms_filter_input_sanitize_string( INPUT_POST, $field['id'] );
					} else {
						$option_value = '';
					}

					if ( isset( $field['sanitize'] ) && 'slug' === $field['sanitize'] ) {
						$option_value = sanitize_title( $option_value );
					}

					break;

				case 'multiselect':
					if ( isset( $_POST[ $field['id'] ] ) ) {
						$option_value = llms_filter_input_sanitize_string( INPUT_POST, $field['id'], array( FILTER_REQUIRE_ARRAY ) );
					} else {
						$option_value = '';
					}
					break;

				default:
					/**
					 * Action run for external field types.
					 *
					 * @since Unknown
					 * @deprecated 7.0.0 Use `llms_update_option_{$type}` filter hook instead.
					 *
					 * @param type $arg Description.
					 */
					do_action_deprecated( "lifterlms_update_option_{$type}", array( $field ), '7.0.0' );

			}

			// Special treatment for the 'maxlength' attribute.
			if ( in_array( $type, array( 'text', 'textarea' ), true ) && isset( $field['custom_attributes']['maxlength'] ) ) {
				$option_value = llms_trim_string( $option_value, (int) $field['custom_attributes']['maxlength'], '' );
			}

			/**
			 * Filters the value of a settings field after it has been parsed and sanitized
			 * and before it is saved to the database.
			 *
			 * The dynamic portion of this hook, `{$type}` refers to the setting field type:
			 * email, text, checkbox, etc...
			 *
			 * @since 7.0.0
			 *
			 * @param string|null $option_value The sanitized option value or `null`.
			 * @param array       $field        The settings field array.
			 */
			$option_value = apply_filters( "llms_update_option_{$type}", $option_value, $field );

			if ( ! is_null( $option_value ) ) {

				if ( $is_array_option ) {

					parse_str( $field['id'], $option_array );

					// Option name is first key.
					$option_name = current( array_keys( $option_array ) );

					// Get old option value.
					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();
					}

					// Set keys and value.
					$key = key( $option_array[ $option_name ] );

					$update_options[ $option_name ][ $key ] = $option_value;

				} else {
					$update_options[ $field['id'] ] = $option_value;
				}
			}

			/**
			 * Action run prior to the update of a LifterLMS setting field option.
			 *
			 * An update isn't guaranteed after this action if the method's logic can't
			 * find a valid posted valued to persist to the database.
			 *
			 * @since Unknown
			 *
			 * @param array $field The admin setting field array to be updated.
			 */
			do_action( 'lifterlms_update_option', $field );

		}

		// Now save the options.
		foreach ( $update_options as $name => $value ) {
			update_option( $name, $value );
		}

		// phpcs:enable WordPress.Security.NonceVerification.Missing

		return true;

	}



Top ↑

Changelog Changelog

Changelog
Version Description
7.0.0 Add handling for array fields for standard input types. Account for the maxlength input text and textarea attribute.
5.9.0 Stop using deprecated FILTER_SANITIZE_STRING.
3.35.2 Don't strip tags on editor and textarea fields that allow HTML.
3.35.0 Sanitize $_POST data.
3.29.0 Unknown.
1.0.0 Introduced.

Top ↑

User Contributed Notes User Contributed Notes

You must log in before being able to contribute a note or feedback.