: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
* Validate field ID for repeater field.
* @param mixed $field_id Field ID.
function wpforms_validate_field_id( $field_id ) {
wpforms_is_repeater_child_field( $field_id ) ?
preg_replace( '/[^0-9_]/', '', $field_id ) :
* Check if field ID is a repeater field.
* @param int|string|array $field Field.
function wpforms_is_repeater_child_field( $field ): bool {
$field_id = (string) ( is_array( $field ) ? $field['id'] : $field );
$pattern = '/^(\d+_\d+)(_\d+)*$/';
return preg_match( $pattern, $field_id ) === 1;
* Get repeater field IDs.
* @param int|string|array $field Field ID.
function wpforms_get_repeater_field_ids( $field ): array {
$field_id = (string) ( is_array( $field ) ? $field['id'] : $field );
list( $original_id, $index_id ) = explode( '_', $field_id );
return compact( 'original_id', 'index_id' );
* Get the correct value for field with raw value available.
* @param array $field Entry field.
* @param array $form_data Form data and settings.
function wpforms_get_choices_value( array $field, array $form_data ): string {
$show_values = ! empty( $form_data['fields'][ $field['id'] ]['show_values'] );
$is_dynamic = ! empty( $field['dynamic'] );
$value = $field['value'];
if ( ! wpforms_is_empty_string( $field['value_raw'] ) && $show_values && ! $is_dynamic ) {
$value = $field['value_raw'];
$value = $field['value_raw'] ?? ( $field['value'] ?? '' );
* Determine if the field was repeated.
* @param int $field_id Field ID.
* @param array $fields List of fields.
function wpforms_is_repeated_field( int $field_id, array $fields ): bool {
$prefix = $field_id . '_';
foreach ( $fields as $key => $field ) {
if ( strpos( $key, $prefix ) === 0 ) {