Automattic\WooCommerce\Internal\Admin\Settings

SettingsUISchema::canonicalize_option_valuespublic staticWC 11.0.0

Canonicalize option values supplied by native Settings UI schema providers.

Schemas built from legacy settings always carry string option values, but native providers can supply any scalar. The client matches options against the stored value with strict string comparison, so scalar option values, the selected values they match, and visibility values compared against them are cast here to the string the client's own String() coercion produces. Malformed entries remain unchanged for the provider to fix.

Method of the class: SettingsUISchema{}

No Hooks.

Returns

Array. Schema with scalar option values canonicalized to strings.

Usage

$result = SettingsUISchema::canonicalize_option_values( $schema ): array;
$schema(array) (required)
Settings UI schema.

Changelog

Since 11.0.0 Introduced.

SettingsUISchema::canonicalize_option_values() code WC 11.0.1

public static function canonicalize_option_values( array $schema ): array {
	if ( ! isset( $schema['groups'] ) || ! is_array( $schema['groups'] ) ) {
		return $schema;
	}

	$converted_fields = array();
	$option_field_ids = array();

	foreach ( $schema['groups'] as &$group ) {
		if ( ! is_array( $group ) || ! isset( $group['fields'] ) || ! is_array( $group['fields'] ) ) {
			continue;
		}

		foreach ( $group['fields'] as &$field ) {
			if (
				! is_array( $field ) ||
				! isset( $field['id'], $field['options'] ) ||
				! is_string( $field['id'] ) ||
				! is_array( $field['options'] )
			) {
				continue;
			}

			$option_field_ids[] = $field['id'];
			$converted          = false;

			foreach ( $field['options'] as &$option ) {
				if (
					! is_array( $option ) ||
					! array_key_exists( 'value', $option ) ||
					is_string( $option['value'] ) ||
					! is_scalar( $option['value'] )
				) {
					continue;
				}

				$option['value'] = self::to_canonical_string( $option['value'] );
				$converted       = true;
			}
			unset( $option );

			if ( array_key_exists( 'value', $field ) ) {
				if ( is_scalar( $field['value'] ) && ! is_string( $field['value'] ) ) {
					$field['value'] = self::to_canonical_string( $field['value'] );
					$converted      = true;
				} elseif ( is_array( $field['value'] ) ) {
					$canonical_list = self::canonicalize_scalar_list( $field['value'] );
					if ( null !== $canonical_list ) {
						$field['value'] = $canonical_list;
						$converted      = true;
					}
				}
			}

			if ( $converted ) {
				$converted_fields[] = $field['id'];
			}
		}
		unset( $field );
	}
	unset( $group );

	foreach ( $schema['groups'] as &$group ) {
		if ( ! is_array( $group ) || ! isset( $group['fields'] ) || ! is_array( $group['fields'] ) ) {
			continue;
		}

		foreach ( $group['fields'] as &$field ) {
			if ( ! is_array( $field ) || ! isset( $field['id'] ) || ! is_string( $field['id'] ) ) {
				continue;
			}

			if ( ! self::is_canonicalizable_visibility_rule( $field['visibility'] ?? null, $option_field_ids ) ) {
				continue;
			}

			$rule_value = $field['visibility']['value'];

			if ( is_scalar( $rule_value ) && ! is_string( $rule_value ) ) {
				$field['visibility']['value'] = self::to_canonical_string( $rule_value );
				$converted_fields[]           = $field['id'];
			} elseif ( is_array( $rule_value ) ) {
				$canonical_list = self::canonicalize_scalar_list( $rule_value );
				if ( null !== $canonical_list ) {
					$field['visibility']['value'] = $canonical_list;
					$converted_fields[]           = $field['id'];
				}
			}
		}
		unset( $field );
	}
	unset( $group );

	if ( ! empty( $converted_fields ) ) {
		wc_doing_it_wrong(
			__METHOD__,
			sprintf(
				/* translators: %s: comma-separated field ids. */
				esc_html__( 'A Settings UI schema provider supplied non-string option, field, or visibility values that WooCommerce converted for compatibility: %s. Update the provider to supply string values.', 'woocommerce' ),
				esc_html( implode( ', ', array_unique( $converted_fields ) ) )
			),
			'11.0.0'
		);
	}

	return $schema;
}