Automattic\WooCommerce\Internal\RestApi\Routes\V4\Settings\PaymentGateways\Schema

AbstractPaymentGatewaySettingsSchema::build_fields_from_form_fieldsprotectedWC 1.0

Build fields array from gateway form_fields with design-aligned overrides.

Iterates the gateway's form_fields to build the schema fields list. Known core fields use the provided overrides for labels and descriptions. Extension-injected fields are preserved and transformed to schema format. The 'order' field (display position) is always appended as it does not come from form_fields.

Method of the class: AbstractPaymentGatewaySettingsSchema{}

No Hooks.

Returns

Array. Schema fields list.

Usage

// protected - for code of main (parent) or child class
$result = $this->build_fields_from_form_fields( $gateway, $core_field_overrides, $skip_field_ids ): array;
$gateway(WC_Payment_Gateway) (required)
Gateway instance.
$core_field_overrides(array) (required)
Map of field_id => array( 'label', 'type', 'desc' ).
$skip_field_ids(array)
Field IDs to skip (e.g., special fields handled elsewhere).
Default: array()

AbstractPaymentGatewaySettingsSchema::build_fields_from_form_fields() code WC 10.7.0

protected function build_fields_from_form_fields( WC_Payment_Gateway $gateway, array $core_field_overrides, array $skip_field_ids = array() ): array {
	$fields = array();

	// Add core fields in the order defined by overrides first.
	foreach ( $core_field_overrides as $field_id => $override ) {
		// The 'order' field is synthetic (not in form_fields), always add it from overrides.
		if ( 'order' === $field_id ) {
			$fields[] = array_merge( array( 'id' => $field_id ), $override );
			continue;
		}

		if ( ! isset( $gateway->form_fields[ $field_id ] ) ) {
			continue;
		}

		$field        = $gateway->form_fields[ $field_id ];
		$schema_field = array_merge( array( 'id' => $field_id ), $override );

		// Preserve options from form_fields for select/multiselect fields.
		if ( in_array( $schema_field['type'] ?? '', array( 'select', 'multiselect' ), true ) && ! isset( $schema_field['options'] ) ) {
			if ( ! empty( $field['options'] ) ) {
				$schema_field['options'] = $field['options'];
			}
		}

		$fields[] = $schema_field;
	}

	// Append any extension-injected fields not in core overrides or skip list.
	foreach ( $gateway->form_fields as $field_id => $field ) {
		$field_type = $field['type'] ?? '';

		// Skip non-data fields, already-handled core fields, and explicitly skipped fields.
		if ( in_array( $field_type, array( 'title', 'sectionend' ), true ) ||
			isset( $core_field_overrides[ $field_id ] ) ||
			in_array( $field_id, $skip_field_ids, true ) ||
			$this->is_special_field( $field_id ) ) {
			continue;
		}

		$fields[] = $this->transform_field_to_schema( $field_id, $field, $gateway );
	}

	return $fields;
}