add_post_meta
(https://developer.wordpress.org/reference/functions/add_post_meta/) имеет флаг $unique
по умолчанию false. Это то, что вызывает внешний массив - каждый раз, когда вы добавляете новый массив из одного элемента с id и ref, он просто добавляется в список элементов в tmp
.
Однако, если вы включите $unique
, вы будете перезаписывать существующий массив каждый раз - что, я полагаю, тоже не то, что вы хотите. Поэтому вместо использования add_post_meta
вы должны сделать следующее:
- получить
tmp
опубликовать мета и сохранить его в переменной - добавить пару ID пользователя => значение в переменная
- использует
update_post_meta
для перезаписи tmp
с измененным массивом
Для get_post_meta
, убедитесь, что для $single
установлено значение true (3-й аргумент) - в противном случае вы снова поместите его во внешний массив):
// step 1: retrieve current value of 'tmp' meta
$user_list = get_post_meta($post_id, 'tmp', true);
if ($user_list === false) { // meta wasn't set yet
$user_list = []; // initialize array
}
// step 2: set information for current user
$user_list[ get_current_user_id() ] = [ 'id' => 1337, 'ref' => '...'];
// step 3: overwrite 'tmp' post meta with updated array
update_post_meta($post_id, 'tmp', $user_list);
Чтобы затем удалить элемент, выполните следующее:
$user_list = get_post_meta($post_id, 'tmp', true);
if ($user_list === false) { // meta wasn't set yet
$user_list = []; // initialize array
}
// step 2: delete desired user using unset
$user_id_to_delete = 44;
unset($user_list[ $user_id_to_delete ]);
// step 3: overwrite 'tmp' post meta with updated array
update_post_meta($post_id, 'tmp', $user_list);
Чтение будет работать так (только при использовании * 1032) *):
$user_list = get_post_meta($post_id, 'tmp', true);
if ($user_list === false) { // meta wasn't set yet
$user_list = []; // initialize array
}
// iterate over all entries
foreach ($user_id => $user_info) {
echo "User $user_id: ".json_encode($user_info).'<br/>'.PHP_EOL;
}
// read a single user's entry:
$user_id = 32;
echo "User ${user_id}'s entry: ".json_encode( $user_list[$user_id] ).
'<br/>'.PHP_EOL;