Automattic\WooCommerce\Internal\RestApi\Routes\V4\Settings\PaymentGateways\Schema
AbstractPaymentGatewaySettingsSchema::build_fields_from_form_fields
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() 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;
}