acf_field_repeater::update_value()publicACF 3.6

Filters the $value before it is updated in the database.

Метод класса: acf_field_repeater{}

Хуков нет.

Возвращает

Разное. $value

Использование

$acf_field_repeater = new acf_field_repeater();
$acf_field_repeater->update_value( $value, $post_id, $field );
$value(разное) (обязательный)
The value which will be saved in the database.
$post_id(разное) (обязательный)
The $post_id of which the value will be saved.
$field(массив) (обязательный)
The field array holding all the field options.

Список изменений

С версии 3.6 Введена.

Код acf_field_repeater::update_value() ACF 6.0.4

function update_value( $value, $post_id, $field ) {
	// Bail early if no sub fields.
	if ( empty( $field['sub_fields'] ) ) {
		return $value;
	}

	if ( ! is_array( $value ) ) {
		$value = array();
	}

	if ( isset( $value['acfcloneindex'] ) ) {
		unset( $value['acfcloneindex'] );
	}

	$new_value = 0;
	$old_value = (int) acf_get_metadata( $post_id, $field['name'] );

	if ( ! empty( $field['pagination'] ) && did_action( 'acf/save_post' ) && ! isset( $_POST['_acf_form'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Value not used.
		$old_rows       = acf_get_value( $post_id, $field );
		$old_rows       = is_array( $old_rows ) ? $old_rows : array();
		$edited_rows    = array();
		$deleted_rows   = array();
		$reordered_rows = array();
		$new_rows       = array();

		// Categorize the submitted values, so we know what to do with them.
		foreach ( $value as $key => $row ) {
			if ( ! is_array( $row ) ) {
				continue;
			}

			// Check if this is a new row.
			if ( false === strpos( $key, 'row' ) ) {
				unset( $row['acf_changed'] );

				// Check if this new row was inserted before an existing row.
				$reordered_row_num = isset( $row['acf_reordered'] ) ? (int) $row['acf_reordered'] : false;

				if ( false !== $reordered_row_num && $reordered_row_num <= $old_value ) {
					$reordered_rows[ $key ] = $reordered_row_num;
				} else {
					$new_rows[ $key ] = $row;
				}

				continue;
			}

			$row_num = (int) str_replace( 'row-', '', $key );

			if ( isset( $row['acf_deleted'] ) ) {
				$deleted_rows[] = $row_num;
			} elseif ( isset( $row['acf_reordered'] ) ) {
				$reordered_rows[ $row_num ] = (int) $row['acf_reordered'];
			} else {
				unset( $row['acf_changed'] );
				$edited_rows[ $row_num ] = $row;
			}
		}

		// Process any row deletions first, but don't remove their keys yet.
		foreach ( $deleted_rows as $deleted_row ) {
			$this->delete_row( $deleted_row, $field, $post_id );
			$old_rows[ $deleted_row ] = 'acf_deleted';
		}

		// Update any existing rows that were edited.
		foreach ( $edited_rows as $key => $row ) {
			if ( array_key_exists( $key, $old_rows ) ) {
				$old_rows[ $key ] = $row;
			}
		}

		$rows_to_move     = array();
		$new_rows_to_move = array();
		foreach ( $reordered_rows as $old_order => $new_order ) {
			if ( is_int( $old_order ) ) {
				$rows_to_move[ $new_order ][] = $value[ 'row-' . $old_order ];
				unset( $old_rows[ $old_order ] );
			} else {
				$new_rows_to_move[ $new_order ][] = $value[ $old_order ];
			}
		}

		// Iterate over existing moved rows first.
		if ( ! empty( $rows_to_move ) ) {
			ksort( $rows_to_move );
			foreach ( $rows_to_move as $key => $values ) {
				array_splice( $old_rows, $key, 0, $values );
			}
		}

		// Iterate over inserted/duplicated rows in reverse order, so they're inserted into the correct spot.
		if ( ! empty( $new_rows_to_move ) ) {
			krsort( $new_rows_to_move );
			foreach ( $new_rows_to_move as $key => $values ) {
				array_splice( $old_rows, $key, 0, $values );
			}
		}

		// Append any new rows.
		foreach ( $new_rows as $new_row ) {
			$old_rows[] = $new_row;
		}

		// Update the rows in the database.
		$new_row_num = 0;
		foreach ( $old_rows as $key => $row ) {
			if ( 'acf_deleted' === $row ) {
				unset( $old_rows[ $key ] );
				continue;
			}

			$this->update_row( $row, $new_row_num, $field, $post_id );
			$new_row_num++;
		}

		// Calculate the total number of rows that will be saved after this update.
		$new_value = count( $old_rows );
	} else {
		$i = -1;

		foreach ( $value as $row ) {
			$i++;

			// Bail early if no row.
			if ( ! is_array( $row ) ) {
				continue;
			}

			$this->update_row( $row, $i, $field, $post_id );
			$new_value++;
		}
	}

	// Remove old rows.
	if ( $old_value > $new_value ) {
		for ( $i = $new_value; $i < $old_value; $i++ ) {
			$this->delete_row( $i, $field, $post_id );
		}
	}

	// Save empty string for empty value.
	if ( empty( $new_value ) ) {
		$new_value = '';
	}

	return $new_value;
}