acf_field_repeater::update_value() │ public │ ACF 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.
Список изменений
Код acf_field_repeater::update_value() 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;
}