Automattic\WooCommerce\Internal\Admin\Settings

SettingsUISchema::from_legacy_settingspublic staticWC 10.9.0

Build a schema from a legacy WC settings array.

Method of the class: SettingsUISchema{}

No Hooks.

Returns

Array.

Usage

$result = SettingsUISchema::from_legacy_settings( $page_id, $section, $title, $settings, $default_save_adapter ): array;
$page_id(string) (required)
Settings page id.
$section(string) (required)
Section id. Empty string means the default section.
$title(string) (required)
Page title.
$settings(array) (required)
Legacy settings definitions.
$default_save_adapter(string)
Default save adapter.
Default: 'form_post'

Changelog

Since 10.9.0 Introduced.

SettingsUISchema::from_legacy_settings() code WC 10.9.1

public static function from_legacy_settings( string $page_id, string $section, string $title, array $settings, string $default_save_adapter = 'form_post' ): array {
	$groups                = array();
	$current_group         = null;
	$current_id            = null;
	$group_index           = 0;
	$visibility_controller = null;

	foreach ( $settings as $setting ) {
		if ( ! is_array( $setting ) ) {
			continue;
		}

		$type = isset( $setting['type'] ) && is_string( $setting['type'] ) ? $setting['type'] : 'text';

		if ( 'title' === $type ) {
			$visibility_controller = null;
			if ( $current_group && $current_id ) {
				$groups[ $current_id ] = $current_group;
			}

			$current_id    = isset( $setting['id'] ) && is_scalar( $setting['id'] ) && '' !== (string) $setting['id']
				? (string) $setting['id']
				: 'group_' . $group_index;
			$current_group = array(
				'id'          => $current_id,
				'title'       => isset( $setting['title'] ) && is_scalar( $setting['title'] ) ? html_entity_decode( (string) $setting['title'], ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 ) : '',
				'description' => isset( $setting['desc'] ) && is_scalar( $setting['desc'] ) ? wp_kses_post( (string) $setting['desc'] ) : '',
				'actions'     => self::get_group_actions( $setting ),
				'order'       => isset( $setting['order'] ) ? (int) $setting['order'] : $group_index,
				'fields'      => array(),
			);
			++$group_index;
			continue;
		}

		if ( 'sectionend' === $type ) {
			$visibility_controller = null;
			if ( $current_group && $current_id ) {
				$groups[ $current_id ] = $current_group;
			}
			$current_group = null;
			$current_id    = null;
			continue;
		}

		if ( empty( $setting['id'] ) ) {
			continue;
		}

		if ( ! $current_group ) {
			$current_id    = self::DEFAULT_GROUP_ID;
			$current_group = self::get_default_group( $group_index );
			++$group_index;
		}

		$field = self::transform_legacy_field( $setting, $default_save_adapter, $visibility_controller );
		if ( $field ) {
			$current_group['fields'][] = $field;
		}

		if ( 'checkbox' === $type && 'option' === ( $setting['show_if_checked'] ?? null ) ) {
			$visibility_controller = $field['id'] ?? null;
		}

		if ( 'end' === ( $setting['checkboxgroup'] ?? null ) ) {
			$visibility_controller = null;
		}
	}

	if ( $current_group && $current_id ) {
		$groups[ $current_id ] = $current_group;
	}

	uasort(
		$groups,
		static function ( array $a, array $b ): int {
			return ( $a['order'] ?? 999 ) <=> ( $b['order'] ?? 999 );
		}
	);

	foreach ( $groups as $group_id => $group ) {
		unset( $group['order'] );
		$groups[ $group_id ] = $group;
	}

	$decoded_title = html_entity_decode( $title, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 );

	return array(
		'id'      => $page_id,
		'title'   => $decoded_title,
		'section' => '' === $section ? self::DEFAULT_GROUP_ID : $section,
		'save'    => array(
			'adapter' => $default_save_adapter,
		),
		'shell'   => array(
			'title' => $decoded_title,
		),
		'groups'  => $groups,
	);
}