Как я могу писать / читать и удалять вложенные массивы с помощью WordPress (PHP) - PullRequest
0 голосов
/ 09 января 2020

У меня немного проблемы с реализацией моего плана. Моя первоначальная ситуация выглядит следующим образом:

У меня есть массив с различным содержанием. В этом примере это выглядит так:

$tmp[ get_current_user_id() ] = array(
    'id'      => 5,
    'ref'     => true
);

Теперь я хочу сохранить этот массив под определенным ключом, используя функцию add_post_meta() в WordPress, которая работает до сих пор:

add_post_meta( $post_id, 'tmp', $tmp );

Как вы можете видеть выше, я взял текущий идентификатор пользователя для ключа массива. Если у меня теперь есть 2 записи в моем массиве, и я вывожу их, у меня будет следующая схема:

$tmp = get_post_meta( $post_id, 'tmp' );

error_log( print_r( $tmp, true ) );

----------------------------------------

Array
(
    [0] => Array
        (
            [32] => Array
                (
                    [id] => 10
                    [ref] => 
                )

        )
    [1] => Array
        (
            [44] => Array
                (
                    [id] => 20
                    [ref] =>
                )

        )
)

На данный момент, однако, я не буду продолжать дальше. Для меня теперь есть два вопроса:

  1. Как я могу получить доступ к правильному массиву, используя функцию get_current_user_id() (как мой ключ), не проходя через несколько циклов?
  2. Как можно Теперь я удаляю запись с идентификатором пользователя 44, чтобы мой массив выглядел так:

Результат после удаления:

Array
(
    [0] => Array
        (
            [32] => Array
                (
                    [id] => 10
                    [ref] => 
                )

        )
)

Есть функция delete_post_meta(), но я не знаю, как это должно работать с вложенными массивами. Я очень благодарен за любую помощь!

1 Ответ

1 голос
/ 09 января 2020

add_post_meta (https://developer.wordpress.org/reference/functions/add_post_meta/) имеет флаг $unique по умолчанию false. Это то, что вызывает внешний массив - каждый раз, когда вы добавляете новый массив из одного элемента с id и ref, он просто добавляется в список элементов в tmp.

Однако, если вы включите $unique, вы будете перезаписывать существующий массив каждый раз - что, я полагаю, тоже не то, что вы хотите. Поэтому вместо использования add_post_meta вы должны сделать следующее:

  1. получить tmp опубликовать мета и сохранить его в переменной
  2. добавить пару ID пользователя => значение в переменная
  3. использует 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...