WP Сохранение новых значений массива в wp_postmeta
Есть задача хранить значения списка ID зарегистрированных пользователей которым понравился пост. (*Если пользователю нравиться пост, он жмет кнопку которая добавляет его ID в ячейку БД, если её до этого не было там). Один и тот же пользователь должен иметь возможность только раз быть в этом массиве.
Понимаю, что это реализуется при помощи двух методов. update_post_meta() и get_post_meta() Вопрос, как контролировать перезапись данных, а точнее $prev_value?
Код:
function addRatingForPost()
{
if (empty($_POST['postId']) || !isset($_POST['currentUserId'])) wp_send_json(['error' => __('Wrong Data', 'users_rating')]);
$post_id = (int)$_POST['postId']; // ID поста
$current_user_id = (int)$_POST['currentUserId']; // ID пользователя которому понравился пост
$data = get_post_meta( $post_id, 'positive_users_reaction', true );
if( ! $data ){
$data = [];
}
$data[] = $current_user_id;
update_post_meta($post_id, 'positive_users_reaction', $data);
wp_die();
}
Код записывает пользователей в объект, но как-то странно. После первого захода, в ячейку массива записало a:1:{i:0;i:1;} после второго пользователя с другим ID в ячейке уже было - a:2:{i:0;i:1;i:1;i:4;} после третьего пользователя a:3:{i:0;i:1;i:1;i:4;i:2;i:3;} Может чего не понимаю, но это не очень похоже на стандартные объект php . Ещё не понятно как реализовывать проверку, что б туда не попадало повторное значение ID уже проголосовавшего.
Ответы (1 шт):
Всё верно - в метаданные записывается сериалиазованный массив (см. функцию php serialize()). После третьего пользователя строка a:3:{i:0;i:1;i:1;i:4;i:2;i:3;} означает сериализованный массив из трёх элементов
[
0 => 1,
1 => 4,
2 => 3
]
Для удаления повторяющихся значений массива надо использовать функцию array_unique(). Вот слегка изменённый ваш код:
function addRatingForPost() {
if ( empty( $_POST['postId'] ) || ! isset( $_POST['currentUserId'] ) ) {
wp_send_json( [ 'error' => __( 'Wrong Data', 'users_rating' ) ] );
}
$post_id = (int) $_POST['postId']; // ID поста
$current_user_id = (int) $_POST['currentUserId']; // ID пользователя которому понравился пост
$data = get_post_meta( $post_id, 'positive_users_reaction', true );
if ( ! $data ) {
$data = [];
}
$data[] = $current_user_id;
$data = array_unique( $data );
update_post_meta( $post_id, 'positive_users_reaction', $data );
wp_die();
}